我只是在测试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
文件为空。
为什么呢?你有什么想法吗?
答案 0 :(得分:7)
节点流是异步的,因此两个流都将同时运行。这意味着当您最初打开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);
})