zipファイルの中身とその圧縮前のサイズの一覧を取得する--という、この世界でどれだけ需要があるかわからない処理を実装する機会があったため、その技術メモになります。
まずは下準備として、以下の手順でzipファイルを準備します。
mkdir -p dir0/dir1/dir2
echo -n 1 > dir0/file1
echo -n 22 > dir0/dir1/file2
echo -n 333 > dir0/dir1/dir2/file3
cd dir0
zip -r ../zipfile.zip *
cd ..
以上のコマンドを上から順番に流していくと、zipfile.zipというzipファイルが作成されます。中身の検証として、以下の手順でzipfile.zipを解凍、格納されたファイルと圧縮前のサイズの一覧を記録しておきます。
unzip -d dst zipfile.zip
cd dst
find . -type f -exec stat -c %n=%sB {} \;
# ./dir1/dir2/file3=3B
# ./dir1/file2=2B
# ./file1=1B
準備はこれで完了。本題のJavaコードは以下のようになります。
Main.java
import java.io.IOException;
import java.util.zip.ZipFile;
public class Main {
public static void main(String[] args) {
try (var zipfile = new ZipFile("zipfile.zip")) {
var entries = zipfile.entries();
while (entries.hasMoreElements()) {
var entry = entries.nextElement();
if (entry.isDirectory()) {
continue;
}
System.out.printf("%s=%dB%n", entry.getName(), entry.getSize());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
これを実行すると、以下のような出力が得られます。比較してみると、前準備の内容と一致していることがわかりますね(`・ω・´)シャキーン
dir1/dir2/file3=3B
dir1/file2=2B
file1=1B