広告

Java : Inflater (ZIP) - API使用例

Inflater (Java SE 19 & JDK 19) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。


概要

このクラスは、一般的なZLIB圧縮ライブラリを使用して汎用の圧縮解除をサポートします。 ZLIB圧縮ライブラリは、当初PNGグラフィック標準の一部として開発されたもので、特許では保護されていません。

クラス構成

Inflater クラスを使うと、ZLIB圧縮ライブラリで圧縮されたデータを解凍できます。
ただし、Inflater クラスは使い方が少し煩雑です。代わりに下記の関連クラスを使った方がよいかもしれません。

// --------
// 圧縮
final var deflater = new Deflater();
final var compressed = new byte[15];
int compressedLength;
try {
    final var input = "aaaaa".getBytes();

    // [97, 97, 97, 97, 97]
    System.out.println(Arrays.toString(input));

    deflater.setInput(input);
    deflater.finish();

    compressedLength = deflater.deflate(compressed);

    // 11
    System.out.println(compressedLength);

    // [120, -100, 75, 76, 4, 2, 0, 5, -76, 1, -26, 0, 0, 0, 0]
    System.out.println(Arrays.toString(compressed));
} finally {
    deflater.end();
}

// --------
// 解凍
final var inflater = new Inflater();
try {
    inflater.setInput(compressed, 0, compressedLength);

    final var decompressed = new byte[10];
    final var decompressedLength = inflater.inflate(decompressed);

    // 5
    System.out.println(decompressedLength);

    // [97, 97, 97, 97, 97, 0, 0, 0, 0, 0]
    System.out.println(Arrays.toString(decompressed));

    // aaaaa
    System.out.println(new String(decompressed, 0, decompressedLength));
} finally {
    inflater.end();
}

deflate メソッドについてはこちら

final var input = deflate("aaaXXXbbbYYY");

// [120, -100, 75, 76, 76, -116, -120, -120, 72, 74, 74,
//  -118, -116, -116, 4, 0, 28, -95, 4, 93]
System.out.println(Arrays.toString(input));

// 20
System.out.println(input.length);

final var inflater = new Inflater();
try {
    inflater.setInput(input);

    System.out.println("-- inflate --");
    while (!inflater.finished()) {
        final var output = new byte[5];
        final var length = inflater.inflate(output);
        System.out.printf("length=%d : %s%n", length, new String(output, 0, length));
    }
} finally {
    inflater.end();
}

// 結果
// ↓
//-- inflate --
//length=5 : aaaXX
//length=5 : XbbbY
//length=2 : YY

共通で使うメソッド

本記事のコード例では、利便性のために以下のメソッドを使います。

// 文字列を圧縮します。
public byte[] deflate(String str) throws IOException {
    final var out = new ByteArrayOutputStream();
    try (final var dos = new DeflaterOutputStream(out)) {
        dos.write(str.getBytes());
    }

    return out.toByteArray();
}

コンストラクタ

Inflater ()

新しいデコンプレッサを作成します。

deflate メソッドについてはこちら

final var input = deflate("aaaaa");

// [120, -100, 75, 76, 4, 2, 0, 5, -76, 1, -26]
System.out.println(Arrays.toString(input));

final var inflater = new Inflater();
try {
    inflater.setInput(input);

    final var output = new byte[10];
    final var length = inflater.inflate(output);

    // 5
    System.out.println(length);

    // [97, 97, 97, 97, 97, 0, 0, 0, 0, 0]
    System.out.println(Arrays.toString(output));

    // aaaaa
    System.out.println(new String(output, 0, length));
} finally {
    inflater.end();
}

Inflater (boolean nowrap)

新しいデコンプレッサを作成します。

