9

DeflaterOutputStreamを使用してJSON文字列をバイト配列にラウンドトリップしようとしていますが、以下のコードはをスローしjava.io.EOFException: Unexpected end of ZLIB input streamます。

文字列を「Helloworld」に置き換えるか、下の文字列からいくつかの文字を削除すると機能します。

何か案は?

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

と の両方で「true」を渡している「ラップなし」オプションに関係していると思いDeflaterますInflater。これらの両方を設定falseすると問題が解決しますが、システムのデフォルトのエンコーディングを使用する代わりに、両方の場所の文字列エンコーディングを (UTF-8 などに) 設定することをお勧めします。

「nowrap」のドキュメントはかなりあいまいですが、次のように述べています。

注: 'nowrap' オプションを使用する場合、追加の「ダミー」バイトを入力として提供することも必要です。これは、特定の最適化をサポートするために、ZLIB ネイティブ ライブラリで必要になります。

おそらく、このダミー入力バイトが欠落していますが、どこに行くべきかは説明されていません...

于 2011-08-25T18:21:16.387 に答える