如何重置nodejs流?

Иго*_*орь 4 stream fs node.js

如何重置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);
            }
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

Mic*_*cki 8

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

例如,对于HTTP请求,这将无法正常工作,反之亦然,只要您考虑到更大的内存使用量,您就可以简单地累积数据.

你需要的是实现某种"可回滚流" - 这意味着你基本上需要实现一个转换流,它将保留所有缓冲区的列表,并在回放方法上将它们写入管道流.

在这里看一下节点API,这些方法应该看起来像这样.

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;
  }
Run Code Online (Sandbox Code Playgroud)

你会像这样使用这个:

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.
});
Run Code Online (Sandbox Code Playgroud)

其实我想我会把这个添加到我的scramjet.:)

编辑

我在rereadable-streamnpm包中发布了下面的逻辑.这里描述的流的结果是你现在可以控制缓冲区长度并摆脱读取数据.

与此同时,您可以保留一个count项目窗口并向后拖动多个块.