final var deflater = new Deflater(Deflater.DEFAULT_COMPRESSION, true);
final var compressed = new byte[10];
int compressLength;
try {
    final var input = "aaaXXX".getBytes();

    // [97, 97, 97, 88, 88, 88]
    System.out.println(Arrays.toString(input));

    deflater.setInput(input);
    deflater.finish();

    compressLength = deflater.deflate(compressed);

    // 8
    System.out.println(compressLength);

    // [75, 76, 76, -116, -120, -120, 0, 0, 0, 0]
    System.out.println(Arrays.toString(compressed));
} finally {
    deflater.end();
}

final var inflater = new Inflater(true);
try {
    inflater.setInput(compressed, 0, compressLength);

    final var uncompressed = new byte[10];
    final var uncompressedLength = inflater.inflate(uncompressed);

    // 6
    System.out.println(uncompressedLength);

    // [97, 97, 97, 88, 88, 88, 0, 0, 0, 0]
    System.out.println(Arrays.toString(uncompressed));

    // aaaXXX
    System.out.println(new String(uncompressed, 0, uncompressedLength));
} finally {
    inflater.end();
}

メソッド

void end ()

デコンプレッサを閉じ、圧縮解除された入力をすべて破棄します。

このメソッドの使用例は、inflate(byte[] output) にまとめて記載しました。
そちらのAPI使用例をご参照ください。

boolean finished ()

圧縮データ・ストリームの最後に達した場合にtrueを返します。

このメソッドの使用例は、inflate(byte[] output) にまとめて記載しました。
そちらのAPI使用例をご参照ください。

int getAdler ()

圧縮解除データのADLER-32値を返します。

deflate メソッドについてはこちら

final var input = deflate("aaaaa");

// [120, -100, 75, 76, 4, 2, 0, 5, -76, 1, -26]
System.out.println(Arrays.toString(input));

final var inflater = new Inflater();
try {
    inflater.setInput(input);
    System.out.println(inflater.getAdler()); // 1

    final var output = new byte[10];
    System.out.println(inflater.inflate(output)); // 5

    // [97, 97, 97, 97, 97, 0, 0, 0, 0, 0]
    System.out.println(Arrays.toString(output));

    System.out.println(inflater.getAdler()); // 95683046
} finally {
    inflater.end();
}

long getBytesRead ()

これまでに入力された、圧縮されたバイトの総数を返します。

deflate メソッドについてはこちら

final var input = deflate("aaaXXXbbbYYY");

// [120, -100, 75, 76, 76, -116, -120, -120, 72, 74, 74,
//  -118, -116, -116, 4, 0, 28, -95, 4, 93]
System.out.println(Arrays.toString(input));

// 20
System.out.println(input.length);

final var inflater = new Inflater();
try {
    inflater.setInput(input);

    System.out.println("-- inflate --");
    while (!inflater.finished()) {
        final var output = new byte[5];
        final var length = inflater.inflate(output);
        final var total = inflater.getBytesRead();
        System.out.printf("length=%d : total=%2d : %s%n",
                length, total, new String(output, 0, length));
    }
} finally {
    inflater.end();
}

// 結果
// ↓
//-- inflate --
//length=5 : total= 9 : aaaXX
//length=5 : total=14 : XbbbY
//length=2 : total=20 : YY

long getBytesWritten ()

これまでに出力された、圧縮解除されたバイトの総数を返します。

deflate メソッドについてはこちら

final var input = deflate("aaaXXXbbbYYY");

// [120, -100, 75, 76, 76, -116, -120, -120, 72, 74, 74,
//  -118, -116, -116, 4, 0, 28, -95, 4, 93]
System.out.println(Arrays.toString(input));

// 20
System.out.println(input.length);

final var inflater = new Inflater();
try {
    inflater.setInput(input);

    System.out.println("-- inflate --");
    while (!inflater.finished()) {
        final var output = new byte[5];
        final var length = inflater.inflate(output);
        final var total = inflater.getBytesWritten();
        System.out.printf("length=%d : total=%2d : %s%n",
                length, total, new String(output, 0, length));
    }
} finally {
    inflater.end();
}

