1

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

4

1 回答 1

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存档格式,另外还有gzip压缩。tarGZipInputStream 撤消 gzip 压缩,但对存档格式一无所知。

tar 通常用于将多个文件打包在一起 - 以未压缩的格式,但与一些元数据一起,这是您观察到的:

编辑:更奇怪的行为:读取的第一行以文件名、几个 NULL 字符('\0')和事物行用户名和组名为前缀,然后是实际文本!

如果您有tar文件,则需要使用 tar 解码器。如何在 Java 中提取 tar 文件?给出了一些链接(比如使用 Ant 的 Tar 任务),还有JTar

如果您只想发送一个文件,最好gzip直接使用格式(这是我在测试中所做的)。

但是除了您希望 gzip-stream 读取 tar 格式之外,任何地方都没有错误。

于 2011-06-28T20:50:52.153 回答