检测pipe道stream操作的结束

我正在检测pipe道stream结束的问题。 脚步:

  1. 读取文件
  2. 创buildgzip
  3. 写入文件

哪个是正确的方式来检测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.Writablestream.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,加上这是我最后一次使用它。