2011-08-25 138 views
7

我正在尝试使用DeflaterOutputStream将JSON字符串往返传递到一个字节数组,但下面的代码会抛出java.io.EOFException: Unexpected end of ZLIB input streamZLIB输入流的意外结束

它用于将字符串替换为“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) 

回答

8

我相信这是与你传递“真”在DeflaterInflater无论是“无包装”选项来执行。将它们都设置为false可以解决这个问题 - 尽管我建议将这两个地方的字符串编码设置为(例如UTF-8),而不是使用系统默认编码。

为“NOWRAP”该文档是相当模糊的,但他们的状态:

注意:如果使用“nowrap”选项的选择,还需要提供额外的“虚拟”字节作为输入。这是ZLIB本地库所必需的,以支持某些优化。

想必这虚拟输入字节丢失,虽然它并不能解释它应该去...

+0

就是这样。添加以下修复问题:\t \t bytes.write(0); – slipheed

+0

@slipheed:很高兴听到它:) –

12

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

+6

我有'GZIPOutputStream'类似的问题。写完压缩流后,我需要调用'finish()'。 – abellina