Java : DeflaterOutputStream (ZIP) - API使用例

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


概要

このクラスは、deflate圧縮形式で圧縮されているデータの出力ストリーム・フィルタを実装します。 また、GZIPOutputStreamなどのほかの型の圧縮フィルタはこのクラスに基づいています。

クラス構成

Deflate は ZIP でも使われている圧縮形式です。
DeflaterOutputStream クラスを使うと、deflate 圧縮形式でデータを出力できます。

// --------
// 圧縮
final var b1 = new ByteArrayOutputStream();
try (final var dos = new DeflaterOutputStream(b1)) {
    dos.write("aaaaaaaaaa".getBytes());
    dos.write("ZZZZZZZZZZ".getBytes());
}

final var compressed = b1.toByteArray();

// [120, -100, 75, 76, -124, -127, 40, 56, 0, 0, 78, 37, 7, 79]
System.out.println(Arrays.toString(compressed));

// --------
// 解凍
final var b2 = new ByteArrayOutputStream();
try (final var ios = new InflaterOutputStream(b2)) {
    ios.write(compressed);
}

final var uncompressed = b2.toByteArray();

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

// aaaaaaaaaaZZZZZZZZZZ
System.out.println(new String(uncompressed));

フィールド

protected byte[] buf

圧縮データを書き込むための出力バッファです。

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

protected Deflater def

このストリームで使用するコンプレッサです。

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

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

out

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

コンストラクタ

DeflaterOutputStream (OutputStream out)

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

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

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

final var out = new ByteArrayOutputStream();
try (final var dos = new DeflaterOutputStream(out)) {
    dos.write(input);
}

final var compressed = out.toByteArray();

// [120, -100, 75, 76, 68, 6, 0, 39, -41, 5, 79]
System.out.println(Arrays.toString(compressed));

DeflaterOutputStream (OutputStream out, boolean syncFlush)

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

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

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

    dos.flush();

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

// [120, -100, 74, 76, 76, 4, 0, 0, 0, -1, -1, 3, 0, 2, 73, 1, 36]
System.out.println(Arrays.toString(out.toByteArray()));
final var out = new ByteArrayOutputStream();
try (final var dos = new DeflaterOutputStream(
        new BufferedOutputStream(out), false)) {
    dos.write("aaa".getBytes());

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

    dos.flush();

    // [120, -100]
    System.out.println(Arrays.toString(out.toByteArray()));
}

// [120, -100, 75, 76, 76, 4, 0, 2, 73, 1, 36]
System.out.println(Arrays.toString(out.toByteArray()));

DeflaterOutputStream (OutputStream out, Deflater def)

指定されたコンプレッサおよびデフォルトのバッファ・サイズで新しい出力ストリームを作成します。

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 dos = new DeflaterOutputStream(
        out, new Deflater(Deflater.BEST_COMPRESSION))) {
    dos.write(input);
}

final var compressed = out.toByteArray();

// [120, -38, 75, 76, -124, 1, 0, 20, -31, 3, -53]
System.out.println(Arrays.toString(compressed));

DeflaterOutputStream (OutputStream out, Deflater def, boolean syncFlush)

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

