Java压缩器未完全读取文件

Java压缩器未完全读取文件,java,Java,我们在Java中解压bz2文件时遇到了一个问题,输入流认为它在读取了约3%的文件后就完成了 我们欢迎任何关于如何解压和读取需要逐行处理的大型bz2文件的建议 以下是我们迄今为止所做工作的细节: 例如,bz2文件的大小为2.09 GB,未压缩文件的大小为24.9 GB 下面的代码仅读取文件中实际包含的~1000万行中的343800行 修改代码以将bz2解压到文本文件(FileInputStream直接进入CompressorInputStream)中会产生约190 MB的文件—与bz2文件的大小无

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

我们欢迎任何关于如何解压和读取需要逐行处理的大型bz2文件的建议

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

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

下面的代码仅读取文件中实际包含的~1000万行中的343800行

修改代码以将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--test
确保输入文件没有bug。检查同一行是否总是失败(可能输入包含奇数字符或二进制数据?

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

当前的Java解决方案在这方面遇到了困难,而其他解决方案则忽略了这一点,或者以某种方式处理了它


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

空行应作为空字符串返回,因此我怀疑空行是否有问题。您是否以适当的方式处理异常,即不只是吞掉它们?我现在没有合适的文件可供测试,但我认为bzip2工具中的文件>2GB时会出现问题。也许Java库中也存在类似的问题?如果这对您来说是可行的,那么您可以测试当压缩文件被一个try/catch包围时是否存在同样的问题,该try/catch捕获IOExceptions。没有一个被抛出。看这个帖子:谢谢亚伦。它总是在读取了200 MB之后停止。这些文件都来自同一个源,所以它们压缩文件的方式可能有些奇怪。也就是说,您可以使用Power Archiver甚至Windows Explorer之类的程序成功地解压缩文件,这让我觉得某个Java类的某些部分误解了字节流。您100%确定它不会是
OutOfMemoryException
?当您向代码提供一个未压缩的文件时会发生什么?Java的内存使用在整个过程中保持不变,并且整个已解压缩的文件可以使用上面的代码(不包括压缩程序)进行处理。Java的哪个版本?你能试着写一个小的解压器来解压这个文件吗?