// 結果
// ↓
//-- inflate --
//length=5 : total= 5 : aaaXX
//length=5 : total=10 : XbbbY
//length=2 : total=12 : YY

int getRemaining ()

入力バッファに残っているバイトの総数を返します。

deflate メソッドについてはこちら

final var input = deflate("aaaXXXbbbYYY");

// [120, -100, 75, 76, 76, -116, -120, -120, 72, 74, 74,
//  -118, -116, -116, 4, 0, 28, -95, 4, 93]
System.out.println(Arrays.toString(input));

// 20
System.out.println(input.length);

final var inflater = new Inflater();
try {
    inflater.setInput(input);

    System.out.println("-- inflate --");
    while (!inflater.finished()) {
        final var output = new byte[5];
        final var length = inflater.inflate(output);
        final var total = inflater.getRemaining();
        System.out.printf("length=%d : total=%2d : %s%n",
                length, total, new String(output, 0, length));
    }
} finally {
    inflater.end();
}

// 結果
// ↓
//-- inflate --
//length=5 : total=11 : aaaXX
//length=5 : total= 6 : XbbbY
//length=2 : total= 0 : YY

int getTotalIn ()

これまでに入力された、圧縮されたバイトの総数を返します。

deflate メソッドについてはこちら

関連:getBytesRead()

final var input = deflate("aaaXXXbbbYYY");

// [120, -100, 75, 76, 76, -116, -120, -120, 72, 74, 74,
//  -118, -116, -116, 4, 0, 28, -95, 4, 93]
System.out.println(Arrays.toString(input));

// 20
System.out.println(input.length);

final var inflater = new Inflater();
try {
    inflater.setInput(input);

    System.out.println("-- inflate --");
    while (!inflater.finished()) {
        final var output = new byte[5];
        final var length = inflater.inflate(output);
        final var total = inflater.getTotalIn();
        System.out.printf("length=%d : total=%2d : %s%n",
                length, total, new String(output, 0, length));
    }
} finally {
    inflater.end();
}

// 結果
// ↓
//-- inflate --
//length=5 : total= 9 : aaaXX
//length=5 : total=14 : XbbbY
//length=2 : total=20 : YY

int getTotalOut ()

これまでに出力された、圧縮解除されたバイトの総数を返します。

deflate メソッドについてはこちら

関連:getBytesWritten()

final var input = deflate("aaaXXXbbbYYY");

// [120, -100, 75, 76, 76, -116, -120, -120, 72, 74, 74,
//  -118, -116, -116, 4, 0, 28, -95, 4, 93]
System.out.println(Arrays.toString(input));

// 20
System.out.println(input.length);

final var inflater = new Inflater();
try {
    inflater.setInput(input);

    System.out.println("-- inflate --");
    while (!inflater.finished()) {
        final var output = new byte[5];
        final var length = inflater.inflate(output);
        final var total = inflater.getTotalOut();
        System.out.printf("length=%d : total=%2d : %s%n",
                length, total, new String(output, 0, length));
    }
} finally {
    inflater.end();
}

// 結果
// ↓
//-- inflate --
//length=5 : total= 5 : aaaXX
//length=5 : total=10 : XbbbY
//length=2 : total=12 : YY

int inflate (byte[] output)

指定されたバッファにバイトを圧縮解除します。

deflate メソッドについてはこちら

final var input = deflate("aaaXXXbbbYYY");

// [120, -100, 75, 76, 76, -116, -120, -120, 72, 74, 74,
//  -118, -116, -116, 4, 0, 28, -95, 4, 93]
System.out.println(Arrays.toString(input));

// 20
System.out.println(input.length);

final var inflater = new Inflater();
try {
    inflater.setInput(input);

    System.out.println("-- inflate --");
    while (!inflater.finished()) {
        final var output = new byte[5];
        final var length = inflater.inflate(output);
        System.out.printf("length=%d : %s%n", length, new String(output, 0, length));
    }
} finally {
    inflater.end();
}

