クラスDeflater

java.lang.Object
java.util.zip.Deflater

public class Deflater extends Object
このクラスは、一般的なZLIB圧縮ライブラリを使用して汎用の圧縮アルゴリズ をサポートします。 ZLIB圧縮ライブラリは、当初PNGグラフィック標準の一部として開発されたもので、特許では保護されていません。 詳細については「パッケージjava.util.zipの説明」の仕様を参照してく さい。

特に記載がないかぎり、このクラスのメソッドにnull引数を渡すと、NullPointerExceptionがスローされます。

このクラスは、バイト・シーケンスをZLIB圧縮データ形式に定義しません。 入力バイト・シーケンスは、setInput()メソッドの1つを介してバイト配列またはバイト・バッファで提供されます。 出力バイト・シーケンスは、deflate()メソッドに渡された出力バイト配列またはバイト・バッファに書き込まれます。

次のコード・フラグメントは、DeflaterおよびInflaterを使用した文字列の簡単な圧縮および解凍を示しています。


// Encode a String into bytes
String inputString = "blahblahblah\u20AC\u20AC";
byte[] input = inputString.getBytes(StandardCharsets.UTF_8);

// Compress the bytes
ByteArrayOutputStream compressedBaos = new ByteArrayOutputStream();
Deflater compressor = new Deflater();
try {
    compressor.setInput(input);
    // Let the compressor know that the complete input
    // has been made available
    compressor.finish();
    // Keep compressing the input till the compressor
    // is finished compressing
    while (!compressor.finished()) {
        // Use some reasonable size for the temporary buffer
        // based on the data being compressed
        byte[] tmpBuffer = new byte[100];
        int numCompressed = compressor.deflate(tmpBuffer);
        // Copy over the compressed bytes from the temporary
        // buffer into the final byte array
        compressedBaos.write(tmpBuffer, 0, numCompressed);
    }
} finally {
    // Release the resources held by the compressor
    compressor.end();
}

// Decompress the bytes
Inflater decompressor = new Inflater();
ByteArrayOutputStream decompressedBaos = new ByteArrayOutputStream();
try {
    byte[] compressed = compressedBaos.toByteArray();
    decompressor.setInput(compressed, 0, compressed.length);
    while (!decompressor.finished()) {
        // Use some reasonable size for the temporary buffer,
        // based on the data being decompressed; in this example,
        // we use a small buffer size
        byte[] tmpBuffer = new byte[100];
        int numDecompressed = 0;
        try {
            numDecompressed = decompressor.inflate(tmpBuffer);
        } catch (DataFormatException dfe) {
            // Handle the exception suitably, in this example
            // we just rethrow it
            throw new RuntimeException(dfe);
        }
        // Copy over the decompressed bytes from the temporary
        // buffer into the final byte array
        decompressedBaos.write(tmpBuffer, 0, numDecompressed);
    }
} finally {
    // Release the resources held by the decompressor
    decompressor.end();
}
// Decode the bytes into a String
String outputString = decompressedBaos.toString(StandardCharsets.UTF_8);

