広告

Java : ZipFile - API使用例

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


概要

このクラスは、ZIPファイルからエントリを読み込むために使用します。

クラス構成

ZipFile クラスを使うと、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 zipFile = new ZipFile(path.toFile())) {
    zipFile.stream().forEach(entry -> {
        System.out.println("-- entry --");
        System.out.println("name : " + entry.getName());

        try (final var is = zipFile.getInputStream(entry)) {
            final var uncompressed = is.readAllBytes();
            System.out.println("uncompressed : " + new String(uncompressed));
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    });

    // 結果
    // ↓
    //-- entry --
    //name : bbb.txt
    //uncompressed : YYYYY
    //-- entry --
    //name : ccc.txt
    //uncompressed : ZZZZZ
}

フィールド

static final int CENATT

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

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

static final int CENATX

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

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

static final int CENCOM

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

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

static final int CENCRC

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

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

static final int CENDSK

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

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

static final int CENEXT

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

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

static final int CENFLG

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

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

static final int CENHDR

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

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

static final int CENHOW

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

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

static final int CENLEN

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

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

static final int CENNAM

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

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

static final int CENOFF

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

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

static final long CENSIG

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

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

static final int CENSIZ

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

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

static final int CENTIM

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

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

static final int CENVEM

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

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

static final int CENVER

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

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

static final int ENDCOM

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

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

static final int ENDHDR

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

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

static final int ENDOFF

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

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

static final long ENDSIG

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

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

static final int ENDSIZ

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

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

static final int ENDSUB

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

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

static final int ENDTOT

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

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

static final int EXTCRC

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

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

static final int EXTHDR

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

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

static final int EXTLEN

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

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

static final long EXTSIG

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

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

static final int EXTSIZ

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

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

static final int LOCCRC

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

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

static final int LOCEXT

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

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

static final int LOCFLG

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

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

static final int LOCHDR

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

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

static final int LOCHOW

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

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

static final int LOCLEN

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

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

static final int LOCNAM

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

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

static final long LOCSIG

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

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

static final int LOCSIZ

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

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

static final int LOCTIM

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

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

static final int LOCVER

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

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

static final int OPEN_DELETE

ZIPファイルを開いて、削除のマークを付けるモード・フラグです。

System.out.println(ZipFile.OPEN_DELETE); // 4

static final int OPEN_READ

ZIPファイルを読込み用に開くモード・フラグです。

System.out.println(ZipFile.OPEN_READ); // 1

コンストラクタ

ZipFile (File file)

Fileオブジェクトに指定された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());
}

try (final var zipFile = new ZipFile(path.toFile())) {
    zipFile.stream().forEach(entry -> {
        System.out.println("-- entry --");
        System.out.println("name : " + entry.getName());

        try (final var is = zipFile.getInputStream(entry)) {
            final var uncompressed = is.readAllBytes();
            System.out.println("uncompressed : " + new String(uncompressed));
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    });

    // 結果
    // ↓
    //-- entry --
    //name : bbb.txt
    //uncompressed : YYYYY
}

ZipFile (File file, int mode)

指定されたモードで指定のFileオブジェクトから読み込む新しいZipFileを開きます。

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());
}

System.out.println(Files.exists(path)); // true
System.out.println(Files.size(path)); // 133

final int mode = ZipFile.OPEN_READ | ZipFile.OPEN_DELETE;
try (final var zipFile = new ZipFile(path.toFile(), mode)) {
    zipFile.stream().forEach(entry -> {
        System.out.println("-- entry --");
        System.out.println("name : " + entry.getName());

        try (final var is = zipFile.getInputStream(entry)) {
            final var uncompressed = is.readAllBytes();
            System.out.println("uncompressed : " + new String(uncompressed));
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    });

    // 結果
    // ↓
    //-- entry --
    //name : bbb.txt
    //uncompressed : YYYYY
}

System.out.println(Files.exists(path)); // false

ZipFile (File file, int mode, Charset charset)

指定されたモードで指定のFileオブジェクトから読み込む新しいZipFileを開きます。

file, mode パラメータについては ZipFile(File file, int mode) の使用例をご参照ください。
charset パラメータについては ZipFile(File file, Charset charset) の使用例をご参照ください。

ZipFile (File file, Charset charset)

Fileオブジェクトに指定されたZIPファイルを、読込み用に開きます。

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

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

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

try (final var zos = new ZipOutputStream(Files.newOutputStream(path), charset)) {
    zos.putNextEntry(new ZipEntry("bbb.txt"));
    zos.putNextEntry(new ZipEntry("○△×.txt"));
}

try (final var zipFile = new ZipFile(path.toFile(), charset)) {
    zipFile.stream().forEach(entry -> {
        System.out.println("-- entry --");
        System.out.println("name : " + entry.getName());
    });

    // 結果
    // ↓
    //-- entry --
    //name : bbb.txt
    //-- entry --
    //name : ○△×.txt
}

ZipFile (String name)

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());
}

