広告

Java : ZipOutputStream - API使用例

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


概要

このクラスは、ZIPファイル形式でファイルを書き込むための出力ストリーム・フィルタを実装します。 圧縮データと圧縮解除データの両方をサポートします。

クラス構成

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

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

// --------
// 圧縮
try (final var zos = new ZipOutputStream(Files.newOutputStream(path))) {
    zos.putNextEntry(new ZipEntry("bbb.txt"));
    zos.write("YYYYY".getBytes());

    zos.putNextEntry(new ZipEntry("ccc.txt"));
    zos.write("ZZZZZ".getBytes());
}

// --- PowerShell ---
//PS R:\java-work> ls -name
//aaa.zip
//
//PS R:\java-work> Expand-Archive .\aaa.zip .
//PS R:\java-work> ls -name
//aaa.zip
//bbb.txt
//ccc.txt
//
//PS R:\java-work> cat .\bbb.txt
//YYYYY
//PS R:\java-work> cat .\ccc.txt
//ZZZZZ

// --------
// 解凍
try (final var zis = new ZipInputStream(Files.newInputStream(path))) {
    final var entry1 = zis.getNextEntry();
    if (entry1 != null) {
        System.out.println(entry1.getName()); // bbb.txt

        final var uncompressed = zis.readAllBytes();
        System.out.println(Arrays.toString(uncompressed)); // [89, 89, 89, 89, 89]
        System.out.println(new String(uncompressed)); // YYYYY
    }

    final var entry2 = zis.getNextEntry();
    if (entry2 != null) {
        System.out.println(entry2.getName()); // ccc.txt

        final var uncompressed = zis.readAllBytes();
        System.out.println(Arrays.toString(uncompressed)); // [90, 90, 90, 90, 90]
        System.out.println(new String(uncompressed)); // ZZZZZ
    }

    System.out.println(zis.getNextEntry()); // null
}

フィールド

static final int CENATT

中央ディレクトリの(CEN)ヘッダー内部ファイル属性のフィールド・オフセット。

System.out.println(ZipOutputStream.CENATT); // 36

static final int CENATX

中央ディレクトリの(CEN)ヘッダー外部ファイル属性フィールド・オフセット。

System.out.println(ZipOutputStream.CENATX); // 38

static final int CENCOM

中央ディレクトリの(CEN)ヘッダー・コメント長フィールド・オフセット。

System.out.println(ZipOutputStream.CENCOM); // 32

static final int CENCRC

中央ディレクトリの(CEN)ヘッダー非圧縮ファイルのcrc-32値フィールド・オフセット。

System.out.println(ZipOutputStream.CENCRC); // 16

static final int CENDSK

中央ディレクトリの(CEN)ヘッダー・ディスク番号の開始フィールド・オフセット。

System.out.println(ZipOutputStream.CENDSK); // 34

static final int CENEXT

中央ディレクトリの(CEN)ヘッダーの追加フィールド長フィールド・オフセット。

System.out.println(ZipOutputStream.CENEXT); // 30

static final int CENFLG

中央ディレクトリの(CEN)ヘッダー暗号化、復号化フラグのフィールド・オフセット。

System.out.println(ZipOutputStream.CENFLG); // 8

static final int CENHDR

中央ディレクトリの(CEN)ヘッダー・サイズ(バイト単位、(シグネチャを含む))。

System.out.println(ZipOutputStream.CENHDR); // 46

static final int CENHOW

中央ディレクトリの(CEN)ヘッダー圧縮メソッドのフィールド・オフセット。

System.out.println(ZipOutputStream.CENHOW); // 10

static final int CENLEN

中央ディレクトリの(CEN)ヘッダーの非圧縮サイズ・フィールド・オフセット。

System.out.println(ZipOutputStream.CENLEN); // 24

static final int CENNAM

中央ディレクトリの(CEN)ヘッダーのファイル名の長さフィールド・オフセット。

System.out.println(ZipOutputStream.CENNAM); // 28

static final int CENOFF

中央ディレクトリの(CEN)ヘッダーLOCヘッダーのオフセット・フィールドのオフセット。

System.out.println(ZipOutputStream.CENOFF); // 42

static final long CENSIG

中央ディレクトリの(CEN)ヘッダー・シグネチャ。

System.out.printf("%#x", ZipOutputStream.CENSIG); // 0x2014b50

static final int CENSIZ

中央ディレクトリの(CEN)ヘッダー圧縮サイズ・フィールド・オフセット。

System.out.println(ZipOutputStream.CENSIZ); // 20

static final int CENTIM

中央ディレクトリの(CEN)ヘッダー変更時間フィールド・オフセット。

