ZLIB输入流意外结束

sli*_*eed 7 java deflate

我正在尝试使用DeflaterOutputStream将JSON字符串往返一个字节数组,但下面的代码是抛出的java.io.EOFException: Unexpected end of ZLIB input stream.

将字符串替换为"Hello world"时,或者从下面的字符串中删除一些字符时,它可以正常工作.

有任何想法吗?

public static void main(String[] args) throws IOException {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    DeflaterOutputStream deflate = new DeflaterOutputStream(bytes, new Deflater(Deflater.BEST_COMPRESSION, true));
    OutputStreamWriter writer = new OutputStreamWriter(deflate);
    writer.write("[1,null,null,\"a\",null,null,null,null,[1,null,null,null,null,null,null,null,null,null,null,null,null,0.0,0.0,null,null]");
    writer.flush();
    writer.close();

    InflaterInputStream inflaterIn = new InflaterInputStream(new ByteArrayInputStream(bytes.toByteArray()), new Inflater(true));
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inflaterIn));
    System.out.println(bufferedReader.readLine());
}
Run Code Online (Sandbox Code Playgroud)

Java版本(OSX):

java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03-383-11A511)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02-383, mixed mode)
Run Code Online (Sandbox Code Playgroud)

Sam*_*Sam 13

我有这个问题,这是因为我没有正确关闭我的输出流.

  • 我和`GZIPOutputStream`有类似的问题.在写完gzip流之后,我需要调用`finish()`. (6认同)

Jon*_*eet 8

我相信这是与你传递"真"在这两个"无包装"选项做DeflaterInflater.设置这两个以false解决问题 - 虽然我建议在两个地方设置字符串编码(例如UTF-8),而不是使用系统默认编码.

"nowrap"的文档相当含糊,但它们指出:

注意:使用'nowrap'选项时,还需要提供额外的"虚拟"字节作为输入.这是ZLIB本机库所必需的,以支持某些优化.

大概这个虚拟输入字节丢失了,虽然它没有解释它应该去哪里......