Java : InflaterInputStream (ZIP) - API使用例

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


概要

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

クラス構成

Deflate は ZIP でも使われている圧縮形式です。
InflaterInputStream クラスを使うと、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));
    }
}

共通で使うメソッド

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

// 文字列を圧縮します。
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();
}

フィールド

protected byte[] buf

圧縮解除に使用する入力バッファです。

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

protected Inflater inf

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

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

protected int len

入力バッファの長さです。

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

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

in

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

コンストラクタ

InflaterInputStream (InputStream in)

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

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

final var bytes = deflate("aaaaaaaaaa");

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

try (final var iis = new InflaterInputStream(new ByteArrayInputStream(bytes))) {
    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));
}

InflaterInputStream (InputStream in, Inflater inf)

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

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

final var bytes = deflate("aaaaaaaaaa");

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

try (final var iis = new InflaterInputStream(
        new ByteArrayInputStream(bytes), new Inflater())) {
    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));
}

InflaterInputStream (InputStream in, Inflater inf, int size)

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

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

class MyInputStream extends InflaterInputStream {
    public MyInputStream(InputStream in) {
        super(in, new Inflater());
    }

    public MyInputStream(InputStream in, int size) {
        super(in, new Inflater(), size);
    }

    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を返します。

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

final var str = "abc";
System.out.println(Arrays.toString(str.getBytes())); // [97, 98, 99]

final var bytes = deflate(str);

// [120, -100, 75, 76, 74, 6, 0, 2, 77, 1, 39]
System.out.println(Arrays.toString(bytes));

try (final var iis = new InflaterInputStream(new ByteArrayInputStream(bytes))) {
    System.out.println(iis.available()); // 1

    System.out.println(iis.read()); // 97
    System.out.println(iis.available()); // 1

    System.out.println(iis.read()); // 98
    System.out.println(iis.available()); // 1

    System.out.println(iis.read()); // 99
    System.out.println(iis.available()); // 1

    System.out.println(iis.read()); // -1
    System.out.println(iis.available()); // 0
}

void close ()

この入力ストリームを閉じて、そのストリームに関連するすべてのシステム・リソースを解放します。

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

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

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

final var bytes = deflate("aaaaaaaaaa");

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

try (final var iis = new InflaterInputStream(Files.newInputStream(file))) {
    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));
}

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

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

final var bytes = deflate("aaaaaaaaaa");

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

final var iis = new InflaterInputStream(Files.newInputStream(file));
try {
    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));
} finally {
    iis.close();
}

protected void fill ()

入力バッファを、圧縮解除するデータで満たします。

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

void mark (int readlimit)

この入力ストリームの現在位置にマークを設定します。

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

final var bytes = deflate("aaaaaaaaaa");
System.out.println("bytes : " + Arrays.toString(bytes));

try (final var iis = new InflaterInputStream(new ByteArrayInputStream(bytes))) {
    System.out.println("markSupported : " + iis.markSupported());

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

// 結果
// ↓
//bytes : [120, -100, 75, 76, -124, 1, 0, 20, -31, 3, -53]
//markSupported : false
//IOException! : mark/reset not supported

boolean markSupported ()

この入力ストリームがmarkおよびresetメソッドをサポートしているかどうかを判定します。

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

int read ()

圧縮解除データのバイトを読み込みます。

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

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

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

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

final var str = "abcdef";
System.out.println(Arrays.toString(str.getBytes())); // [97, 98, 99, 100, 101, 102]

final var bytes = deflate(str);

// [120, -100, 75, 76, 74, 78, 73, 77, 3, 0, 8, 30, 2, 86]
System.out.println(Arrays.toString(bytes));

try (final var iis = new InflaterInputStream(new ByteArrayInputStream(bytes))) {
    final var b1 = new byte[5];
    System.out.println(iis.read(b1, 0, 3)); // 3
    System.out.println(Arrays.toString(b1)); // [97, 98, 99, 0, 0]

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

    final var b3 = new byte[5];
    System.out.println(iis.read(b3, 0, 5)); // 1
    System.out.println(Arrays.toString(b3)); // [102, 0, 0, 0, 0]
}

void reset ()

このストリームを、この入力ストリームで最後にmarkメソッドが呼び出されたときの位置に再配置します。

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

long skip (long n)

圧縮解除データの指定されたバイト数をスキップします。

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

final var str = "abcdef";
System.out.println(Arrays.toString(str.getBytes())); // [97, 98, 99, 100, 101, 102]

final var bytes = deflate(str);

// [120, -100, 75, 76, 74, 78, 73, 77, 3, 0, 8, 30, 2, 86]
System.out.println(Arrays.toString(bytes));

try (final var iis = new InflaterInputStream(new ByteArrayInputStream(bytes))) {
    System.out.println(iis.skip(3)); // 3

    final var uncompressed = iis.readAllBytes();

    // [100, 101, 102]
    System.out.println(Arrays.toString(uncompressed));

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

FilterInputStreamで宣言されたメソッド

read

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

InputStreamで宣言されたメソッド

nullInputStream, readAllBytes, readNBytes, readNBytes, skipNBytes, transferTo

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


関連記事

ページの先頭へ