我使用Java BufferedReader对象逐行读取,GZIPInputStream指向包含1,000行ASCII文本的有效GZIP存档,采用典型的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')和东西行用户名和组名,然后是实际的文本!< / p> 编辑:我创建了一个非常简单的测试类,它可以再现我上面描述的效果,至少在我的平台上是这样。
编辑:显然是误报,我得到的文件不是简单的GZIP,而是涂焦GZIP,所以这解释了它,不需要进一步测试。谢谢大家!答案 0 :(得分:3)
我想我找到了你的问题。
我尝试用问题中的源代码重现它,并得到了这个输出:
-------------------------------------
Reading PLAIN file
-------------------------------------
Printable part of line 1: This, is, line, number, 1
Line start (<= 25 characters): This__is__line__number__1
No NULL characters in line 1
Other information on line 1:
Length: 25
Bytes: 25
First byte: 84
Printable part of line 10: This, is, line, number, 10
Line start (<= 26 characters): This__is__line__number__10
No NULL characters in line 10
Other information on line 10:
Length: 26
Bytes: 26
First byte: 84
File lines read: 10
-------------------------------------
Reading GZIP file
-------------------------------------
Printable part of line 1: This, is, line, number, 1
Line start (<= 25 characters): This__is__line__number__1
No NULL characters in line 1
Other information on line 1:
Length: 25
Bytes: 25
First byte: 84
Printable part of line 10: This, is, line, number, 10
Line start (<= 26 characters): This__is__line__number__10
No NULL characters in line 10
Other information on line 10:
Length: 26
Bytes: 26
First byte: 84
File lines read: 10
-------------------------------------
TOTAL READ
-------------------------------------
Plain: 10, GZIP: 10
我认为这不是你所拥有的。为什么?您正在使用tar.gz
文件。这是tar
archive format,另外还有gzip
压缩。 GZipInputStream撤消了gzip压缩,但对tar
归档格式一无所知。
tar通常用于将多个文件打包在一起 - 以未压缩的格式,但与一些元数据一起,这是您观察到的:
编辑:更奇怪的行为:第一行读取以文件名为前缀, 几个NULL字符('\ 0')和东西行用户名和组名,然后 实际文本如下!
如果您有tar
文件,则需要使用tar解码器。 How do I extract a tar file in Java?提供了一些链接(比如使用Ant中的Tar任务),还有JTar。
如果您只想发送一个文件,最好直接使用gzip
格式(这就是我在测试中所做的)。
但除了您期望gzip-stream读取tar格式之外,其他任何地方都没有错误。