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错误的ZLIB输入流的意外结束,并发现了一些关于2007年至2010年发布的Oracle的错误报告.所以我猜这个错误仍然在某种程度上,但是我不知道我的代码是否正确,所以让我在这里发贴,听你的意见.谢谢!
解决方法
您必须在GZIPOutputStream之前调用close(),然后再尝试读取它.该文件的最终字节将仅在文件实际关闭时被写入. (这与输出堆栈中的任何显式缓冲无关,只有当你告诉它关闭时,流只能压缩和写入最后一个字节.flush()可能不会帮助…虽然调用finish()而不是close()应该工作,看看javadocs.)
这是正确的代码(在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()); } }
(我没有正确地实施资源管理,不要将其视为“好的代码”的例子.)