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ファイルを正常に作成し、ファインダーから解凍できます(Mac OSXを使用しています)が、圧縮されていないoutput.txtファイルは空です。

なんで?何か考えはありますか?

4

1 に答える 1

8

ノードストリームは非同期であるため、両方のストリームが同時に実行されます。つまり、最初に開いたとき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);
})
于 2013-03-20T16:53:10.543 に答える