広告

Java : GZIPOutputStream (ZIP) - API使用例

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


概要

このクラスは、GZIPファイル形式で圧縮されたデータを書き込むためのストリーム・フィルタを実装します。

クラス構成

GZIP は Linux でよく使われる圧縮形式です。
GZIPOutputStream クラスを使うと、GZIP 圧縮形式でデータを出力できます。

// --------
// 圧縮
final var out = new ByteArrayOutputStream();
try (final var gos = new GZIPOutputStream(out)) {
    gos.write("aaaaa".getBytes());
    gos.write("ZZZZZ".getBytes());
}

final var compressed = out.toByteArray();

// [31, -117, 8, 0, 0, 0, 0, 0, 0, -1, 75, 76, 4,
//  -126, 40, 16, 0, 0, -86, 55, 77, 24, 10, 0, 0, 0]
System.out.println(Arrays.toString(compressed));

// --------
// 解凍
try (final var gis = new GZIPInputStream(new ByteArrayInputStream(compressed))) {
    final var uncompressed = gis.readAllBytes();

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

    // aaaaaZZZZZ
    System.out.println(new String(uncompressed));
}

フィールド

protected CRC32 crc

圧縮解除されたデータに使用するCRC-32です。

protectedです。
独自にサブクラスを作ることは少ないと思いますので、コード例は割愛します。

DeflaterOutputStreamで宣言されたフィールド

buf, def

Java API 使用例 : DeflaterOutputStream」をご参照ください。

FilterOutputStreamで宣言されたフィールド

out

Java API 使用例 : FilterOutputStream」をご参照ください。

コンストラクタ

GZIPOutputStream (OutputStream out)

デフォルトのバッファ・サイズで新しい出力ストリームを作成します。

final var input = "aaaaaaaaaa".getBytes();

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

final var out = new ByteArrayOutputStream();
try (final var gos = new GZIPOutputStream(out)) {
    gos.write(input);
}

final var compressed = out.toByteArray();

// [31, -117, 8, 0, 0, 0, 0, 0, 0, -1, 75, 76,
//  -124, 1, 0, -16, -51, 17, 76, 10, 0, 0, 0]
System.out.println(Arrays.toString(compressed));

GZIPOutputStream (OutputStream out, boolean syncFlush)

デフォルトのバッファ・サイズと指定されたフラッシュ・モードで新しい出力ストリームを作成します。

final var out = new ByteArrayOutputStream();
try (final var gos = new GZIPOutputStream(
        new BufferedOutputStream(out), true)) {
    gos.write("aaa".getBytes());

    // []
    System.out.println(Arrays.toString(out.toByteArray()));

    gos.flush();

    // [31, -117, 8, 0, 0, 0, 0, 0, 0, -1, 74, 76, 76, 4, 0, 0, 0, -1, -1]
    System.out.println(Arrays.toString(out.toByteArray()));
}

// [31, -117, 8, 0, 0, 0, 0, 0, 0, -1, 74, 76, 76, 4,
//  0, 0, 0, -1, -1, 3, 0, 45, 115, 7, -16, 3, 0, 0, 0]
System.out.println(Arrays.toString(out.toByteArray()));
final var out = new ByteArrayOutputStream();
try (final var gos = new GZIPOutputStream(
        new BufferedOutputStream(out), false)) {
    gos.write("aaa".getBytes());

    // []
    System.out.println(Arrays.toString(out.toByteArray()));

    gos.flush();

    // [31, -117, 8, 0, 0, 0, 0, 0, 0, -1]
    System.out.println(Arrays.toString(out.toByteArray()));
}

// [31, -117, 8, 0, 0, 0, 0, 0, 0, -1, 75, 76, 76, 4,
//  0, 45, 115, 7, -16, 3, 0, 0, 0]
System.out.println(Arrays.toString(out.toByteArray()));

GZIPOutputStream (OutputStream out, int size)

指定されたバッファ・サイズで新しい出力ストリームを作成します。

out パラメータについては GZIPOutputStream(OutputStream out) の使用例をご参照ください。

