检测管道流操作的结束

时间:2016-11-29 11:14:16

标签: node.js

我遇到了检测管道流结束的问题。 步骤进行:

  1. 阅读文件
  2. 创建gzip
  3. 写文件
  4. 检测 管道流读取和写入的正确方法是正确的。

    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 () { ....
    

    reference Link

2 个答案:

答案 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 () { ....

这是最好的,因为你正在听输入,加上我最后一次使用它。