ZLIB Gunzip返回空文件



我只是在测试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文件,我可以从查找器中解压缩(我在Mac OSX上),但是未压缩的output.txt文件是空的。

为什么?你知道吗?

Node流是异步的,所以你的两个流将同时运行。这意味着当您最初打开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);
})

最新更新