【问题标题】:Java compressor not reading file completelyJava 压缩器没有完全读取文件
【发布时间】:2014-11-12 15:30:18
【问题描述】:

我们在 Java 中解压缩 bz2 文件时遇到问题,输入流在读取了大约 3% 的文件后认为它已完成。

我们欢迎任何有关如何解压缩和读取必须逐行处理的大型 bz2 文件的建议。

以下是我们迄今为止所做工作的详细信息:

例如,bz2 文件大小为 2.09 GB,未压缩为 24.9 GB

下面的代码仅读取文件实际包含的约 1000 万行中的 343,800 行。

修改代码以将 bz2 解压缩为文本文件(FileInputStream 直接进入 CompressorInputStream)会生成约 190 MB 的文件 - 无论 bz2 文件的大小如何。 我已经尝试将缓冲区值设置为 2048 字节,但这对结果没有影响。

我们已经在 Windows 64 位和 Linux/CentOS 上执行了代码,结果相同。

缓冲的阅读器是否会到达一个空的“null”行并导致代码退出while循环?

import org.apache.commons.compress.compressors.*;
import java.io.*;

...

CompressorInputStream is = new CompressorStreamFactory()
    .createCompressorInputStream(
        new BufferedInputStream(
            new FileInputStream(filePath)));

lineNumber = 0;
line = "";
br = new BufferedReader(
    new InputStreamReader(is));

while ((line = br.readLine()) != null) {
    this.processLine(line, ++lineNumber);
}

即使是在到达流末尾时强制异常的这段代码也具有完全相同的结果:

byte[] buffer = new byte[1024];
int len = 1;

while (len == 1) {
    out.write(buffer, 0, is.read(buffer));
    out.flush();
}

【问题讨论】:

  • 空行应该作为空字符串返回,所以我怀疑空行有问题。
  • 您是否以适当的方式处理异常,即不只是吞下它们?
  • 我现在没有合适的文件可供测试,但我认为 bzip2 工具中曾经存在文件 >2GB 的问题。也许Java库中有类似的问题?如果对你来说可行的话,也许你可以测试一下当压缩文件
  • 上面的代码被一个捕获 IOExceptions 的 try/catch 包围。没有抛出任何东西。

标签: java


【解决方案1】:

您的代码没有明显的问题;它应该工作。这意味着问题一定出在其他地方。

尝试启用日志记录(即在处理这些行时打印它们)。确保输入中没有间隙(也许将这些行写入一个新文件并进行比较)。使用bzip2 --test 确保输入文件没有错误。检查同一行是否总是失败(可能输入包含奇数字符或二进制数据?)

【讨论】:

  • 谢谢亚伦。它总是在读取 200 MB 后停止。这些文件都来自同一个来源,所以他们压缩文件的方式可能有些奇怪。也就是说,您可以使用 Power Archiver 甚至 Windows Explorer 等程序成功解压缩文件,这让我认为某些 Java 类的某些部分会误解字节流。
  • 你 100% 确定它不可能是 OutOfMemoryException?向代码提供未压缩文件时会发生什么?
  • Java 的内存使用在整个过程中保持不变,并且可以使用上面的代码处理整个解压缩文件(减去压缩器)。
  • Java 的哪个版本?你能尝试写一个只解压文件(不做任何处理)的小解压器吗?
【解决方案2】:

问题在于 bz2 文件:它们是使用 Hadoop 版本创建的,该版本在文件中包含坏块头。

当前的 Java 解决方案遇到了这个问题,而其他解决方案则忽略了它或以某种方式处理它。

将寻找解决方案/解决方法。

【讨论】:

    猜你喜欢
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 2011-11-30
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多