【问题标题】:Reading a large compressed file using Apache Commons Compress使用 Apache Commons Compress 读取大型压缩文件
【发布时间】:2016-06-08 12:22:46
【问题描述】:

我正在尝试使用 Apache Commons Compress 读取 bz2 文件。

以下代码适用于小文件。 但是对于一个大文件(超过 500MB),它会在读取数千行后结束,没有任何错误。

try {
    InputStream fin = new FileInputStream("/data/file.bz2");
    BufferedInputStream bis = new BufferedInputStream(fin);
    CompressorInputStream input = new CompressorStreamFactory()
                .createCompressorInputStream(bis);
    BufferedReader br = new BufferedReader(new InputStreamReader(input,
                "UTF-8"));

    String line = "";
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (Exception e) {
    e.printStackTrace();
}

还有其他读取大型压缩文件的好方法吗?

【问题讨论】:

  • 这应该可以工作 - 除非库有一些错误。你能生成一个不太大的测试/示例吗?另一个测试:手动解压缩文件并在BufferedReader 构造行中使用bis 而不是input 运行相同的代码。
  • 您是从控制台使用main 方法运行它吗? (即,您确定没有打印异常吗?您是否尝试在 catch 块中重新抛出异常?)

标签: java compression apache-commons-compress bz2


【解决方案1】:

我在处理大文件时遇到了同样的问题,直到我注意到 CompressorStreamFactory 有几个采用布尔值 decompressUntilEOF 参数的重载构造函数。

只需更改为以下内容可能就缺少了...

CompressorInputStream input = new CompressorStreamFactory(true)
                .createCompressorInputStream(bis);

显然,编写此工厂的人似乎认为最好在某些点创建新的压缩器输入流,并使用相同的底层缓冲输入流,以便新的输入流从最后一个停止的地方开始。他们似乎认为这是一种更好的默认方式,或者是首选方式,而不是允许一个流将数据一直解压缩到文件末尾。我毫不怀疑他们比我聪明,而且我还没有通过将此参数设置为true 来弄清楚我为未来的我设置了什么陷阱。也许有人会在 cmets 告诉我! :-)

【讨论】:

    猜你喜欢
    • 2013-09-04
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 2022-01-06
    • 1970-01-01
    相关资源
    最近更新 更多