2013-03-20 84 views
3

我只是在测试Node.js的ZLIB,但很快就遇到了奇怪的结果。这里是我的脚本(来自Node.js的手工例子http://nodejs.org/api/zlib.html#zlib_examples启发):Node.js - ZLIB Gunzip返回空文件

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文件,我用一个示例文本fullfill它(说Lorem Ipsum)。

上一个脚本成功创建了.gz文件,我可以从查找器(我在Mac OSX上)解压缩,但未压缩的output.txt文件为空。

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

回答

6

节点流是异步的,所以你的两个流都会同时运行。这意味着当您最初打开inp2file.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); 
}) 
+0

你是对的loganfsmyth,现在我明白了。总是忘记节点的异步性。谢谢你的帮助。 – htaidirt 2013-03-20 17:14:17