// 結果
// ↓
//-- inflate --
//length=5 : aaaXX
//length=5 : XbbbY
//length=2 : YY

int inflate (byte[] output, int off, int len)

指定されたバッファにバイトを圧縮解除します。

deflate メソッドについてはこちら

final var input = deflate("aaaaa");

// [120, -100, 75, 76, 4, 2, 0, 5, -76, 1, -26]
System.out.println(Arrays.toString(input));

// 11
System.out.println(input.length);

final var inflater = new Inflater();
try {
    inflater.setInput(input);

    final var output1 = new byte[10];
    System.out.println(inflater.inflate(output1)); // 5

    // [97, 97, 97, 97, 97, 0, 0, 0, 0, 0]
    System.out.println(Arrays.toString(output1));

    inflater.reset();
    inflater.setInput(input);

    final var output2 = new byte[10];
    System.out.println(inflater.inflate(output2, 2, 7)); // 5

    // [0, 0, 97, 97, 97, 97, 97, 0, 0, 0]
    System.out.println(Arrays.toString(output2));
} finally {
    inflater.end();
}

int inflate (ByteBuffer output)

指定されたバッファにバイトを圧縮解除します。

deflate メソッドについてはこちら

final var input = deflate("aaaaa");

// [120, -100, 75, 76, 4, 2, 0, 5, -76, 1, -26]
System.out.println(Arrays.toString(input));

// 11
System.out.println(input.length);

final var inflater = new Inflater();
try {
    inflater.setInput(input);

    final var output = ByteBuffer.allocate(10);
    final var length = inflater.inflate(output);

    System.out.println(length); // 5
    System.out.println(output); // java.nio.HeapByteBuffer[pos=5 lim=10 cap=10]

    // [97, 97, 97, 97, 97, 0, 0, 0, 0, 0]
    System.out.println(Arrays.toString(output.array()));

    // aaaaa
    System.out.println(new String(output.array(), 0, length));
} finally {
    inflater.end();
}

boolean needsDictionary ()

プリセット・ディクショナリが圧縮解除に必要な場合にtrueを返します。

このメソッドの使用例は、setDictionary(byte[] dictionary) にまとめて記載しました。
そちらのAPI使用例をご参照ください。

boolean needsInput ()

入力バッファにデータが残っていない場合にtrueを返します。

deflate メソッドについてはこちら

final var input = deflate("aaaaXXXX");

// [120, -100, 75, 76, 76, 76, -116, 0, 2, 0, 13, 82, 2, -27]
System.out.println(Arrays.toString(input));

// 14
System.out.println(input.length);

final var inflater = new Inflater();
try {
    inflater.setInput(input);

    final var output1 = new byte[5];
    final var length1 = inflater.inflate(output1);

    System.out.println(length1); // 5
    System.out.println(new String(output1, 0, length1)); // aaaaX
    System.out.println(inflater.needsInput()); // false

    final var output2 = new byte[5];
    final var length2 = inflater.inflate(output2);

    System.out.println(length2); // 3
    System.out.println(new String(output2, 0, length2)); // XXX
    System.out.println(inflater.needsInput()); // true
} finally {
    inflater.end();
}

void reset ()

新しい入力データ・セットが処理できるようにインフレータをリセットします。

このメソッドの使用例は、inflate(byte[] output, int off, int len) にまとめて記載しました。
そちらのAPI使用例をご参照ください。

void setDictionary (byte[] dictionary)

プリセット・ディクショナリを指定のバイト配列に設定します。

final var input = "abcXYZabcXYZabcXYZ".getBytes();
final var dictionary = "abcXYZ".getBytes();

