BufferedReader中的GZIPInputStream文件结束序列

时间:2011-06-28 11:50:23

标签: java gzip bufferedreader eof gzipinputstream

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

1 个答案:

答案 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格式之外,其他任何地方都没有错误。