【发布时间】:2011-09-24 06:13:49
【问题描述】:
我使用一个 Java BufferedReader 对象逐行读取一个 GZIPInputStream,它指向一个有效的 GZIP 存档,该存档包含 1,000 行 ASCII 文本,采用典型的 CSV 格式。代码如下所示:
BufferedReader buffer = new BufferedReader(new InputStreamReader(
new GZIPInputStream(new FileInputStream(file))));
file 是指向档案的实际 File 对象。
我通过调用阅读了所有文件
int count = 0;
String line = null;
while ((line = reader.readLine()) != null)
{
count++;
}
阅读器按预期浏览文件,但最后它绕过第 #1000 行并再读取一行(即循环结束后 count = 1001)。
在最后一行调用 line.length() 会报告大量 (4,000+) 个字符,所有这些字符都是不可打印的 (Character.getNumericValue() 返回 -1)。
实际上,如果我执行 line.getBytes(),则生成的 byte[] 数组具有相同数量的 NULL 字符('\0')。
这看起来像是 BufferedReader 中的错误吗?
在任何情况下,任何人都可以建议绕过此行为的解决方法吗?
编辑:更奇怪的行为:读取的第一行以文件名、几个 NULL 字符('\0')和事物行用户名和组名为前缀,然后是实际文本!
编辑:我创建了一个非常简单的测试类,它至少在我的平台上重现了我上面描述的效果。
编辑:显然是误报,我得到的文件不是普通的 GZIP 而是 tar 的 GZIP,所以这就解释了,不需要进一步测试。谢谢大家!
【问题讨论】:
-
调试方法:使用外部
gzip提取文件,并省略GZIPInputStream- 并查看提取的文件。可能是您的 gzip 文件有问题,或者 InputStreamReader 或 BufferedReader 有错误。或 GzipInputStream。 -
您说的是一个普通的 gzip 文件,但您的代码引用了一个
tar.gz文件。为什么?您知道 tar + gz 文件与 gzip 不同吗? -
既然您有问题的答案,最好接受其中一个答案,投票选出对您有帮助的答案等。
-
离题,我必须说我真的看不出一个有效的问题应该如何被否决。的确,首先没有“错误”,因为 OP 起初并没有看到他正在尝试解析 GZIP 文件,实际上是无意中发送了 tarball。然而,这个问题是合法的和详细的,得到了一个有效和彻底的答案,OP 确实看到了他的错误,他很有礼貌地放弃了他在 SourceForge 上的错误报告。所以....对 OP 和答案的支持是我能做的至少.... 编辑:给 OP 的注释 - 如果它被证明有用,请接受答案...
标签: java gzip bufferedreader eof gzipinputstream