// --------
// 圧縮
final var deflater = new Deflater();
final var compressed = new byte[15];
int compressedLength;
try {
    deflater.setDictionary(dictionary);
    deflater.setInput(input);
    deflater.finish();

    compressedLength = deflater.deflate(compressed);
    System.out.println(compressedLength); // 14

    // [120, -69, 7, -42, 2, 50, 75, -60, 32, 1, 62, -12, 6, -108, 0]
    System.out.println(Arrays.toString(compressed));
} finally {
    deflater.end();
}

// --------
// 解凍
final var inflater = new Inflater();
try {
    inflater.setInput(compressed, 0, compressedLength);

    final var decompressed = new byte[20];
    System.out.println(inflater.inflate(decompressed)); // 0
    System.out.println(inflater.needsDictionary()); // true

    inflater.setDictionary(dictionary);

    final int decompressedLength = inflater.inflate(decompressed);
    System.out.println(decompressedLength); // 18

    // [97, 98, 99, 88, 89, 90, 97, 98, 99, 88, 89, 90, 97, 98, 99, 88, 89, 90, 0, 0]
    System.out.println(Arrays.toString(decompressed));

    // abcXYZabcXYZabcXYZ
    System.out.println(new String(decompressed, 0, decompressedLength));
} finally {
    inflater.end();
}

void setDictionary (byte[] dictionary, int off, int len)

プリセット・ディクショナリを指定のバイト配列に設定します。

final var input = "abcXYZabcXYZabcXYZ".getBytes();
final var dictionary = "abcXYZ".getBytes();

// --------
// 圧縮
final var deflater = new Deflater();
final var compressed = new byte[20];
int compressedLength;
try {
    deflater.setDictionary(dictionary, 1, 4);
    deflater.setInput(input);
    deflater.finish();

    compressedLength = deflater.deflate(compressed);
    System.out.println(compressedLength); // 18

    // [120, -69, 3, -66, 1, 119, 75, 76, 2, 18, 81, -56, 36, 0, 62, -12, 6, -108, 0, 0]
    System.out.println(Arrays.toString(compressed));
} finally {
    deflater.end();
}

// --------
// 解凍
final var inflater = new Inflater();
try {
    inflater.setInput(compressed, 0, compressedLength);

    final var decompressed = new byte[20];
    System.out.println(inflater.inflate(decompressed)); // 0
    System.out.println(inflater.needsDictionary()); // true

    inflater.setDictionary(dictionary, 1, 4);

    final int decompressedLength = inflater.inflate(decompressed);
    System.out.println(decompressedLength); // 18

    // [97, 98, 99, 88, 89, 90, 97, 98, 99, 88, 89, 90, 97, 98, 99, 88, 89, 90, 0, 0]
    System.out.println(Arrays.toString(decompressed));

    // abcXYZabcXYZabcXYZ
    System.out.println(new String(decompressed, 0, decompressedLength));
} finally {
    inflater.end();
}

void setDictionary (ByteBuffer dictionary)

リセット・ディクショナリを指定されたバッファのバイトに設定します。

final var input = "abcXYZabcXYZabcXYZ".getBytes();
final var dictionary = "abcXYZ".getBytes();

// --------
// 圧縮
final var deflater = new Deflater();
final var compressed = new byte[15];
int compressedLength;
try {
    deflater.setDictionary(ByteBuffer.wrap(dictionary));
    deflater.setInput(input);
    deflater.finish();

    compressedLength = deflater.deflate(compressed);
    System.out.println(compressedLength); // 14

    // [120, -69, 7, -42, 2, 50, 75, -60, 32, 1, 62, -12, 6, -108, 0]
    System.out.println(Arrays.toString(compressed));
} finally {
    deflater.end();
}

