5

1 つ以上のバイト配列を収縮させ、後で通常のサイズに膨張させる必要があります。api docsに記載されている例を調べたところ、他の例がいくつか見つかりました。

これらの例に目を通した後、無関係かもしれない 2 つの質問がありますが、これを理解しようとしているので、それらは関連しているように見えます。

  1. API ドキュメントの例では、インフレータとデフレータの両方の出力バッファが 1024 バイトに設定されています。例のデータは短い文にすぎないので、それは妥当です。しかし、出力バッファの大きさをどのように知ることができますか? または、デフレーター (およびインフレータ) は、必要に応じて出力バッファーのサイズを調整しますか?

  2. バッファーのサイズを推測する代わりに、ByteArrayOutputStream を使用して、その周りに DeflatorOutputStream をラップできますか? ByteArrayOutputStream はバイト配列のサイズを変更するため、API の例で行う必要があるように、出力のサイズを知ったり推測したりする必要はありません。

4

2 に答える 2

3

1.API ドキュメントの例では、インフレータとデフレータの両方の出力バッファが 1024 バイトに設定されています。例のデータは短い文にすぎないので、妥当です。しかし、出力バッファの大きさをどのように知ることができますか? または、デフレーター (およびインフレータ) は、必要に応じて出力バッファーのサイズを調整しますか?

ストリームでは、バッファは別のストリームに渡される前の単なる一時的なスペースです。バッファ サイズを変更するとパフォーマンスが変わる可能性がありますが、処理されるデータ量にはほとんど影響しません。

2. バッファのサイズを推測する代わりに、ByteArrayOutputStream を使用して DeflatorOutputStream をラップできますか? ByteArrayOutputStream はバイト配列のサイズを変更するため、API の例で行う必要があるように、出力のサイズを知ったり推測したりする必要はありません。

それを行うことも、データを送りたいストリームに直接送信することもできます。

于 2013-01-07T09:05:09.897 に答える
0

バイト配列を使用した圧縮と解凍の例を次に示します。

import java.util.zip.Deflater;
import java.util.zip.InflaterInputStream;
...

byte[] sourceData; // bytes to compress (reuse byte[] for compressed data)
String filename; // where to write
{
    // compress the data
    Deflater deflater = new Deflater(Deflater.DEFAULT_COMPRESSION);
    deflater.setInput(sourceData);
    deflater.finish();
    int compressedSize = deflater.deflate(data, 0, sourceData.length, Deflater.FULL_FLUSH);

    // write the data   
    OutputStream stream = new FileOutputStream(filename);
    stream.write(data, 0, compressedSize);
    stream.close();
}

{
    byte[] uncompressedData = new byte[1024]; // where to store the data
    // read the data
    InputStream stream = new InflaterInputStream(new FileInputStream(filename)); 
    // read data - note: may not read fully (or evenly), read from stream until len==0
    int len, offset = 0;
    while ((len = stream.read(uncompressedData , offset, uncompressedData .length-offset))>0) {
        offset += len;
    }           
    stream.close();
}
于 2013-05-23T20:42:09.320 に答える