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()); } }
(我没有正确地实施资源管理,不要将其视为“好的代码”的例子.)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。