java – 异常:ZLIB输入流意外结束

前端之家收集整理的这篇文章主要介绍了java – 异常:ZLIB输入流意外结束前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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())
}
@H_301_4@它创建一个文件test.dat,由GZIP写入一个单字节10格式,并以相同的格式读取同一个文件中的字节.

@H_301_4@这就是我运行它:

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)
@H_301_4@由于某种原因,阅读线似乎错了.

@H_301_4@我google错误的ZLIB输入流的意外结束,并发现了一些关于2007年至2010年发布的Oracle的错误报告.所以我猜这个错误仍然在某种程度上,但是我不知道我的代码是否正确,所以让我在这里发贴,听你的意见.谢谢!

解决方法

您必须在GZIPOutputStream之前调用close(),然后再尝试读取它.该文件的最终字节将仅在文件实际关闭时被写入. (这与输出堆栈中的任何显式缓冲无关,只有当你告诉它关闭时,流只能压缩和写入最后一个字节.flush()可能不会帮助…虽然调用finish()而不是close()应该工作,看看javadocs.) @H_301_4@这是正确的代码(在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());
    }
}
@H_301_4@(我没有正确地实施资源管理,不要将其视为“好的代码”的例子.)

猜你在找的Java相关文章