节点Zlib在流式传输时创建无效的.gz文件

Ada*_*ams 5 zlib stream node.js

我试图通过逐渐将字符串(由换行符分隔的JSON)传输到它来创建.gz文件.

使用节点0.11和0.12(两者都具有相同的reasult,.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();
Run Code Online (Sandbox Code Playgroud)

该文件已创建,但我无法打开它.我究竟做错了什么?

Ish*_*led 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();
Run Code Online (Sandbox Code Playgroud)

和解释:管道用于将流从一个上下文转发到另一个上下文,每个上下文根据它自己的规范操作流(即STDOUT-> gzip压缩 - >加密 - >文件将导致打印到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