final var name = path.toString();
System.out.println(name); // R:\java-work\aaa.zip

try (final var zipFile = new ZipFile(name)) {
    zipFile.stream().forEach(entry -> {
        System.out.println("-- entry --");
        System.out.println("name : " + entry.getName());

        try (final var is = zipFile.getInputStream(entry)) {
            final var uncompressed = is.readAllBytes();
            System.out.println("uncompressed : " + new String(uncompressed));
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    });

    // 結果
    // ↓
    //-- entry --
    //name : bbb.txt
    //uncompressed : YYYYY
}

ZipFile (String name, Charset charset)

zipファイルを読込み用に開きます。

name パラメータについては ZipFile(String name) の使用例をご参照ください。
charset パラメータについては ZipFile(File file, Charset charset) の使用例をご参照ください。

メソッド

void close ()

ZIPファイルを閉じます。

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

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"));
}

try (final var zipFile = new ZipFile(path.toFile())) {
    zipFile.stream().forEach(entry -> {
        System.out.println("-- entry --");
        System.out.println("name : " + entry.getName());
    });

    // 結果
    // ↓
    //-- entry --
    //name : bbb.txt
}

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

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"));
}

final var zipFile = new ZipFile(path.toFile());
try {
    zipFile.stream().forEach(entry -> {
        System.out.println("-- entry --");
        System.out.println("name : " + entry.getName());
    });

    // 結果
    // ↓
    //-- entry --
    //name : bbb.txt
} finally {
    zipFile.close();
}

Enumeration<? extends ZipEntry> entries ()

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.putNextEntry(new ZipEntry("ccc.txt"));
}

try (final var zipFile = new ZipFile(path.toFile())) {
    final var entries = zipFile.entries();
    while (entries.hasMoreElements()) {
        System.out.println("-- entry --");
        final var entry = entries.nextElement();
        System.out.println("name : " + entry.getName());
    }

    // 結果
    // ↓
    //-- entry --
    //name : bbb.txt
    //-- entry --
    //name : ccc.txt
}

String getComment ()

zipファイル・コメントを返します。コメントがない場合はnullを返します。

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!");
}

try (final var zipFile = new ZipFile(path.toFile())) {
    System.out.println(zipFile.getName()); // R:\java-work\aaa.zip
    System.out.println(zipFile.getComment()); // comment!
}

ZipEntry getEntry (String name)

指定された名前のZIPファイル・エントリを返します。見つからない場合は、nullを返します。

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))) {
    final var entry1 = new ZipEntry("bbb.txt");
    entry1.setComment("BBB!");
    zos.putNextEntry(entry1);

    final var entry2 = new ZipEntry("ccc.txt");
    entry2.setComment("CCC!");
    zos.putNextEntry(entry2);
}

try (final var zipFile = new ZipFile(path.toFile())) {
    final var entry1 = zipFile.getEntry("bbb.txt");
    if (entry1 != null) {
        System.out.println(entry1.getName()); // bbb.txt
        System.out.println(entry1.getComment()); // BBB!
    }

    final var entry2 = zipFile.getEntry("ccc.txt");
    if (entry2 != null) {
        System.out.println(entry2.getName()); // ccc.txt
        System.out.println(entry2.getComment()); // CCC!
    }
}

InputStream getInputStream (ZipEntry entry)

指定された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 zipFile = new ZipFile(path.toFile())) {
    zipFile.stream().forEach(entry -> {
        System.out.println("-- entry --");
        System.out.println("name : " + entry.getName());

        try (final var is = zipFile.getInputStream(entry)) {
            final var uncompressed = is.readAllBytes();
            System.out.println("uncompressed : " + new String(uncompressed));
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    });

    // 結果
    // ↓
    //-- entry --
    //name : bbb.txt
    //uncompressed : YYYYY
    //-- entry --
    //name : ccc.txt
    //uncompressed : ZZZZZ
}

String getName ()

ZIPファイルのパス名を返します。

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

int size ()

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.putNextEntry(new ZipEntry("ccc.txt"));
    zos.putNextEntry(new ZipEntry("ddd.txt"));
}

try (final var zipFile = new ZipFile(path.toFile())) {
    System.out.println("entry size : " + zipFile.size());

    zipFile.stream().forEach(entry -> {
        System.out.println("-- entry --");
        System.out.println("name : " + entry.getName());
    });

    // 結果
    // ↓
    //entry size : 3
    //-- entry --
    //name : bbb.txt
    //-- entry --
    //name : ccc.txt
    //-- entry --
    //name : ddd.txt
}

Stream<? extends ZipEntry> stream ()

ZIPファイル・エントリ上に順序付けされたStreamを返します。

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


関連記事

ページの先頭へ