広告

Java : GZIPInputStream (ZIP) - API使用例

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


概要

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

クラス構成

GZIP は Linux でよく使われる圧縮形式です。
GZIPInputStream クラスを使うと、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));
}

共通で使うメソッド

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

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

    return out.toByteArray();
}

フィールド

protected CRC32 crc

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

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

protected boolean eos

入力ストリームの終端を表します。

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

static final int GZIP_MAGIC

GZIPのヘッダー・マジック番号です。

System.out.printf("%#x", GZIPInputStream.GZIP_MAGIC); // 0x8b1f

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

buf, inf, len

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

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

in

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

コンストラクタ

GZIPInputStream (InputStream in)

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

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

final var bytes = deflate("aaaaa");

// [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(bytes));

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

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

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

GZIPInputStream (InputStream in, int size)

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

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

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

class MyInputStream extends GZIPInputStream {
    public MyInputStream(InputStream in) throws IOException {
        super(in);
    }

    public MyInputStream(InputStream in, int size) throws IOException {
        super(in, size);
    }

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

final var bytes = deflate("");

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

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

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

メソッド

void close ()

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

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

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

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

final var bytes = deflate("aaaaa");

// [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(bytes));
Files.write(file, bytes);

try (final var gis = new GZIPInputStream(Files.newInputStream(file))) {
    final var uncompressed = gis.readAllBytes();

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

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

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

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

final var bytes = deflate("aaaaa");

// [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(bytes));
Files.write(file, bytes);

final var gis = new GZIPInputStream(Files.newInputStream(file));
try {
    final var uncompressed = gis.readAllBytes();

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

    // aaaaa
    System.out.println(new String(uncompressed));
} finally {
    gis.close();
}

int read (byte[] buf, 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);

// [31, -117, 8, 0, 0, 0, 0, 0, 0, -1, 75, 76, 74, 78,
//  73, 77, 3, 0, -17, 57, -114, 75, 6, 0, 0, 0]
System.out.println(Arrays.toString(bytes));

try (final var gis = new GZIPInputStream(new ByteArrayInputStream(bytes))) {
    final var b1 = new byte[5];
    System.out.println(gis.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(gis.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(gis.read(b3, 0, 5)); // 1
    System.out.println(Arrays.toString(b3)); // [102, 0, 0, 0, 0]
}

InflaterInputStreamで宣言されたメソッド

available, fill, mark, markSupported, read, reset, skip

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

FilterInputStreamで宣言されたメソッド

read

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

InputStreamで宣言されたメソッド

nullInputStream, readAllBytes, readNBytes, readNBytes, skipNBytes, transferTo

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


関連記事

ページの先頭へ