System.out.println(ZipOutputStream.CENTIM); // 12

static final int CENVEM

フィールド・オフセットによって作成される中央ディレクトリ(CEN)ヘッダー・バージョン。

System.out.println(ZipOutputStream.CENVEM); // 4

static final int CENVER

フィールド・オフセットの抽出に必要な中央ディレクトリ(CEN)ヘッダー・バージョン。

System.out.println(ZipOutputStream.CENVER); // 6

static final int DEFLATED

圧縮された(DEFLATED)エントリのための圧縮メソッドです。

System.out.println(ZipOutputStream.DEFLATED); // 8

static final int ENDCOM

中央ディレクトリの(END)ヘッダーzipファイルのコメント長フィールド・オフセットの終わり。

System.out.println(ZipOutputStream.ENDCOM); // 20

static final int ENDHDR

中央ディレクトリの(END)ヘッダー・サイズの終了(バイト単位、(シグネチャを含む))。

System.out.println(ZipOutputStream.ENDHDR); // 22

static final int ENDOFF

最初のCENヘッダー・フィールドのオフセットに対する中央ディレクトリ(END)ヘッダー・オフセットの終了。

System.out.println(ZipOutputStream.ENDOFF); // 16

static final long ENDSIG

中央ディレクトリの(END)ヘッダー・シグネチャの終了。

System.out.printf("%#x", ZipOutputStream.ENDSIG); // 0x6054b50

static final int ENDSIZ

中央ディレクトリの(END)ヘッダー中央ディレクトリ・サイズ(バイト単位)フィールド・オフセットの終了。

System.out.println(ZipOutputStream.ENDSIZ); // 12

static final int ENDSUB

このディスク・フィールド・オフセット上のエントリの中央ディレクトリ(END)ヘッダー番号の終わり。

System.out.println(ZipOutputStream.ENDSUB); // 8

static final int ENDTOT

中央ディレクトリの(END)ヘッダーの入力フィールド・オフセットの合計数。

System.out.println(ZipOutputStream.ENDTOT); // 10

static final int EXTCRC

圧縮されていない余分なローカル(EXT)ヘッダーのcrc-32値フィールド・オフセット。

System.out.println(ZipOutputStream.EXTCRC); // 4

static final int EXTHDR

追加のローカル(EXT)ヘッダー・サイズ(バイト数(シグネチャを含む))。

System.out.println(ZipOutputStream.EXTHDR); // 16

static final int EXTLEN

余分なローカル(EXT)ヘッダーの非圧縮サイズ・フィールド・オフセット。

System.out.println(ZipOutputStream.EXTLEN); // 12

static final long EXTSIG

追加のローカル(EXT)ヘッダー・シグネチャ。

System.out.printf("%#x", ZipOutputStream.EXTSIG); // 0x8074b50

static final int EXTSIZ

追加のローカル(EXT)ヘッダー圧縮サイズ・フィールド・オフセット。

System.out.println(ZipOutputStream.EXTSIZ); // 8

static final int LOCCRC

ローカル・ファイル(LOC)ヘッダー非圧縮ファイルcrc-32値フィールド・オフセット。

System.out.println(ZipOutputStream.LOCCRC); // 14

static final int LOCEXT

ローカル・ファイル(LOC)ヘッダーの追加フィールド長フィールド・オフセット。

System.out.println(ZipOutputStream.LOCEXT); // 28

static final int LOCFLG

ローカル・ファイル(LOC)ヘッダー汎用ビット・フラグ・フィールド・オフセット。

System.out.println(ZipOutputStream.LOCFLG); // 6

static final int LOCHDR

ローカル・ファイルの(LOC)ヘッダー・サイズ(バイト単位、(シグネチャを含む))。

System.out.println(ZipOutputStream.LOCHDR); // 30

static final int LOCHOW

ローカル・ファイル(LOC)ヘッダー圧縮メソッドのフィールド・オフセット。

System.out.println(ZipOutputStream.LOCHOW); // 8

static final int LOCLEN

ローカル・ファイル(LOC)ヘッダーの非圧縮サイズ・フィールド・オフセット。

System.out.println(ZipOutputStream.LOCLEN); // 22

static final int LOCNAM

ローカル・ファイル(LOC)ヘッダーのファイル名の長さフィールド・オフセット。

System.out.println(ZipOutputStream.LOCNAM); // 26

static final long LOCSIG

ローカル・ファイル(LOC)ヘッダーのシグネチャ。

System.out.printf("%#x", ZipOutputStream.LOCSIG); // 0x4034b50

static final int LOCSIZ

