2011-08-25 79 views
7

DeflaterOutputStreamを使用してJSON文字列をバイト配列に往復しようとしていますが、コードはjava.io.EOFException: Unexpected end of ZLIB input streamです。ZLIB入力ストリームの予期しない終了

文字列を "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'と同様の問題がありました。私はgzippedストリームに書き込んだ後、 'finish()'を呼び出す必要がありました。 – abellina

関連する問題