ZipFile
クラスを使用すると、Zip ファイル内の要素をひとつずつ列挙することができます。
列挙中の要素は、ZipEntry
オブジェクトとして参照することができます。
import java.io.IOException;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
public class Main {
public static void main(String... args) {
showZipEntries("sample.zip");
}
private static void showZipEntries(String filename) {
try (ZipFile zip = new ZipFile(filename)) {
showZipEntries(zip);
} catch (IOException e) {
System.err.println(e);
}
}
private static void showZipEntries(ZipFile zip) {
Enumeration<? extends ZipEntry> entries = zip.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
System.out.println(entry);
}
}
}
上記のように、ZipEntry
オブジェクトをそのまま System.out.println()
に渡すと、その要素の名前(ファイル名 or ディレクトリ名)を出力します(ZipEntry#getName()
で得られる名前と同様です)。
$ java Main
dir1/
dir1/dir2/
dir1/dir2/file5.txt
dir1/dir2/file6.txt
dir1/file4.txt
file1.txt
file2.txt
file3.txt
Java 1.8 以降は、Stream<ZipFile>
を返す ZipFile#stream()
メソッドを使用すると、ループ処理をよりシンプルに記述することができます。
zipFile.stream().forEach(entry -> {
System.out.println(entry.getName());
});
ディレクトリ要素を列挙の対象外にするフィルタ処理も簡潔に記述できます。
zipFile.stream().filter(x -> !x.isDirectory()).forEach(entry -> {
System.out.println(entry.getName());
});