zlib gunzip解压缩每个在同一文件上运行的不同缓冲区大小

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zlib gunzip解压缩每个在同一文件上运行的不同缓冲区大小相关的知识,希望对你有一定的参考价值。

我正在从电影数据库下载每日导出gzip文件并使用zlib解压缩它。当命中end事件时,我记录我解压缩的数据字符串的长度。每次长度都不同。

似乎数据没有完全解压缩。当我开始解析文件实际包含的JSON时,我注意到了这一点。它会在转换JSON的每一行(每行代表一个独立的json对象)中途中途,并因为json格式错误而爆炸。

var http = require('http');
var zlib = require('zlib');

var downloadUrl = "http://files.tmdb.org/p/exports/movie_ids_03_01_2018.json.gz";
http.get(downloadUrl, function(response) {
    var fileContents = "";
    var gunzip = zlib.createGunzip();

    gunzip.on('data', function(data) {
        fileContents += data.toString();
    });

    gunzip.on('end', function() {
        console.log(fileContents.length);
    });

    response.pipe(gunzip);
});

我错误地使用了gunzip事件吗?

我有一个reproducible example你可以执行看它运行。

答案

我通过用http替换我对request的使用来解决这个问题。我不确定我在http.get做错了什么,但把gunzip换成request返回值解决了我的问题。

var request = require('request');
var zlib = require('zlib');
var fs = require('fs');

var downloadUrl = "http://files.tmdb.org/p/exports/movie_ids_03_01_2018.json.gz";
var response = request(downloadUrl);
var fileContents = "";
var gunzip = zlib.createGunzip();

gunzip.on('data', function(data) {
    fileContents += data.toString();
});

gunzip.on('end', function() {
    var json = fileContents.split('\n').filter(function(value, index) {
        if (value == "") {
            console.log(index + " is empty and skipped.");
            return false;
        }

        return true;
    });
});

response.pipe(gunzip);

我试图使用request.get(options, function(error, response, body){});但无法将gunzip送入响应或身体。我是流媒体的新手,需要更多地研究以找出问题所在。同时,上面的解决方案没有问题。

由于每天运行一次,作为Azure功能,这样同步运行它并不是什么大问题。我没有阻止任何进一步的工作。

以上是关于zlib gunzip解压缩每个在同一文件上运行的不同缓冲区大小的主要内容,如果未能解决你的问题,请参考以下文章

Linux命令(十八) 压缩或解压缩文件和目录 gzip gunzip

Linux gunzip命令:解压缩文件或目录

Linux命令之解压缩gunzip

使用minizip解压缩多个文件(基于zlib)

linux gz 解压缩

Linuxlinux下gzip的压缩/解压缩详解