我正在尝试通过将字符串(由换行符分隔的JSON)逐渐传输到它来创建.gz文件。
使用节点0.11和0.12(两者都具有相同的结果,.gz文件无法打开)。
我将代码缩减为:
var fs = require('fs');
var output = fs.createWriteStream('test.gz');
var zlib = require('zlib');
var compress = zlib.createGzip();
var myStream = compress.pipe(output);
myStream.write('Hello, World!');
myStream.end();
文件已创建,但我无法打开它。我做错了什么?
答案 0 :(得分:7)
好的,所以这是修复:
var fs = require('fs');
var output = fs.createWriteStream('test.gz');
var zlib = require('zlib');
var compress = zlib.createGzip();
/* The following line will pipe everything written into compress to the file stream */
compress.pipe(output);
/* Since we're piped through the file stream, the following line will do:
'Hello World!'->gzip compression->file which is the desired effect */
compress.write('Hello, World!');
compress.end();
并解释: 管道用于将流从一个上下文转发到另一个上下文,每个上下文根据它自己的规范操纵流(即STDOUT-> gzip压缩 - >加密 - >文件将导致打印到STDOUT的所有内容都通过gzip压缩,加密并最终写入文件)。
在您的原始示例中,您正在写入管道的 end ,这意味着在没有操作的情况下写入文件,因此您获得了要求编写的纯ASCII。这里的混乱是关于myStream是什么。你假设它是整个链(gzip->文件),但事实上,它只是结束(文件)。
将管道设置为流对象后,当您写入原始流时,对该流的所有进一步写入都将自动进行管道传输。
我发现有些参考资料很有用:
http://codewinds.com/blog/2013-08-20-nodejs-transform-streams.html#what_are_transform_streams_