Nodejs未压缩的gz只包含一行

时间:2017-04-28 13:16:48

标签: node.js zlib

我正在尝试使用以下代码对大文件(几GB)进行流处理,但它只输出未压缩文件的第一行。

const instream = fs.createReadStream('logs.gz');
const unzip = zlib.createGunzip();
const outstream = process.stdout;

instream.pipe(unzip).pipe(outstream);
// <first line of file>>

我没有压缩文件,但是从日志提供程序的API文档中,它应该被压缩。

如果我使用7zip手动解压缩,它会解压缩。如果我再用7zip压缩它,代码就会在这个7zip处理文件上按预期工作。

如果我挂钩error流的finish | data | unzip事件,没有错误,数据会打印一行然后结束。什么可能是错的线索?

也试过createUnzip

Win10上的节点5.5.0,MacOSX节点v5.6.0上的相同行为。

2 个答案:

答案 0 :(得分:1)

它与您正在使用的Node版本有关:在Node v5.9.0之前,zlib没有正确处理包含多个gzip压缩块的文件。使用这些文件,只会对第一个块进行解压缩。

要复制此问题,我使用以下内容创建包含多个块的文件:

$ echo foo | gzip > logs.gz
$ echo bar | gzip >> logs.gz

我的猜测是您的日志文件是以类似的方式创建的,其中每个日志行都是单独压缩并附加到压缩日志文件中。

可能唯一合理的解决方案是升级到至少v5.9.0(或v6,偶数)。

答案 1 :(得分:0)

如果你想要一个好的单页&#39; 7zip的文档源

NRAO.edu

文件的奇迹,但它是迄今为止我见过的最好的