如何重置nodejs流?

时间:2016-05-02 10:26:09

标签: node.js stream fs

如何重置nodejs流? 如何在nodejs中再次读取流? 提前谢谢!

var fs = require('fs');
var lineReader = require('line-reader');

// proxy.txt = only 3 lines

var readStream = fs.createReadStream('proxy.txt');
lineReader.open(readStream, function (err, reader) {
    for(var i=0; i<6; i++) {
        reader.nextLine(function(err, line) {
            if(err) {
                readStream.reset(); // ???
            } else {
                console.log(line);
            }
        });
    }
});

1 个答案:

答案 0 :(得分:7)

有两种方法可以解决您的问题,因为有人评论过您可以简单地将所有内容包装在一个函数中而不是重置 - 只需再次读取文件即可。

Ofc这对于HTTP请求不起作用,例如另一方面,只要你考虑更大的内存使用量,你就可以简单地累积你的数据。

你需要的是实现某种“可重绕的流” - 这意味着你基本上需要实现一个转换流,它将保留所有缓冲区的列表,并将它们写入一个管道流。倒带方法。

看看这里的node API for streams,方法应该看起来像这样。

class Rewindable extends Transform {

  constructor() {
    super();
    this.accumulator = [];
  }

  _transform(buf, enc, cb) { 
    this.accumulator.push(buf);
    callback()
  }

  rewind() {
    var stream = new PassThrough();
    this.accumulator.forEach((chunk) => stream.write(chunk))
    return stream;
  }

你可以这样使用:

var readStream = fs.createReadStream('proxy.txt');
var rewindableStream = readStream.pipe(new Rewindable());

(...).on("whenerver-you-want-to-reset", () => {
    var rewound = rewindablesteram.rewind();
    /// and do whatever you like with your stream.
});

其实我想我会把它添加到我的scramjet。 :)

修改

我在rereadable-stream npm包中发布了以下逻辑。这里描述的流的结果是你现在可以控制缓冲区长度并去除读取数据。

同时你可以保留一个count个项目的窗口并向后拖动一些块。