检测管道流操作的结束

Rat*_*mar 3 node.js

我在检测管道流结束时遇到问题。脚步:

  1. 读取文件
  2. 创建 gzip
  3. 写文件

这是检测管道流读写结束的正确方法。

var inp = fs.createReadStream(fileName);
var out = fs.createWriteStream(fileName + '.gz');
var gzip = zlib.createGzip();
inp.pipe(gzip).pipe(out);
out.on('finish', function () { ....
Run Code Online (Sandbox Code Playgroud)

对比

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

参考链接

Dar*_*rio 8

如文档https://nodejs.org/api/stream.html 中所述

  • 'finish': 在调用 stream.end() 方法之后发出,并且所有数据都已刷新到底层系统。
  • 'end': 当没有更多数据要从流中消费时发出。

事件:“完成”和“结束”

' finish' 和 ' end' 事件分别来自stream.Writablestream.Readable类。该'finish'事件被发出后,stream.end()被称为和所有块已被处理 stream._transform()。' end' 事件在所有数据输出后发出,该事件发生在回调 intransform._flush()被调用之后。

因此,在您的示例中,顺序将是:

  • inp(可读流)将发出“ end
  • gzip(transformer): 将发出一个 ' end' 和 ' finish' ( transformer 是双工流)
  • out(可写流):finish当所有数据都被写入时,最终会发出一个 ' '。