- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 Java BufferedReader 对象逐行读取指向有效 GZIP 存档的 GZIPInputStream,该存档包含 1,000 行 ASCII 文本,采用典型的 CSV 格式。代码如下所示:
BufferedReader buffer = new BufferedReader(new InputStreamReader(
new GZIPInputStream(new FileInputStream(file))));
其中 file 是指向存档的实际文件对象。
我通过调用通读了所有文件
int count = 0;
String line = null;
while ((line = reader.readLine()) != null)
{
count++;
}
并且读取器按预期遍历文件,但最后它绕过第 1000 行并再读取一行(即,循环结束后计数 = 1001)。
在最后一行调用 line.length() 会报告大量 (4,000+) 个字符,所有这些字符都是不可打印的 (Character.getNumericValue() 返回 -1)。
实际上,如果我执行 line.getBytes() 结果 byte[] 数组具有相同数量的 NULL 字符 ('\0')。
这看起来像是 BufferedReader 中的错误吗?
无论如何,任何人都可以提出绕过此行为的解决方法吗?
编辑:更奇怪的行为:读取的第一行以文件名、几个 NULL 字符('\0')和行用户名和组名为前缀,然后是实际文本!
编辑:我创建了一个非常简单的测试类,它重现了我上面描述的效果,至少在我的平台上是这样。
编辑:显然是误报,我得到的文件不是纯 GZIP 而是 tar GZIP,所以这解释了它,不需要进一步测试。谢谢大家!
最佳答案
我想我发现了你的问题。
我尝试用问题中的来源重现它,并得到了这个输出:
-------------------------------------
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 通常用于将多个文件打包在一起 - 以未压缩格式,但与一些元数据一起打包,这是您观察到的:
EDIT: More weird behavior: The first line read is prefixed by the filename, several NULL characters ('\0') and things line username and group name, then the actual text follows!
如果您有一个tar
文件,您需要使用一个tar 解码器。 How do I extract a tar file in Java?给出了一些链接(比如使用 Ant 的 Tar 任务),还有 JTar .
如果你只想发送一个文件,最好直接使用gzip
格式(我在测试中就是这样做的)。
但是除了您希望 gzip 流读取 tar 格式之外,没有任何错误。
关于java - BufferedReader 中的 GZIPInputStream 文件结束序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6505965/
GZIP 的大小限制为 4GB,从 http://www.gzip.org/#faq10 获取上面的链接中提到了一些补丁,可以读取超过 4GB 的文件。 我正在使用 GZIPInputStream 读
我需要清楚地了解 GZIPInputstream 的工作原理。我创建了 FileInputStream 对象并将其传递给 GZIPInputstream 以读取我的 config.tar.gz 文件。
简而言之,问题是每当我添加 GZipInputStream 和 GZipOutputStream 时,我的数据就会损坏。没有它们,一切都可以正常工作。 我有以下代码: public boolean l
我在解压缩文件时遇到了一个奇怪的问题,我正在考虑为此使用字符集 UTF-8。我正在使用 Guava 库。 public static byte[] gzip(final CharSequence cs
我有一个包含拉丁文、西里尔文和中文字符的文本。我尝试使用 GZIPOutputStream 压缩字符串(通过 bytes[])并使用 GZIPInputStream 解压缩它。但我无法将所有角色转换回
我正在尝试将 HTTP 响应的 gzip 压缩正文转换为纯文本。我已获取此响应的字节数组并将其转换为 ByteArrayInputStream。然后我将其转换为 GZIPInputStream。我现在
我有一个 .gz 格式的文件。用于读取此文件的 java 类是 GZIPInputStream。但是,这个类并没有扩展 java 的 BufferedReader 类。结果,我无法逐行读取文件。我需要
我正在尝试使用 GZIPOutputStream 在客户端中对字符串进行编码,然后使用 GZIPOutputStream 在服务器中对字符串进行解码。 客户端代码(在初始套接字连接建立之后)是: //
我正在通过 GZIPInputStream 读取 gzip 压缩文件。我想一次读取大量数据,但无论我要求 GZIPInputStream 读取多少字节,它总是读取少得多的字节数。例如, val bAr
在下面的行中,当instream是GZIPInputStream时,我发现c的值是完全随机的,要么大于或小于1024。但是当instream是FileInputStream时,返回值始终是1024。
我在使用 SharpZipLib 的 GZipInputStream 编写未压缩的 GZIP 流时遇到问题。我似乎只能获得 256 字节的数据,其余数据未写入并归零。已检查压缩流 (compresse
我有一个奇怪的程序,其中缓冲区的 GzipInputStream 零填充部分。我有幸知道字节在流中应该是什么样子,我可以看到缓冲区中填充了 8 个正确的字节和 12 个零(不应为零) 字节应该像这样-
我正在尝试在 Java 中使用 GZIPInputStream 来解压缩来自 .NET 应用程序的图像数据(以 GZIP 格式压缩)。图像数据作为 base64 字符串传输,因为它作为 XML 文本同
作为引用,这是我收到的完整错误: java.io.EOFException: Unexpected end of ZLIB input stream at java.util.zip.Infl
场景是读取一个gzip文件(扩展名为.gz) 知道有 GZIPInputStream 类来处理这个。 这里是将文件对象转换为 GZIPStream 的代码。 FileInputStream fin =
我有一个从另一个 ByteArrayInputStream 构建的 GZIPInputStream。我想知道 gzip 数据的原始(未压缩)长度。虽然我可以读取到GZIPInputStream的末尾,
是否有任何适用于 J2ME 的 GZIPInputStream 实现。我更喜欢 Apache 样式许可证 最佳答案 IIRC phoneME project包括 GZIPInputStream 的实现
我正在尝试将一系列 Long 写入 GZIPOutputStream,希望稍后能解压缩这些数字。 当我尝试使用少量 Long 时,以下程序运行良好,但使用许多 Long 时会抛出异常,例如 (1024
我有一个静态辅助方法,负责从我们的 Rails 应用程序中获取压缩的 JSON 字符串,并在返回 String 表示之前解压缩数据。 我编写了两个 JUnit 测试,一个测试 JSON 是否正确解析,
我使用 Java BufferedReader 对象逐行读取指向有效 GZIP 存档的 GZIPInputStream,该存档包含 1,000 行 ASCII 文本,采用典型的 CSV 格式。代码如下
我是一名优秀的程序员,十分优秀!