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());
    }
}