如何重置nodejs流?
How to reset nodejs stream?
如何重置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);
}
});
}
});
有两种方法可以解决您的问题,正如之前有人评论的那样,您可以简单地将所有内容包装在一个函数中,而不是重新设置 - 只需再次读取文件。
Ofc 这不适用于 HTTP 请求,所以反过来说,如果您确实考虑了更大的内存使用量,您可以简单地累积数据。
你需要的是实现某种 "rewindable stream" - 这意味着你本质上需要实现一个转换流,它会保留所有缓冲区的列表并将它们写入管道以倒带方式流式传输。
看看这里的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 包中发布了以下逻辑。此处描述的流的结果是您现在可以控制缓冲区长度并摆脱读取数据。
同时您可以保留 window 个 count
项并向后拖尾一些块。
如何重置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);
}
});
}
});
有两种方法可以解决您的问题,正如之前有人评论的那样,您可以简单地将所有内容包装在一个函数中,而不是重新设置 - 只需再次读取文件。
Ofc 这不适用于 HTTP 请求,所以反过来说,如果您确实考虑了更大的内存使用量,您可以简单地累积数据。
你需要的是实现某种 "rewindable stream" - 这意味着你本质上需要实现一个转换流,它会保留所有缓冲区的列表并将它们写入管道以倒带方式流式传输。
看看这里的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 包中发布了以下逻辑。此处描述的流的结果是您现在可以控制缓冲区长度并摆脱读取数据。
同时您可以保留 window 个 count
项并向后拖尾一些块。