Node.js - ZLIB Gunzip返回空文件

时间:2013-03-20 16:21:51

标签: node.js zlib

我只是在测试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文件为空。

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

1 个答案:

答案 0 :(得分:7)

节点流是异步的,因此两个流都将同时运行。这意味着当您最初打开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);
})