我正在节点中编写UNIX cat
的克隆。我没有得到的一件事是为什么没有正确的方法来逐行读取文件。我查看了声称提供这些功能的各种模块,但在引擎盖下它们都是这样做的:
var lines = s.split(/\r\n|\n|\r/);
(取自节点的readline)。
虽然这确实有效,但这是一个糟糕的解决方案,浪费了大量资源。但为什么节点不支持这样的基本用例呢?或者它,我只是忽略了什么?
答案 0 :(得分:1)
你可以自己滚动它而不会有太多麻烦。最好的方法是使用streams。您可以使用以下命令获取文件流:
fs.createReadStream(filename)
现在,我们将定义一种将输入分为行的Transform
类型:
class LineBreak extends stream.Transform
constructor: ->
@_rem = "\n"
super
_transform: (chunk, encoding, next) ->
@_rem += chunk.toString()
while (ixNewline = @_rem.indexOf('\n', 1)) > 0
@push(@_rem.slice(1, ixNewline))
@_rem = @_rem.slice(ixNewline)
next()
_flush: (next) ->
if @_rem.length > 0
@push(@_rem.slice(1))
next()
这是CoffeeScript,我写作更舒服。编译的JavaScript很冗长,并不是特别惯用,但您可以轻松地编译它here。但是,我认为CoffeeScript版本可以解决问题。
使用示例:
lb = new LineBreak()
file.pipe(lb).pipe(process.stdout)
您会注意到它会在删除换行符的情况下吐出相应的文件。