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使用例をご参照ください。