节点是否真的不支持逐行读取?

时间:2014-05-13 21:40:22

标签: node.js

我正在节点中编写UNIX cat的克隆。我没有得到的一件事是为什么没有正确的方法来逐行读取文件。我查看了声称提供这些功能的各种模块,但在引擎盖下它们都是这样做的:

var lines = s.split(/\r\n|\n|\r/);

(取自节点的readline)。

虽然这确实有效,但这是一个糟糕的解决方案,浪费了大量资源。但为什么节点不支持这样的基本用例呢?或者它,我只是忽略了什么?

1 个答案:

答案 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)

您会注意到它会在删除换行符的情况下吐出相应的文件。