有什么问题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
,10
通过GZIP 写入单字节格式,并以相同的格式读取同一文件中的字节.
这就是我运行它的原因:
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)
由于某种原因,阅读线似乎走错了路.
我搜索了该错误,Unexpected end of ZLIB input stream
并发现了一些针对Oracle的错误报告,这些报告是在2007-2010左右发布的.所以我猜这个bug仍然存在,但我不确定我的代码是否正确,所以让我在这里发帖并听取你的意见.谢谢!
你要叫close()
上GZIPOutputStream
你试图读取它之前.只有在文件实际关闭时才会写入文件的最后字节.(这与输出堆栈中的任何显式缓冲flush()
无关.当你告诉它关闭时,流只知道压缩和写入最后的字节.一个可能无济于事......虽然调用finish()
而不close()
应该工作.看看的javadoc.)
这是正确的代码(用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(); System.out.println(new GZIPInputStream(new FileInputStream(name)).read()); } }
(我没有正确实施资源管理.不要将此视为"好代码"的一个例子.)