【发布时间】: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