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());
}
}
(我没有正确地实施资源管理,不要将其视为“好的代码”的例子.)