APIのノート:
このDeflaterによって使用されるリソースを解放するには、end()メソッドを明示的に呼び出す必要があります。 サブクラスは、サブクラスによって獲得されたリソースのクリーンアップを担当します。 クリーンアップを実行するためにObject.finalize()をオーバーライドするサブクラスは、Cleanerなどの代替クリーンアップ・メカニズ を使用し、オーバーライドするfinalizeメソッドを削除するように変更する必要があります。
導入されたバージョン:
1.1
関連 目:
  • フィールドのサマリー

    フィールド
    修飾子と型
    フィールド
    説明
    static final int
    最適な圧縮のための圧縮レベルです。
    static final int
    最高速での圧縮のための圧縮レベルです。
    static final int
    デフォルトの圧縮レベルです。
    static final int
    デフォルトの圧縮方法です。
    static final int
    deflateアルゴリズ のための圧縮メソッド(現在サポートされているのは1つ け)です。
    static final int
    小さい値がある程度ランダ に分布しているデータに最適な圧縮方法です。
    static final int
    保留中のすべての出力をフラッシュし、デフレータをリセットするために使用される圧縮フラッシュ・モード。
    static final int
    ハフマン符号化 けのための圧縮方法です。
    static final int
    圧縮しない 合の圧縮レベルです。
    static final int
    最高の圧縮結果を実現するために使用される圧縮フラッシュ・モード。
    static final int
    保留中のすべての出力をフラッシュするために使用される圧縮フラッシュ・モードで、一部の圧縮アルゴリズ では圧縮率が低下することがあります。
  • コンストラクタのサマリー

    コンストラクタ
    コンストラクタ
    説明
    デフォルトの圧縮レベルで新しいコンプレッサを作成します。
    Deflater(int level)
    指定された圧縮レベルで新しいコンプレッサを作成します。
    Deflater(int level, boolean nowrap)
    指定された圧縮レベルで新しいコンプレッサを作成します。
  • メソッドのサマリー

    修飾子と型
    メソッド
    説明
    int
    deflate(byte[] output)
    入力データを圧縮し、指定されたバッファに圧縮されたデータを挿入します。
    int
    deflate(byte[] output, int off, int len)
    入力データを圧縮し、指定されたバッファに圧縮されたデータを挿入します。
    int
    deflate(byte[] output, int off, int len, int flush)
    入力データを圧縮し、指定されたバッファに圧縮されたデータを挿入します。
    int
    入力データを圧縮し、指定されたバッファに圧縮されたデータを挿入します。
    int
    deflate(ByteBuffer output, int flush)
    入力データを圧縮し、指定されたバッファに圧縮されたデータを挿入します。
    void
    end()
    コンプレッサを閉じ、圧縮解除された入力をすべて 棄します。
    void
    このメソッドが呼び出されると、圧縮が入力バッファの現在の内容で終了する必要があることを示します。
    boolean
    圧縮データ出力ストリー の最後に達した 合にtrueを返します。
    int
    圧縮解除データのADLER-32値を返します。
    long
    これまでに入力された、圧縮解除されたバイトの総数を返します。
    long
    これまでに出力された、圧縮されたバイトの総数を返します。
    int
    非推奨。
    代わりにgetBytesRead()を使用してく さい
    int
    非推奨。
    代わりにgetBytesWritten()を使用してく さい
    boolean
    入力バッファにデータが残っていない 合にtrueを返します。
    void
    新しい入力データのセットを処理できるようにデフレータをリセットします。
    void
    setDictionary(byte[] dictionary)
    圧縮のためのプリセット・ディクショナリを設定します。
    void
    setDictionary(byte[] dictionary, int off, int len)
    圧縮のためのプリセット・ディクショナリを設定します。
    void
    圧縮のためのプリセット・ディクショナリを設定します。
    void
    setInput(byte[] input)
    圧縮のための入力データを設定します。
    void
    setInput(byte[] input, int off, int len)
    圧縮のための入力データを設定します。
    void
    圧縮のための入力データを設定します。
    void
    setLevel(int level)
    圧縮レベルを指定された値に設定します。
    void
    setStrategy(int strategy)
    圧縮方法を指定された値に設定します。

    クラスjava.lang.Objectで宣言されたメソッド

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • フィールド詳細

    • DEFLATED

      public static final int DEFLATED
      deflateアルゴリズ のための圧縮メソッド(現在サポートされているのは1つ け)です。
      関連 目:
    • NO_COMPRESSION

      public static final int NO_COMPRESSION
      圧縮しない 合の圧縮レベルです。
      関連 目:
    • BEST_SPEED

      public static final int BEST_SPEED
      最高速での圧縮のための圧縮レベルです。
      関連 目:
    • BEST_COMPRESSION

      public static final int BEST_COMPRESSION
      最適な圧縮のための圧縮レベルです。
      関連 目:
    • DEFAULT_COMPRESSION

      public static final int DEFAULT_COMPRESSION
      デフォルトの圧縮レベルです。
      関連 目:
    • FILTERED

      public static final int FILTERED
      小さい値がある程度ランダ に分布しているデータに最適な圧縮方法です。 ハフマン・コーディングを増やし、文字列マッチングを減らします。
      関連 目:
    • HUFFMAN_ONLY

      public static final int HUFFMAN_ONLY
      ハフマン符号化 けのための圧縮方法です。
      関連 目:
    • DEFAULT_STRATEGY

      public static final int DEFAULT_STRATEGY
      デフォルトの圧縮方法です。
      関連 目:
    • NO_FLUSH

      public static final int NO_FLUSH
      最高の圧縮結果を実現するために使用される圧縮フラッシュ・モード。
      導入されたバージョン:
      1.7
      関連 目:
    • SYNC_FLUSH

      public static final int SYNC_FLUSH
      保留中のすべての出力をフラッシュするために使用される圧縮フラッシュ・モードで、一部の圧縮アルゴリズ では圧縮率が低下することがあります。
      導入されたバージョン:
      1.7
      関連 目:
    • FULL_FLUSH

      public static final int FULL_FLUSH
      保留中のすべての出力をフラッシュし、デフレータをリセットするために使用される圧縮フラッシュ・モード。 このモードを 繁に使用すると、圧縮率が著しく低下することがあります。
      導入されたバージョン:
      1.7
      関連 目:
  • コンストラクタの詳細

    • Deflater

      public Deflater(int level, boolean nowrap)
      指定された圧縮レベルで新しいコンプレッサを作成します。 パラメータnowrapがtrueの 合、ZLIBヘッダー・フィールドおよびチェックサ ・フィールドは、GZIPおよびPKZIPの両方で使用される圧縮形式のサポートには使用されません。
      パラメータ:
      level - 圧縮レベル(0 - 9)
      nowrap - trueの 合はGZIP互換の圧縮を使用
    • Deflater

      public Deflater(int level)
      指定された圧縮レベルで新しいコンプレッサを作成します。 圧縮データはZLIB形式で生成されます。
      パラメータ:
      level - 圧縮レベル(0 - 9)
    • Deflater

      public Deflater()
      デフォルトの圧縮レベルで新しいコンプレッサを作成します。 圧縮データはZLIB形式で生成されます。
  • メソッドの詳細

    • setInput

      public void setInput(byte[] input, int off, int len)
      圧縮のための入力データを設定します。

      needsInput()がtrueを返し、さらに多くの入力データが必要であることを示す 合は常に、setInput()メソッドの1つをコールする必要があります。

      パラメータ:
      input - 入力データ・バイト
      off - データの開始オフセット
      len - データの長さ
      関連 目:
    • setInput

      public void setInput(byte[] input)
      圧縮のための入力データを設定します。

      needsInput()がtrueを返し、さらに多くの入力データが必要であることを示す 合は常に、setInput()メソッドの1つをコールする必要があります。

      パラメータ:
      input - 入力データ・バイト
      関連 目:
    • setInput

      public void setInput(ByteBuffer input)
      圧縮のための入力データを設定します。

      needsInput()がtrueを返し、さらに多くの入力データが必要であることを示す 合は常に、setInput()メソッドの1つをコールする必要があります。

      遅延処理が実行されると、指定されたバッファ位置はバッファ制限まで拡張されます。 入力バッファは遅延操作間で(再請求済)を変更できます。変更することは、新規バッファを作成してこのメソッドで設定することと同じです。

      入力バッファの内容、位置または制限を遅延操作と同時に変更すると、予期しない動作や操作の失敗などの未定義の動作が発生します。

      パラメータ:
      input - 入力データ・バイト
      導入されたバージョン:
      11
      関連 目:
    • setDictionary

      public void setDictionary(byte[] dictionary, int off, int len)
      圧縮のためのプリセット・ディクショナリを設定します。 プリセット・ディクショナリは、履歴バッファがあらかじめ決定できるときに使用されます。 データがあとでInflater.inflate()によって圧縮解除されるときに、Inflater.getAdler()を呼び出して圧縮解除に必要なディクショナリのAdler-32値を取得できます。
      パラメータ:
      dictionary - ディクショナリ・データ・バイト
      off - データの開始オフセット
      len - データの長さ
      関連 目:
    • setDictionary

      public void setDictionary(byte[] dictionary)
      圧縮のためのプリセット・ディクショナリを設定します。 プリセット・ディクショナリは、履歴バッファがあらかじめ決定できるときに使用されます。 データがあとでInflater.inflate()によって圧縮解除されるときに、Inflater.getAdler()を呼び出して圧縮解除に必要なディクショナリのAdler-32値を取得できます。
      パラメータ:
      dictionary - ディクショナリ・データ・バイト
      関連 目:
    • setDictionary

      public void setDictionary(ByteBuffer dictionary)
      圧縮のためのプリセット・ディクショナリを設定します。 プリセット・ディクショナリは、履歴バッファがあらかじめ決定できるときに使用されます。 データがあとでInflater.inflate()によって圧縮解除されるときに、Inflater.getAdler()を呼び出して圧縮解除に必要なディクショナリのAdler-32値を取得できます。

      指定されたbyteバッファのバイトは、このメソッドによって完全に消費されます。 戻ったとき、その位置は制限と等しくなります。

      パラメータ:
      dictionary - ディクショナリ・データ・バイト
      導入されたバージョン:
      11
      関連 目:
    • setStrategy

      public void setStrategy(int strategy)
      圧縮方法を指定された値に設定します。

      圧縮方法を変更した 合、deflateの次の呼び出しでは、古い方法でこれまで使用可能な入力が圧縮されます(およびフラッシュされることがあります)。新しい方法はその呼び出しの後にのみ有効になります。

      パラメータ:
      strategy - 新しい圧縮方法
      スロー:
      IllegalArgumentException - 圧縮方法が無効な 合
    • setLevel

      public void setLevel(int level)
      圧縮レベルを指定された値に設定します。

      圧縮レベルを変更した 合、deflateの次の呼び出しでは、古いレベルでこれまで使用可能な入力が圧縮されます(およびフラッシュされることがあります)。新しいレベルはその呼び出しの後にのみ有効になります。

      パラメータ:
      level - 新しい圧縮レベル(0 - 9)
      スロー:
      IllegalArgumentException - 圧縮レベルが無効な 合
    • needsInput

      public boolean needsInput()
      入力バッファにデータが残っていない 合にtrueを返します。 これを使用して、より多くの入力を提供するために、setInput()メソッドの1つをコールする必要があるかどうかを判断できます。
      戻り値:
      入力データ・バッファが空なので、さらに入力を提供するためにsetInput()を呼び出す必要がある 合はtrue
    • finish

      public void finish()
      このメソッドが呼び出されると、圧縮が入力バッファの現在の内容で終了する必要があることを示します。
    • finished

      public boolean finished()
      圧縮データ出力ストリー の最後に達した 合にtrueを返します。
      戻り値:
      圧縮データ出力ストリー の最後に達した 合はtrue
    • deflate

      public int deflate(byte[] output, int off, int len)
      入力データを圧縮し、指定されたバッファに圧縮されたデータを挿入します。 実際に圧縮されたデータのバイト数を返します。 戻り値0は、入力データがさらに必要かどうかを判断するためにneedsInputを呼び出す必要があることを示します。

      このメソッドは、その圧縮フラッシュ・モードとしてNO_FLUSHを使用します。 形式deflater.deflate(b, off, len)のこのメソッドの呼出しでは、deflater.deflate(b, off, len, Deflater.NO_FLUSH)の呼び出しと同じ結果が得られます。

      パラメータ:
      output - 圧縮データ用のバッファ
      off - データの開始オフセット
      len - 圧縮データの最大バイト数
      戻り値:
      出力バッファに書き込まれた圧縮データの実際のバイト数
    • deflate

      public int deflate(byte[] output)
      入力データを圧縮し、指定されたバッファに圧縮されたデータを挿入します。 実際に圧縮されたデータのバイト数を返します。 戻り値0は、入力データがさらに必要かどうかを判断するためにneedsInputを呼び出す必要があることを示します。

      このメソッドは、その圧縮フラッシュ・モードとしてNO_FLUSHを使用します。 形式deflater.deflate(b)のこのメソッドの呼出しでは、deflater.deflate(b, 0, b.length, Deflater.NO_FLUSH)の呼び出しと同じ結果が得られます。

      パラメータ:
      output - 圧縮データ用のバッファ
      戻り値:
      出力バッファに書き込まれた圧縮データの実際のバイト数
    • deflate

      public int deflate(ByteBuffer output)
      入力データを圧縮し、指定されたバッファに圧縮されたデータを挿入します。 実際に圧縮されたデータのバイト数を返します。 戻り値0は、入力データがさらに必要かどうかを判断するためにneedsInputを呼び出す必要があることを示します。

      このメソッドは、その圧縮フラッシュ・モードとしてNO_FLUSHを使用します。 deflater.deflate(output)形式のこのメソッドを呼び出すと、deflater.deflate(output, Deflater.NO_FLUSH)の呼出しと同じ結果が得られます。

      パラメータ:
      output - 圧縮データ用のバッファ
      戻り値:
      出力バッファに書き込まれた圧縮データの実際のバイト数
      スロー:
      ReadOnlyBufferException - 指定された出力バッファが読取り専用の 合
      導入されたバージョン:
      11
    • deflate

      public int deflate(byte[] output, int off, int len, int flush)
      入力データを圧縮し、指定されたバッファに圧縮されたデータを挿入します。 実際に圧縮されたデータのバイト数を返します。

      圧縮フラッシュ・モードは、次の3つのモードのいずれかになります。

      • NO_FLUSH: 最高の圧縮を達成するために、デフレータが出力を生成するまでに蓄積されるデータの量を決定できるようにします(通常の使用シナリオで使用する)。 このフラッシュ・モードでの戻り値0は、入力データがさらに必要かどうかを判断するためにneedsInput()を呼び出すべきであることを示します。
      • SYNC_FLUSH: 圧縮されたデータに機能するインフレータがそれまでに使用可能なすべての入力データを取得できるようにするため、デフレータのすべての保留中の出力が指定された出力バッファにフラッシュされます(特に、needsInput()は十分な出力スペースが提供されている 合、この呼出しのあとにtrueを返す)。 SYNC_FLUSHを使用してフラッシュすると、一部の圧縮アルゴリズ で圧縮率が低下することがあるため、これは必要な 合にのみ使用してく さい。
      • FULL_FLUSH: SYNC_FLUSHと同じように、すべての保留中の出力がフラッシュされます。 圧縮状態がリセットされるため、圧縮された出力データに機能するインフレータは、前の圧縮データが 損したか、ランダ ・アクセスが要求されている 合に、このポイントから再開できます。 FULL_FLUSHを 繁に使用すると、圧縮率が著しく低下することがあります。

      FULL_FLUSHまたはSYNC_FLUSHの例で、戻り値がlen (出力バッファbの使用可能な 域)の 合、このメソッドは同じflushパラメータともっと大きな出力 域で再度呼び出してく さい。 フラッシュ・マーカー(5バイト)が、このメソッドが呼び出されるたびに出力バッファに繰り返し出力されないように、lenが6より大きいことを確認してく さい。

      setInput(ByteBuffer)メソッドがコールされ、入力にバッファが提供された 合、入力バッファの位置は、この操作で消費されるバイト数 け増 します。

      パラメータ:
      output - 圧縮データ用のバッファ
      off - データの開始オフセット
      len - 圧縮データの最大バイト数
      flush - 圧縮フラッシュ・モード
      戻り値:
      出力バッファに書き込まれた圧縮データの実際のバイト数
      スロー:
      IllegalArgumentException - フラッシュ・モードが無効な 合
      導入されたバージョン:
      1.7
    • deflate

      public int deflate(ByteBuffer output, int flush)
      入力データを圧縮し、指定されたバッファに圧縮されたデータを挿入します。 実際に圧縮されたデータのバイト数を返します。

      圧縮フラッシュ・モードは、次の3つのモードのいずれかになります。

      • NO_FLUSH: 最高の圧縮を達成するために、デフレータが出力を生成するまでに蓄積されるデータの量を決定できるようにします(通常の使用シナリオで使用する)。 このフラッシュ・モードでの戻り値0は、入力データがさらに必要かどうかを判断するためにneedsInput()を呼び出すべきであることを示します。
      • SYNC_FLUSH: 圧縮されたデータに機能するインフレータがそれまでに使用可能なすべての入力データを取得できるようにするため、デフレータのすべての保留中の出力が指定された出力バッファにフラッシュされます(特に、needsInput()は十分な出力スペースが提供されている 合、この呼出しのあとにtrueを返す)。 SYNC_FLUSHを使用してフラッシュすると、一部の圧縮アルゴリズ で圧縮率が低下することがあるため、これは必要な 合にのみ使用してく さい。
      • FULL_FLUSH: SYNC_FLUSHと同じように、すべての保留中の出力がフラッシュされます。 圧縮状態がリセットされるため、圧縮された出力データに機能するインフレータは、前の圧縮データが 損したか、ランダ ・アクセスが要求されている 合に、このポイントから再開できます。 FULL_FLUSHを 繁に使用すると、圧縮率が著しく低下することがあります。

      FULL_FLUSHまたはSYNC_FLUSHの 合、戻り値がバッファの「残りの 域」と等しい 合は、このメソッドを同じflushパラメータとより多くの出力 域を使用して再度呼び出す必要があります。 このメソッドが呼び出されるたびに、(5バイト)が出力バッファに繰り返し出力されるマーカーを回避するために、バッファには残りの 域が6バイト以上あることを確認してく さい。

      成功すると、指定されたoutputバイト・バッファの位置が操作によって生成されたバイト数 け拡大されます。これは、このメソッドによって返された数と同じです。

      setInput(ByteBuffer)メソッドがコールされ、入力にバッファが提供された 合、入力バッファの位置は、この操作で消費されるバイト数 け増 します。

      パラメータ:
      output - 圧縮データ用のバッファ
      flush - 圧縮フラッシュ・モード
      戻り値:
      出力バッファに書き込まれた圧縮データの実際のバイト数
      スロー:
      IllegalArgumentException - フラッシュ・モードが無効な 合
      ReadOnlyBufferException - 指定された出力バッファが読取り専用の 合
      導入されたバージョン:
      11
    • getAdler

      public int getAdler()
      圧縮解除データのADLER-32値を返します。
      戻り値:
      圧縮解除データのADLER-32値
    • getTotalIn

      @Deprecated(since="23") public int getTotalIn()
      非推奨。
      代わりにgetBytesRead()を使用してく さい
      これまでに入力された、圧縮解除されたバイトの総数を返します。
      実装要件:
      このメソッドは(int) getBytesRead()と同等のものを返すため、Integer.MAX_VALUEより大きい 合、正しい値を返すことはできません。
      戻り値:
      これまでに入力された、圧縮解除されたバイトの総数
    • getBytesRead

      public long getBytesRead()
      これまでに入力された、圧縮解除されたバイトの総数を返します。
      戻り値:
      これまでに入力された、圧縮解除されたバイトの総数( ではない値)
      導入されたバージョン:
      1.5
    • getTotalOut

      @Deprecated(since="23") public int getTotalOut()
      非推奨。
      代わりにgetBytesWritten()を使用してく さい
      これまでに出力された、圧縮されたバイトの総数を返します。
      実装要件:
      このメソッドは(int) getBytesWritten()と同等のものを返すため、Integer.MAX_VALUEより大きい 合、正しい値を返すことはできません。
      戻り値:
      これまでに出力された、圧縮されたバイトの総数
    • getBytesWritten

      public long getBytesWritten()
      これまでに出力された、圧縮されたバイトの総数を返します。
      戻り値:
      これまでに出力された、圧縮されたバイトの総数( ではない値)
      導入されたバージョン:
      1.5
    • reset

      public void reset()
      新しい入力データのセットを処理できるようにデフレータをリセットします。 現在の圧縮レベルと圧縮方法を保持します。
    • end

      public void end()
      コンプレッサを閉じ、圧縮解除された入力をすべて 棄します。 このメソッドは、コンプレッサが使用されなくなったときに呼び出される必要があります。 このメソッドが呼び出されたあとのDeflaterオブジェクトの動作は保証されません。