9

我正在尝试使用 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());
}

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)
4

4 回答 4

16

我遇到了这个问题,这是因为我没有正确关闭我的输出流。

于 2012-01-20T22:19:15.393 回答
8

我相信这与您在Deflaterand中传递“true”的“no-wrap”选项有关Inflater。设置这两个来false解决问题 - 尽管我建议将两个地方的字符串编码设置为(例如,UTF-8)而不是使用系统默认编码。

“nowrap”的文档相当模糊,但他们指出:

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

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

于 2011-08-25T18:21:16.387 回答
0

我也遇到了这个问题,我所做的是清理我的项目:Build > Clean Project

于 2019-08-23T22:16:08.300 回答
-1

我有同样的问题。发生这种情况是因为响应被分块。我通过添加正确的标题来修复它。

HttpHeaders.ACCEPT_ENCODING,"deflate"

于 2020-09-22T23:47:13.640 回答