ローカル・ファイルの(LOC)ヘッダー圧縮サイズ・フィールドのオフセット。

System.out.println(ZipOutputStream.LOCSIZ); // 18

static final int LOCTIM

ローカル・ファイル(LOC)ヘッダー変更時間フィールド・オフセット。

System.out.println(ZipOutputStream.LOCTIM); // 10

static final int LOCVER

フィールド・オフセットの抽出に必要なローカル・ファイル(LOC)ヘッダー・バージョン。

System.out.println(ZipOutputStream.LOCVER); // 4

static final int STORED

圧縮解除された(STORED)エントリのための圧縮メソッドです。

System.out.println(ZipOutputStream.STORED); // 0

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

buf, def

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

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

out

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

コンストラクタ

ZipOutputStream (OutputStream out)

新しいZIP出力ストリームを作成します。

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

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

final var out = new ByteArrayOutputStream();
try (final var zos = new ZipOutputStream(out)) {
    zos.putNextEntry(new ZipEntry("aaa.txt"));
    zos.write(input);
}

final var compressed = out.toByteArray();
System.out.println(compressed.length); // 133

// [80, 75, 3, 4, 20, 0, 8, 8, 8, 0, -106, -118, 63, 86, 0, 0, 0, 0, ...]
System.out.println(Arrays.toString(compressed));

ZipOutputStream (OutputStream out, Charset charset)

新しいZIP出力ストリームを作成します。

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

final var charset = Charset.forName("Shift_JIS");

final var out = new ByteArrayOutputStream();
try (final var zos = new ZipOutputStream(out, charset)) {
    zos.putNextEntry(new ZipEntry("aaa.txt"));
    zos.putNextEntry(new ZipEntry("○△×.txt"));
}

final var compressed = out.toByteArray();
System.out.println(compressed.length); // 244

try (final var zis = new ZipInputStream(new ByteArrayInputStream(compressed), charset)) {
    final var entry1 = zis.getNextEntry();
    if (entry1 != null) {
        System.out.println(entry1.getName()); // aaa.txt
    }

    final var entry2 = zis.getNextEntry();
    if (entry2 != null) {
        System.out.println(entry2.getName()); // ○△×.txt
    }
}

メソッド

void close ()

フィルタされているストリームと同様にZIP出力ストリームを閉じます。

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

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

try (final var zos = new ZipOutputStream(Files.newOutputStream(file))) {
    zos.putNextEntry(new ZipEntry("xxx.txt"));
    zos.write("aaaaa".getBytes());
}

final var bytes = Files.readAllBytes(file);
System.out.println(bytes.length); // 133

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

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

final var zos = new ZipOutputStream(Files.newOutputStream(file));
try {
    zos.putNextEntry(new ZipEntry("xxx.txt"));
    zos.write("aaaaa".getBytes());
} finally {
    zos.close();
}

final var bytes = Files.readAllBytes(file);
System.out.println(bytes.length); // 133

void closeEntry ()

現在のZIPエントリを閉じ、次のエントリを書き込むためにストリームを配置します。

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 zos = new ZipOutputStream(out)) {
    final var entry = new ZipEntry("aaa.txt");
    zos.putNextEntry(entry);
    zos.write(input);

    System.out.println(entry.getSize()); // -1
    System.out.println(entry.getCompressedSize()); // -1
    System.out.println(out.toByteArray().length); // 37

    zos.closeEntry();

    System.out.println(entry.getSize()); // 10
    System.out.println(entry.getCompressedSize()); // 5
    System.out.println(out.toByteArray().length); // 58
}

final var compressed = out.toByteArray();
System.out.println(compressed.length); // 133

void finish ()

ストリームを終了せずに、ZIP出力ストリームの内容の書込みを終了します。

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

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

