5

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

为什么?你有什么主意吗?

4

1 回答 1

8

节点流是异步的,因此您的两个流将同时运行。这意味着当您最初打开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);
})
于 2013-03-20T16:53:10.543 回答