例外:ZLIB输入流意外结束

时间:2014-07-02 12:29:07

标签: java scala io

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

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

它创建一个文件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)

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

我用Google搜索了错误Unexpected end of ZLIB input stream并发现了一些针对Oracle的错误报告,这些报告是在2007-2010左右发布的。所以我猜这个bug仍然存在,但我不确定我的代码是否正确,所以让我在这里发帖并听取你的意见。谢谢!

1 个答案:

答案 0 :(得分:27)

在尝试阅读之前,您必须在close()上致电GZIPOutputStream。只有在文件实际关闭时才会写入文件的最后字节。 (这与输出堆栈中的任何显式缓冲无关。当您告诉它关闭时,流只知道压缩和写入最后的字节。flush()可能无法帮助...虽然调用{{1而不是finish()应该工作。看看javadocs。)

这是正确的代码(用Java表示);

close()

(我没有正确实施资源管理。不要把它当作“好代码”的例子。)