2009-07-30 15 views
5

java.util.zip.Deflaterのdeflateメソッドを使用する場合、byte []を引数として指定する必要があります。バイト[]をどのくらい大きくする必要がありますか?圧縮データが圧縮されていないデータよりも小さくなるという保証はありません。私は一緒に行かなければならない入力の特定の%がありますか? 現在、私は入力の2倍の大きさにしていますJava圧縮サイズの出力byteArray

答えて

8

deflateを呼び出した後、まだ出力が多いかどうかを確認するためにfinishedを呼び出してください。例えば:あなたはちょうどあなたがByteArrayOutputStreamを使用することができますメモリ内のバイトのすべてを収集する場合

byte[] buffer = new byte[BUFFER_SIZE]; 
while (!deflater.finished()) { 
    int n = deflater.deflate(buffer); 
    // deal with the n bytes in out here 
} 

。例:

byte[] buffer = new byte[BUFFER_SIZE]; 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
while (!deflater.finished()) { 
    int n = deflater.deflate(buffer); 
    baos.write(buffer, 0, n); 
} 
return baos.toByteArray(); 
+2

そして、あなたは、1つの巨大なバイト配列で終わるループの外側 'ByteArrayOutputStream'を作成し、それに追加したい場合それぞれの繰り返しは 'bos.append(out、0、n)' –

+7

と答えました。私はかなりそれを得ることはありません... 入力全体が圧縮されるまでdeflate()を何度も呼び出す必要がありますか? BUFFER_SIZEをどのように設定する必要がありますか? これについて説明するチュートリアルなどがありますか? ありがとう – Clox

+1

何らかの競合状態があったと思います。私が投稿した2番目の例のスニペットとまったく同じです。 :-) –

6

なぜJavaは「デフレータ」としてクラスのスペルが間違っていますか?言葉は「デフレーター」です。まあ!申し訳ありませんが、私の胸からそれを取得する必要がありました。

前述のように、圧縮からすべての出力を得るまでは、deflateを呼び出し続けることが予想されます。しかし、あなたがの場合、実際にを1回の呼び出しで実行したい場合は、デフレートがデータを展開できる量に制限があります。 zlibには、Javaが残念なことにその上限を提供するdeflateBound()と呼ばれる機能があります。あなたはここにコピーされた該当する行と、その関数からバインド保守を使用することができます。

complen = sourceLen + 
      ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; 
関連する問題