我使用一个 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,所以这就解释了,不需要进一步测试。感谢大家!