ZLIB流的大型CSV文件意外结束

时间:2018-07-16 13:01:43

标签: java csv zlib compression

我正在尝试解压缩格式为name.csv.gz的csv文件,我认为它类似于600M的压缩格式,我们将在7Gb的背景下说些什么解压缩

byte[] buffer = new byte[4096];
try {
        GZIPInputStream gzis = new GZIPInputStream(new FileInputStream("/run/media/justin/DATA/2000000033673205_53848.TEST_SCHEDULE_GCO.20180706.090850.2000000033673205.x04q13.csv.gz"));

        FileOutputStream out = new FileOutputStream("/run/media/justin/DATA/unzipped.txt");

        int len;

        while((len = gzis.read(buffer)) > 0) {
            out.write(buffer,0,len);
        }

        gzis.close();
        out.close();
        System.out.println("DONE!!");
    } catch(IOException e) {e.printStackTrace();}

这是我用来解压缩的代码,最后,出现错误Unexpected end of ZLIB stream,并且在文件末尾缺少几百万行。我在Google上找不到任何能使我朝着任何方向发展的东西,因此,我们将不胜感激!

编辑:我也忘记了顶部的代码行(* facepalm),我将缓冲区大小从2048增加到4096,并且在解压后得到的行数更多,所以我假设我是正确的只是没有分配足够大的缓冲区? (或者这是一个天真的假设?)

1 个答案:

答案 0 :(得分:1)

  

我已经将缓冲区大小从2048增加到4096,并且在解压后得到的行数更多,所以我以为我只是没有分配足够大的缓冲区就可以了吗? (或者这是一个天真的假设?)

这不是您的缓冲区大小的问题,更多的是GZIPInputStream.read()方法的问题。缓冲区大小仅声明while循环应多长时间读取和写入一次,导致bigger buffer => higher transfer rate => less loops

您的问题在GZIPInputStream类内部或与使用的文件有关,也许首先尝试使用较小的文件。