final var out = new ByteArrayOutputStream();
try (final var dos = new DeflaterOutputStream(new BufferedOutputStream(out),
        new Deflater(Deflater.BEST_COMPRESSION), true)) {
    dos.write("aaa".getBytes());

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

    dos.flush();

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

// [120, -38, 74, 76, 76, 4, 0, 0, 0, -1, -1, 3, 0, 2, 73, 1, 36]
System.out.println(Arrays.toString(out.toByteArray()));
final var out = new ByteArrayOutputStream();
try (final var dos = new DeflaterOutputStream(new BufferedOutputStream(out),
        new Deflater(Deflater.BEST_COMPRESSION), false)) {
    dos.write("aaa".getBytes());

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

    dos.flush();

    // [120, -38]
    System.out.println(Arrays.toString(out.toByteArray()));
}

// [120, -38, 75, 76, 76, 4, 0, 2, 73, 1, 36]
System.out.println(Arrays.toString(out.toByteArray()));

DeflaterOutputStream (OutputStream out, Deflater def, int size)

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

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

class MyOutputStream extends DeflaterOutputStream {
    public MyOutputStream(OutputStream out) {
        super(out, new Deflater());
    }

    public MyOutputStream(OutputStream out, int size) {
        super(out, new Deflater(), 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
}

DeflaterOutputStream (OutputStream out, Deflater def, int size, boolean syncFlush)

指定されたコンプレッサ、バッファ・サイズ、およびフラッシュ・モードで新しい出力ストリームを作成します。

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

メソッド

void close ()

残りの圧縮データを出力ストリームに書き込み、ストリームを閉じます。

可能であれば try-with-resources文 を使うことをおすすめします。

final var file = Path.of("R:", "java-work", "aaa.data");
System.out.println(file); // R:\java-work\aaa.data

try (final var dos = new DeflaterOutputStream(Files.newOutputStream(file))) {
    dos.write("aaaaaaaaaa".getBytes());
}

final var bytes = Files.readAllBytes(file);

// [120, -100, 75, 76, -124, 1, 0, 20, -31, 3, -53]
System.out.println(Arrays.toString(bytes));

try-with-resources文を使わない例です。

final var file = Path.of("R:", "java-work", "aaa.data");
System.out.println(file); // R:\java-work\aaa.data

final var dos = new DeflaterOutputStream(Files.newOutputStream(file));
try {
    dos.write("aaaaaaaaaa".getBytes());
} finally {
    dos.close();
}

final var bytes = Files.readAllBytes(file);

// [120, -100, 75, 76, -124, 1, 0, 20, -31, 3, -53]
System.out.println(Arrays.toString(bytes));

protected void deflate ()

圧縮データの次のブロックを出力ストリームに書き込みます。

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

void finish ()

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

final var out = new ByteArrayOutputStream();
try (final var dos = new DeflaterOutputStream(out)) {
    dos.write("aaaaaaaaaa".getBytes());
    dos.finish();

    // [120, -100, 75, 76, -124, 1, 0, 20, -31, 3, -53]
    System.out.println(Arrays.toString(out.toByteArray()));

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

final var compressed = out.toByteArray();

// [120, -100, 75, 76, -124, 1, 0, 20, -31, 3, -53, 0, 1, 2, 3]
System.out.println(Arrays.toString(compressed));

void flush ()

圧縮された出力ストリームをフラッシュします。

このメソッドの使用例は、DeflaterOutputStream(OutputStream out, boolean syncFlush) にまとめて記載しました。
そちらのAPI使用例をご参照ください。

void write (byte[] b, 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 b1 = new ByteArrayOutputStream();
    try (final var dos = new DeflaterOutputStream(b1)) {
        dos.write(input, 0, 5);
    }

    final var compressed = b1.toByteArray();

    // [120, -100, -29, 18, -111, -45, 48, 2, 0, 1, 99, 0, -105]
    System.out.println(Arrays.toString(compressed));

    final var b2 = new ByteArrayOutputStream();
    try (final var ios = new InflaterOutputStream(b2)) {
        ios.write(compressed);
    }

    final var uncompressed = b2.toByteArray();

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

    final var compressed = b1.toByteArray();

    // [120, -100, 19, -111, -45, 0, 0, 0, -93, 0, 91]
    System.out.println(Arrays.toString(compressed));

    final var b2 = new ByteArrayOutputStream();
    try (final var ios = new InflaterOutputStream(b2)) {
        ios.write(compressed);
    }

    final var uncompressed = b2.toByteArray();

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

void write (int b)

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

final var b1 = new ByteArrayOutputStream();
try (final var dos = new DeflaterOutputStream(b1)) {
    dos.write(10);
    dos.write(20);
    dos.write(30);
}

final var compressed = b1.toByteArray();

// [120, -100, -29, 18, -111, 3, 0, 0, 103, 0, 61]
System.out.println(Arrays.toString(compressed));

final var b2 = new ByteArrayOutputStream();
try (final var ios = new InflaterOutputStream(b2)) {
    ios.write(compressed);
}

final var uncompressed = b2.toByteArray();

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

FilterOutputStreamで宣言されたメソッド

write

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

OutputStreamで宣言されたメソッド

nullOutputStream

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


関連記事

ページの先頭へ