GZIPInputStream
或GZIPOutputStream
出现问题。请阅读以下代码(或运行它,看看会发生什么):
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仍然存在,但我不确定我的代码是否正确,所以让我在这里发帖并听取你的意见。谢谢!
答案 0 :(得分:27)
在尝试阅读之前,您必须在close()
上致电GZIPOutputStream
。只有在文件实际关闭时才会写入文件的最后字节。 (这与输出堆栈中的任何显式缓冲无关。当您告诉它关闭时,流只知道压缩和写入最后的字节。flush()
可能无法帮助...虽然调用{{1而不是finish()
应该工作。看看javadocs。)
这是正确的代码(用Java表示);
close()
(我没有正确实施资源管理。不要把它当作“好代码”的例子。)