异常:ZLIB 输入流意外结束

2022-09-01 12:57:59

或 有问题。请阅读以下代码(或运行它,看看会发生什么):GZIPInputStreamGZIPOutputStream

def main(a: Array[String]) {
    val name = "test.dat"
    new GZIPOutputStream(new FileOutputStream(name)).write(10)
    println(new GZIPInputStream(new FileInputStream(name)).read())
}

它创建一个文件 ,通过GZIP写入单字节格式,并以相同的格式读取同一文件中的字节。test.dat10

这就是我运行它的内容:

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)

由于某种原因,阅读线似乎走错了路。

我用谷歌搜索了这个错误,并找到了一些向Oracle提交的错误报告,这些报告是在2007-2010年左右发布的。所以我想这个错误仍然以某种方式存在,但我不确定我的代码是否正确,所以让我在这里发布这个并听取你的建议。谢谢!Unexpected end of ZLIB input stream


答案 1

在尝试阅读之前,您必须调用 它。仅当流对象实际关闭时,才会写入文件的最后字节。close()GZIPOutputStream

(这与输出堆栈中是否有任何显式缓冲无关。流只知道压缩并写入最后一个字节,当你告诉它关闭。A 无济于事...虽然打电话而不是应该工作。看看javadocs。flush()finish()close()

这是正确的代码(在Java中);

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

(我没有正确实现资源管理或异常处理/报告,因为它们与此代码的目的无关。不要将其视为“好代码”的示例。


答案 2

推荐