広告

Java : DeflaterInputStream (ZIP) - API使用例

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


概要

deflate圧縮形式でデータを圧縮するための入力ストリーム・フィルタを実装します。

クラス構成

Deflate は ZIP でも使われている圧縮形式です。
DeflaterInputStream クラスを使うと、deflate 圧縮形式でデータを読み込めます。

// --------
// 圧縮
final var buf = "aaaaaaaaaa".getBytes();
try (final var dis = new DeflaterInputStream(new ByteArrayInputStream(buf))) {
    final var compressed = dis.readAllBytes();

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

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

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

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

フィールド

protected final byte[] buf

圧縮データを読み取るための入力バッファです。

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

protected final Deflater def

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

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

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

in

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

コンストラクタ

DeflaterInputStream (InputStream in)

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

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

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

try (final var dis = new DeflaterInputStream(new ByteArrayInputStream(buf))) {
    final var compressed = dis.readAllBytes();

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

DeflaterInputStream (InputStream in, Deflater defl)

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

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

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

try (final var dis = new DeflaterInputStream(
        new ByteArrayInputStream(buf), new Deflater(Deflater.BEST_COMPRESSION))) {
    final var compressed = dis.readAllBytes();

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

DeflaterInputStream (InputStream in, Deflater defl, int bufLen)

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

in, defl パラメータについては DeflaterInputStream(InputStream in, Deflater defl) の使用例をご参照ください。

class MyInputStream extends DeflaterInputStream {
    public MyInputStream(InputStream in) {
        super(in, new Deflater());
    }

    public MyInputStream(InputStream in, int bufLen) {
        super(in, new Deflater(), bufLen);
    }

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

try (final var is = new MyInputStream(new ByteArrayInputStream(new byte[0]))) {
    System.out.println(is.getSize()); // 512
}

try (final var is = new MyInputStream(new ByteArrayInputStream(new byte[0]), 1024)) {
    System.out.println(is.getSize()); // 1024
}

メソッド

int available ()

EOFに達したあとで呼び出した場合は0を返します。そうでない場合は常に1を返します。

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

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

try (final var dis = new DeflaterInputStream(new ByteArrayInputStream(buf))) {
    System.out.println(dis.available()); // 1

    System.out.println(dis.read()); // 120
    System.out.println(dis.available()); // 1

    System.out.println(dis.read()); // 156
    System.out.println(dis.available()); // 1

    System.out.println(dis.read()); // 75
    System.out.println(dis.available()); // 1

    // [76, 68, 6, 0, 39, -41, 5, 79]
    System.out.println(Arrays.toString(dis.readAllBytes()));

    System.out.println(dis.available()); // 0
}

void close ()

この入力ストリームとその基となる入力ストリームを閉じ、保留状態の未圧縮データをすべて破棄します。

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

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

Files.writeString(file, "aaaaaaaaaa");

try (final var dis = new DeflaterInputStream(Files.newInputStream(file))) {
    final var compressed = dis.readAllBytes();

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

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

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

Files.writeString(file, "aaaaaaaaaa");

final var dis = new DeflaterInputStream(Files.newInputStream(file));
try {
    final var compressed = dis.readAllBytes();

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

void mark (int limit)

この操作はサポートされていません。

final var buf = "aaaaaaaaaaaaaa".getBytes();
try (final var dis = new DeflaterInputStream(new ByteArrayInputStream(buf))) {
    System.out.println("markSupported : " + dis.markSupported());

    dis.mark(0);
    dis.reset();

} catch (IOException e) {
    System.out.println("IOException! : " + e.getMessage());
}

// 結果
// ↓
//markSupported : false
//IOException! : mark/reset not supported

boolean markSupported ()

この入力ストリームはmark()メソッドとreset()メソッドをサポートしないため、常にfalseを返します。

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

int read ()

入力ストリームから圧縮データを1バイト読み取ります。

final var buf = "aaaaaaaaaaaaaa".getBytes();
try (final var dis = new DeflaterInputStream(new ByteArrayInputStream(buf))) {
    System.out.println(dis.read()); // 120
    System.out.println(dis.read()); // 156
    System.out.println(dis.read()); // 75
    System.out.println(dis.read()); // 76
    System.out.println(dis.read()); // 68
    System.out.println(dis.read()); // 6
    System.out.println(dis.read()); // 0
    System.out.println(dis.read()); // 39
    System.out.println(dis.read()); // 215
    System.out.println(dis.read()); // 5
    System.out.println(dis.read()); // 79
    System.out.println(dis.read()); // -1
}

int read (byte[] b, int off, int len)

圧縮データをバイト配列内に読み込みます。

final var buf = "aaaaaaaaaaaaaa".getBytes();
try (final var dis = new DeflaterInputStream(new ByteArrayInputStream(buf))) {
    // [120, -100, 75, 76, 68, 6, 0, 39, -41, 5, 79]
    System.out.println(Arrays.toString(dis.readAllBytes()));
}

try (final var dis = new DeflaterInputStream(new ByteArrayInputStream(buf))) {
    final var b1 = new byte[5];
    System.out.println(dis.read(b1, 0, 3)); // 3
    System.out.println(Arrays.toString(b1)); // [120, -100, 75, 0, 0]

    final var b2 = new byte[5];
    System.out.println(dis.read(b2, 1, 2)); // 2
    System.out.println(Arrays.toString(b2)); // [0, 76, 68, 0, 0]

    final var b3 = new byte[8];
    System.out.println(dis.read(b3, 0, 8)); // 6
    System.out.println(Arrays.toString(b3)); // [6, 0, 39, -41, 5, 79, 0, 0]
}

void reset ()

この操作はサポートされていません。

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

long skip (long n)

入力ストリームのデータをスキップして破棄します。

final var buf = "aaaaaaaaaaaaaa".getBytes();
try (final var dis = new DeflaterInputStream(new ByteArrayInputStream(buf))) {
    // [120, -100, 75, 76, 68, 6, 0, 39, -41, 5, 79]
    System.out.println(Arrays.toString(dis.readAllBytes()));
}

try (final var dis = new DeflaterInputStream(new ByteArrayInputStream(buf))) {
    System.out.println(dis.skip(5)); // 5

    // [6, 0, 39, -41, 5, 79]
    System.out.println(Arrays.toString(dis.readAllBytes()));
}

FilterInputStreamで宣言されたメソッド

read

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

InputStreamで宣言されたメソッド

nullInputStream, readAllBytes, readNBytes, readNBytes, skipNBytes, transferTo

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


関連記事

ページの先頭へ