我遇到了检测管道流结束的问题。 步骤进行:
检测 管道流读取和写入的正确方法是正确的。
var inp = fs.createReadStream(fileName);
var out = fs.createWriteStream(fileName + '.gz');
var gzip = zlib.createGzip();
inp.pipe(gzip).pipe(out);
out.on('finish', function () { ....
VS
var inp = fs.createReadStream(fileName);
var out = fs.createWriteStream(fileName + '.gz');
var gzip = zlib.createGzip();
var zipStream = inp.pipe(gzip).pipe(out);
zipStream.on('finish', function () { ....
答案 0 :(得分:3)
如文档https://nodejs.org/api/stream.html中所述:
'finish'
:在调用stream.end()方法后发出,并且所有数据都已刷新到底层系统。'end'
:在没有更多数据要从流中消耗时发出。事件:'完成'和'结束'
“
finish
”和“end
”事件来自stream.Writable
和 分别为stream.Readable
个类。发出'finish'
事件 在调用stream.end()
并且所有块都已被处理之后stream._transform()
。所有数据都会发出'end
'事件 输出,在transform._flush()
回调后发生 被叫了。
因此,在您的示例中,订单将是:
inp
(可读流)将发出“end
”gzip
(变形金刚):会发出“end
”和“finish
”(transformer is duplex stream)out
(可写流):在写完所有数据后最终会发出“finish
”。答案 1 :(得分:-1)
var inp = fs.createReadStream(fileName);
var out = fs.createWriteStream(fileName + '.gz');
inp.pipe(gzip).pipe(out);
inp.on('finish', function () { ....
这是最好的,因为你正在听输入,加上我最后一次使用它。