final var out = new ByteArrayOutputStream();
try (final var zos = new ZipOutputStream(out)) {
    zos.putNextEntry(new ZipEntry("aaa.txt"));
    zos.write(input);
    zos.finish();

    // [80, 75, 3, 4, 20, 0, 8, 8, 8, 0, 59, -102, 63, 86, 0, 0, 0, ...]
    System.out.println(Arrays.toString(out.toByteArray()));

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

final var compressed = out.toByteArray();

// [80, 75, 3, 4, 20, 0, 8, 8, 8, 0, 59, -102, 63, 86, 0, 0, 0, ..., 1, 2, 3]
System.out.println(Arrays.toString(compressed));

void putNextEntry (ZipEntry e)

新しいZIPファイル・エントリの書込みを開始し、エントリ・データの開始位置にストリームを配置します。

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

// --------
// 圧縮
try (final var zos = new ZipOutputStream(Files.newOutputStream(path))) {
    zos.putNextEntry(new ZipEntry("bbb.txt"));
    zos.write("YYYYY".getBytes());

    zos.putNextEntry(new ZipEntry("ccc.txt"));
    zos.write("ZZZZZ".getBytes());
}

// --------
// 解凍
try (final var zis = new ZipInputStream(Files.newInputStream(path))) {
    final var entry1 = zis.getNextEntry();
    if (entry1 != null) {
        System.out.println(entry1.getName()); // bbb.txt

        final var uncompressed = zis.readAllBytes();
        System.out.println(Arrays.toString(uncompressed)); // [89, 89, 89, 89, 89]
        System.out.println(new String(uncompressed)); // YYYYY
    }

    final var entry2 = zis.getNextEntry();
    if (entry2 != null) {
        System.out.println(entry2.getName()); // ccc.txt

        final var uncompressed = zis.readAllBytes();
        System.out.println(Arrays.toString(uncompressed)); // [90, 90, 90, 90, 90]
        System.out.println(new String(uncompressed)); // ZZZZZ
    }

    System.out.println(zis.getNextEntry()); // null
}

void setComment (String comment)

ZIPファイル・コメントを設定します。

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

try (final var zos = new ZipOutputStream(Files.newOutputStream(path))) {
    zos.setComment("Comment!");

    zos.putNextEntry(new ZipEntry("bbb.txt"));
    zos.write("YYYYY".getBytes());
}

try (final var zipFile = new ZipFile(path.toFile())) {
    System.out.println(zipFile.getComment()); // Comment!
}

void setLevel (int level)

DEFLATEDである後続エントリの圧縮レベルを設定します。

final var input = "aaaaaaaaaa".getBytes();
System.out.println(input.length); // 10

final var out = new ByteArrayOutputStream();
try (final var zos = new ZipOutputStream(out)) {
    final var entry1 = new ZipEntry("aaa.txt");
    zos.putNextEntry(entry1);
    zos.setLevel(Deflater.BEST_COMPRESSION);
    zos.write(input);
    zos.closeEntry();

    System.out.println(entry1.getCompressedSize()); // 5

    final var entry2 = new ZipEntry("bbb.txt");
    zos.putNextEntry(entry2);
    zos.setLevel(Deflater.NO_COMPRESSION);
    zos.write(input);
    zos.closeEntry();

    System.out.println(entry2.getCompressedSize()); // 15
}

System.out.println(out.toByteArray().length); // 254

void setMethod (int method)

後続エントリのデフォルトの圧縮メソッドを設定します。

final var out = new ByteArrayOutputStream();
try (final var zos = new ZipOutputStream(out)) {
    zos.setMethod(ZipEntry.STORED);

    final var input = "aaaaaaaaaa".getBytes();
    System.out.println(input.length); // 10

    final var crc = new CRC32();
    crc.update(input);

    final var entry = new ZipEntry("aaa.txt");
    entry.setCrc(crc.getValue());
    entry.setSize(input.length);

    zos.putNextEntry(entry);
    zos.write(input);
}

System.out.println(out.toByteArray().length); // 122

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

バイト配列を現在のZIPエントリ・データに書き込みます。

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 zos = new ZipOutputStream(out)) {
        zos.putNextEntry(new ZipEntry("aaa.txt"));
        zos.write(input, 0, 5);
    }

    final var compressed = out.toByteArray();
    System.out.println(compressed.length); // 135

    try (final var zis = new ZipInputStream(new ByteArrayInputStream(compressed))) {
        final var entry = zis.getNextEntry();
        if (entry != null) {
            final var uncompressed = zis.readAllBytes();

            // [10, 20, 30, 40, 50]
            System.out.println(Arrays.toString(uncompressed));
        }
    }
}
{
    final var out = new ByteArrayOutputStream();
    try (final var zos = new ZipOutputStream(out)) {
        zos.putNextEntry(new ZipEntry("aaa.txt"));
        zos.write(input, 1, 3);
    }

    final var compressed = out.toByteArray();
    System.out.println(compressed.length); // 133

    try (final var zis = new ZipInputStream(new ByteArrayInputStream(compressed))) {
        final var entry = zis.getNextEntry();
        if (entry != null) {
            final var uncompressed = zis.readAllBytes();

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

DeflaterOutputStreamで宣言されたメソッド

deflate, flush, write

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

FilterOutputStreamで宣言されたメソッド

write

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

OutputStreamで宣言されたメソッド

nullOutputStream

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


関連記事

ページの先頭へ