异常:ZLIB输入流的意外结束

有什么问题GZIPInputStreamGZIPOutputStream。请阅读以下代码(或运行它,看看会发生什么):

def main(a: Array[String]) {

val name = "test.dat"

new GZIPOutputStream(new FileOutputStream(name)).write(10)

println(new GZIPInputStream(new FileInputStream(name)).read())

}

它创建一个文件test.dat10通过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年间发布的。因此,我认为该错误仍然存​​在,但是我不确定我的代码是否正确,因此让我在此处发布并听取您的建议。谢谢!

回答:

您必须先呼叫close()GZIPOutputStream然后再尝试阅读。文件的最后字节将仅在文件实际关闭时写入。(这与输出堆栈中的任何显式缓冲flush()无关。当您告诉它关闭时,流仅知道压缩并写入最后一个字节。A

可能无济于事,尽管调用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());

}

}

(我没有正确实现资源管理。不要将其视为“良好代码”的示例。)

以上是 异常:ZLIB输入流的意外结束 的全部内容, 来源链接: utcz.com/qa/423180.html

回到顶部