我正试图通过将字符串(用换行符分隔的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();
文件已创建,但我无法打开它。我做错了什么?
好的,所以这里是修复:
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();
以及解释:管道用于将流从一个上下文转发到另一个上下文,每个上下文都根据自己的规范操作流(即STDOU->gzip压缩->encryption文件将导致打印到STDOUT的所有内容通过gzip压缩、加密并最终写入文件)。
在最初的示例中,您正在向管道的端写入,这意味着在不进行任何操作的情况下写入文件,因此您得到了要求编写的纯ASCII。这里的困惑在于myStream是什么。你以为它是整个链(gzip->文件),但实际上它只是结束(文件)。
一旦将管道设置为流对象,当您写入原始流时,所有对该流的进一步写入都将自动通过管道。
我发现一些参考资料很有用:
http://codewinds.com/blog/2013-08-20-nodejs-transform-streams.html#what_are_transform_streams_
http://www.sitepoint.com/basics-node-js-streams/
https://nodejs.org/api/process.html