// --------
// 解凍
final var inflater = new Inflater();
try {
    inflater.setInput(compressed, 0, compressedLength);

    final var decompressed = new byte[20];
    System.out.println(inflater.inflate(decompressed)); // 0
    System.out.println(inflater.needsDictionary()); // true

    inflater.setDictionary(ByteBuffer.wrap(dictionary));

    final int decompressedLength = inflater.inflate(decompressed);
    System.out.println(decompressedLength); // 18

    // [97, 98, 99, 88, 89, 90, 97, 98, 99, 88, 89, 90, 97, 98, 99, 88, 89, 90, 0, 0]
    System.out.println(Arrays.toString(decompressed));

    // abcXYZabcXYZabcXYZ
    System.out.println(new String(decompressed, 0, decompressedLength));
} finally {
    inflater.end();
}

void setInput (byte[] input)

圧縮解除のための入力データを設定します。

deflate メソッドについてはこちら

final var input = deflate("aaaXXXbbbYYY");

// [120, -100, 75, 76, 76, -116, -120, -120, 72, 74, 74,
//  -118, -116, -116, 4, 0, 28, -95, 4, 93]
System.out.println(Arrays.toString(input));

// 20
System.out.println(input.length);

final var inflater = new Inflater();
try {
    inflater.setInput(Arrays.copyOf(input, 10));

    final var output1 = new byte[10];
    final var length1 = inflater.inflate(output1);

    // 7
    System.out.println(length1);

    // [97, 97, 97, 88, 88, 88, 98, 0, 0, 0]
    System.out.println(Arrays.toString(output1));

    // aaaXXXb
    System.out.println(new String(output1, 0, length1));

    inflater.setInput(Arrays.copyOfRange(input, 10, 20));

    final var output2 = new byte[10];
    final var length2 = inflater.inflate(output2);

    // 5
    System.out.println(length2);

    // [98, 98, 89, 89, 89, 0, 0, 0, 0, 0]
    System.out.println(Arrays.toString(output2));

    // bbYYY
    System.out.println(new String(output2, 0, length2));
} finally {
    inflater.end();
}

void setInput (byte[] input, int off, int len)

圧縮解除のための入力データを設定します。

deflate メソッドについてはこちら

final var input = deflate("aaaXXXbbbYYY");

// [120, -100, 75, 76, 76, -116, -120, -120, 72, 74, 74,
//  -118, -116, -116, 4, 0, 28, -95, 4, 93]
System.out.println(Arrays.toString(input));

// 20
System.out.println(input.length);

final var inflater = new Inflater();
try {
    inflater.setInput(input, 0, 12);

    final var output1 = new byte[10];
    final var length1 = inflater.inflate(output1);

    // 9
    System.out.println(length1);

    // [97, 97, 97, 88, 88, 88, 98, 98, 98, 0]
    System.out.println(Arrays.toString(output1));

    // aaaXXXbbb
    System.out.println(new String(output1, 0, length1));

    inflater.setInput(input, 12, 8);

    final var output2 = new byte[10];
    final var length2 = inflater.inflate(output2);

    // 3
    System.out.println(length2);

    // [89, 89, 89, 0, 0, 0, 0, 0, 0, 0]
    System.out.println(Arrays.toString(output2));

    // YYY
    System.out.println(new String(output2, 0, length2));
} finally {
    inflater.end();
}

void setInput (ByteBuffer input)

圧縮解除のための入力データを設定します。

deflate メソッドについてはこちら

final var input = ByteBuffer.wrap(deflate("aaaaa"));
System.out.println(input); // java.nio.HeapByteBuffer[pos=0 lim=11 cap=11]

// [120, -100, 75, 76, 4, 2, 0, 5, -76, 1, -26]
System.out.println(Arrays.toString(input.array()));

final var inflater = new Inflater();
try {
    inflater.setInput(input);

    final var output = new byte[10];
    final var length = inflater.inflate(output);

    // 5
    System.out.println(length);

    // [97, 97, 97, 97, 97, 0, 0, 0, 0, 0]
    System.out.println(Arrays.toString(output));

    // aaaaa
    System.out.println(new String(output, 0, length));
} finally {
    inflater.end();
}

関連記事

ページの先頭へ