Java 异常:ZLIB输入流意外结束
Java 异常:ZLIB输入流意外结束,java,scala,io,Java,Scala,Io,gzip输入流或gzip输出流有问题。请阅读以下代码(或者运行它,看看会发生什么): 它创建一个文件test.dat,通过GZIP写入单个字节10格式,并以相同格式读取同一文件中的字节 这就是我运行它的原因: Exception in thread "main" java.io.EOFException: Unexpected end of ZLIB input stream at java.util.zip.InflaterInputStream.fill(Unknown Source
gzip输入流
或gzip输出流
有问题。请阅读以下代码(或者运行它,看看会发生什么):
它创建一个文件test.dat
,通过GZIP写入单个字节10
格式,并以相同格式读取同一文件中的字节
这就是我运行它的原因:
Exception in thread "main" java.io.EOFException: Unexpected end of ZLIB input stream
at java.util.zip.InflaterInputStream.fill(Unknown Source)
at java.util.zip.InflaterInputStream.read(Unknown Source)
at java.util.zip.GZIPInputStream.read(Unknown Source)
at java.util.zip.InflaterInputStream.read(Unknown Source)
at nbt.Test$.main(Test.scala:13)
at nbt.Test.main(Test.scala)
由于某种原因,阅读线似乎走错了方向
我在谷歌上搜索了ZLIB输入流的错误
意外结束
,发现了一些提交给Oracle的错误报告,这些报告是在2007-2010年左右发布的。所以我猜这个bug在某种程度上仍然存在,但我不确定我的代码是否正确,所以让我在这里发布这个,并听取您的建议。谢谢大家! 在尝试读取之前,必须在GZIPOutputStream
上调用close()
。只有当流对象实际关闭时,才会写入文件的最后字节
(这与输出堆栈中的任何显式缓冲无关。当您告诉流关闭时,流只知道压缩和写入最后的字节。flush()
下面是正确的代码(Java)
(我没有正确实施资源管理或异常处理/报告,因为它们与此代码的目的无关。不要将此视为“好代码”的示例)“GZIPInputStream或GZIPOutputStream有问题。”-错误诊断。99.99%的人认为真正的问题不在这些课程中,事实上是100%。看看我的答案。如果我在初始化GziOutputStream之前在这里创建了一个FileOutputStream的实例呢?我也需要对这个对象调用close()吗?因为我的代码在调用close时抛出了相同的错误。GZIPOutputStream和FileOutputStream close()调用的顺序也很重要吗?不,你没有。对GZIPOutputStream
对象调用close
将对其包装的FileOutputStream
调用close。(如果构建GZIPOutputStream
失败,理论上会出现资源泄漏,但我认为只有从Error
中捕获/恢复,这是一件坏事。)“GZIPOutputStream和FileOutputStream close()的顺序也是如此。”。对这很重要。如果您先关闭FileOutputStream,那么关闭GziOutputStream将引发异常。。。因为它无法将剩余的数据写入关闭的FileOutputStream。
Exception in thread "main" java.io.EOFException: Unexpected end of ZLIB input stream
at java.util.zip.InflaterInputStream.fill(Unknown Source)
at java.util.zip.InflaterInputStream.read(Unknown Source)
at java.util.zip.GZIPInputStream.read(Unknown Source)
at java.util.zip.InflaterInputStream.read(Unknown Source)
at nbt.Test$.main(Test.scala:13)
at nbt.Test.main(Test.scala)
package test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
public class GZipTest {
public static void main(String[] args) throws
FileNotFoundException, IOException {
String name = "/tmp/test";
GZIPOutputStream gz = new GZIPOutputStream(new FileOutputStream(name));
gz.write(10);
gz.close(); // Remove this to reproduce the reported bug
System.out.println(new GZIPInputStream(new FileInputStream(name)).read());
}
}