2013-03-20 82 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