检测pipe道stream操作的结束
我正在检测pipe道stream结束的问题。 脚步:
- 读取文件
- 创buildgzip
- 写入文件
哪个是正确的方式来检测pipe道stream读写的结束 。
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 () { ....
参考链接
正如文档https://nodejs.org/api/stream.html所述 :
-
'finish'
:在stream.end()方法被调用之后被发射,并且所有数据已经被刷新到底层系统。 -
'end'
:当没有更多数据从stream中被消耗时被发射。
活动:“完成”和“结束”
“
finish
”和“end
”事件分别来自stream.Writable
和stream.Readable
类。 在stream.end()
被调用并且所有的块已经被stream._transform()
处理之后,发出'finish'
事件。 所有数据输出后,会发出'end
'事件,在调用了transform._flush()
的callback后发生。
所以,在你的例子中,顺序是:
-
inp
(可读stream)将发出'end
' -
gzip
(变压器):会发出'end
'和'finish
'( 变压器是双工stream ) -
out
(可写stream):当所有数据写入时,最终都会发出“finish
”。
var inp = fs.createReadStream(fileName); var out = fs.createWriteStream(fileName + '.gz'); inp.pipe(gzip).pipe(out); inp.on('finish', function () { ....
这是最好的,因为你正在听input,加上这是我最后一次使用它。