class MyOutputStream extends GZIPOutputStream {
    public MyOutputStream(OutputStream out) throws IOException {
        super(out);
    }

    public MyOutputStream(OutputStream out, int size) throws IOException {
        super(out, size);
    }

    int getSize() {
        return buf.length;
    }
}

try (final var os = new MyOutputStream(new ByteArrayOutputStream())) {
    System.out.println(os.getSize()); // 512
}

try (final var os = new MyOutputStream(new ByteArrayOutputStream(), 1024)) {
    System.out.println(os.getSize()); // 1024
}

GZIPOutputStream (OutputStream out, int size, boolean syncFlush)

指定されたバッファ・サイズとフラッシュ・モードで新しい出力ストリームを作成します。

out, syncFlush パラメータについては GZIPOutputStream(OutputStream out, boolean syncFlush) の使用例をご参照ください。
size パラメータについては GZIPOutputStream(OutputStream out, int size) の使用例をご参照ください。

メソッド

void finish ()

出力ストリームへの圧縮データの書込みを終了します。このときストリームは閉じられません。

final var out = new ByteArrayOutputStream();
try (final var gos = new GZIPOutputStream(out)) {
    gos.write("aaaaa".getBytes());
    gos.finish();

    // [31, -117, 8, 0, 0, 0, 0, 0, 0, -1, 75,
    //  76, 4, 2, 0, -71, -109, -84, -18, 5,
    //  0, 0, 0]
    System.out.println(Arrays.toString(out.toByteArray()));

    // ストリームはまだ閉じられていません。
    out.write(1);
    out.write(2);
    out.write(3);
    out.write(4);
}

final var compressed = out.toByteArray();

// [31, -117, 8, 0, 0, 0, 0, 0, 0, -1, 75,
//  76, 4, 2, 0, -71, -109, -84, -18, 5,
//  0, 0, 0, 1, 2, 3, 4]
System.out.println(Arrays.toString(compressed));

void write (byte[] buf, int off, int len)

圧縮された出力ストリームにバイト配列を書き込みます。

final byte[] input = {10, 20, 30, 40, 50};
System.out.println(Arrays.toString(input)); // [10, 20, 30, 40, 50]

{
    final var out = new ByteArrayOutputStream();
    try (final var gos = new GZIPOutputStream(out)) {
        gos.write(input, 0, 5);
    }

    final var compressed = out.toByteArray();

    // [31, -117, 8, 0, 0, 0, 0, 0, 0, -1, -29, 18,
    //  -111, -45, 48, 2, 0, 36, 94, -37, -48, 5, 0, 0, 0]
    System.out.println(Arrays.toString(compressed));

    try (final var gis = new GZIPInputStream(new ByteArrayInputStream(compressed))) {
        final var uncompressed = gis.readAllBytes();

        // [10, 20, 30, 40, 50]
        System.out.println(Arrays.toString(uncompressed));
    }
}
{
    final var out = new ByteArrayOutputStream();
    try (final var gos = new GZIPOutputStream(out)) {
        gos.write(input, 1, 3);
    }

    final var compressed = out.toByteArray();

    // [31, -117, 8, 0, 0, 0, 0, 0, 0, -1, 19, -111,
    //  -45, 0, 0, -101, 69, -102, 5, 3, 0, 0, 0]
    System.out.println(Arrays.toString(compressed));

    try (final var gis = new GZIPInputStream(new ByteArrayInputStream(compressed))) {
        final var uncompressed = gis.readAllBytes();

        // [20, 30, 40]
        System.out.println(Arrays.toString(uncompressed));
    }
}

DeflaterOutputStreamで宣言されたメソッド

close, deflate, flush, write

Java API 使用例 : DeflaterOutputStream」をご参照ください。

FilterOutputStreamで宣言されたメソッド

write

Java API 使用例 : FilterOutputStream」をご参照ください。

OutputStreamで宣言されたメソッド

nullOutputStream

Java API 使用例 : OutputStream」をご参照ください。


関連記事

ページの先頭へ