【问题标题】:Detecting the end of a piped stream operation检测管道流操作的结束
【发布时间】:2016-11-29 11:14:16
【问题描述】:

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

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

对

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

【问题讨论】:

    标签: node.js


    【解决方案1】:

    如文档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”。

    【讨论】:

    • 您的第二个选项zipStream = inp.pipe(gzip).pipe(out); zipStream.on('finish', function () { .... }) 是正确的。因为最后一个管道,返回最后一个流(可写的)。
    • 第一个选项有错别字,你能说出为什么 out.on('finish', function () { .. 不起作用吗?
    • 是一样的,两者都可以。因为 out === inp.pipe(gzip).pipe(out)
    【解决方案2】:
    var inp = fs.createReadStream(fileName);
    var out = fs.createWriteStream(fileName + '.gz');
    inp.pipe(gzip).pipe(out);
    inp.on('finish', function () { ....
    

    这是最好的,因为您正在监听输入,而且我上次也是这样使用的。

    【讨论】:

    • 你看到我给的参考链接了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 2012-06-22
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    相关资源
    最近更新 更多