【问题标题】:Node.js - ZLIB Gunzip returns empty fileNode.js - ZLIB Gunzip 返回空文件
【发布时间】:2023-04-05 07:34:01
【问题描述】:

我只是在测试 Node.js 的 ZLIB,但很快就遇到了奇怪的结果。这是我的脚本(灵感来自 Node.js 手动示例 http://nodejs.org/api/zlib.html#zlib_examples):

var zlib = require('zlib') ,
    fs = require('fs') ,
    inp1 = fs.createReadStream('file.txt') ,
    out1 = fs.createWriteStream('file.txt.gz') ,
    inp2 = fs.createReadStream('file.txt.gz') ,
    out2 = fs.createWriteStream('output.txt') ;

inp1.pipe(zlib.createGzip()).pipe(out1);   /* Compress to a .gz file*/
inp2.pipe(zlib.createGunzip()).pipe(out2); /* Uncompress the .gz file */

在此示例中,在执行脚本之前,我创建了一个名为 file.txt 的文件,并用示例文本(比如 Lorem Ipsum)填充它。

前面的脚本成功创建了.gz 文件,我可以从finder 中解压缩(我在Mac OSX 上),但未压缩的output.txt 文件是空的。

为什么?你有什么想法吗?

【问题讨论】:

    标签: node.js zlib


    【解决方案1】:

    节点流是异步的,因此您的两个流将同时运行。这意味着当您最初打开inp2 时,file.txt.gz 是空的,因为其他写入流还没有添加任何内容。

    var zlib = require('zlib') ,
        fs = require('fs');
    
    var src = 'file.txt',
        zip = 'file.txt.gz',
        dst = 'output.txt';
    
    var inp1 = fs.createReadStream(src);
    var out1 = fs.createWriteStream(zip);
    
    inp1.pipe(zlib.createGzip()).pipe(out1);
    
    out1.on('close', function(){
      var inp2 = fs.createReadStream(zip);
      var out2 = fs.createWriteStream(dst);
      inp2.pipe(zlib.createGunzip()).pipe(out2);
    })
    

    【讨论】:

    • 你是对的 loganfsmyth,现在我明白了。总是忘记节点的异步性。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 2019-04-17
    • 2011-04-22
    • 1970-01-01
    相关资源
    最近更新 更多