Javaでzipファイルを解凍する機会があったため、そのときの技術メモになります(´・ω・`) まずは次の手順でzipに格納する3つのファイル(a.txt
, dir1/b.txt
, dir1/dir2/c.txt
)を作成します。
mkdir -p dir1/dir2
touch a.txt dir1/b.txt dir1/dir2/c.txt
echo "AAAAAAAAAA" > a.txt
echo "BBBBBBBBBB" > dir1/b.txt
echo "CCCCCCCCCC" > dir1/dir2/c.txt
作成した内容については次のようなコマンドで確認することができます。
find . -name "*.txt" | while read path; do
echo "---> ${path} <---"
cat ${path}
done
---> ./a.txt <---
AAAAAAAAAA
---> ./dir1/b.txt <---
BBBBBBBBBB
---> ./dir1/dir2/c.txt <---
CCCCCCCCCC
想定通りに3つのファイルが作成されていることが確認できたので、これをtext.zip
ファイルとして圧縮します。
$ zip "text.zip" $(find . -name "*.txt")
adding: a.txt (deflated 45%)
adding: dir1/b.txt (deflated 45%)
adding: dir1/dir2/c.txt (deflated 45%)
最後にtext.zip
ファイルが正常に作成できたことを確認しておきましょう。
$ unzip -l text.zip
Archive: text.zip
Length Date Time Name
--------- ---------- ----- ----
11 2018-08-24 23:17 a.txt
11 2018-08-24 23:17 dir1/b.txt
11 2018-08-24 23:17 dir1/dir2/c.txt
--------- -------
33 3 files
前置きが長くなりましたが、text.zip
ファイルをtext
ディレクトリに解凍したいという場合、それを実現するJavaコードは以下の通りになります。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class Main {
public static void main(String[] args) throws IOException {
var target = Paths.get("text");
Files.createDirectories(target);
var zipfile = Paths.get("text.zip");
try (var in = new ZipInputStream(Files.newInputStream(zipfile))) {
ZipEntry e;
while ((e = in.getNextEntry()) != null) {
var dst = Paths.get(target.toString(), e.getName());
Files.createDirectories(dst.getParent());
Files.write(dst, in.readAllBytes());
System.out.printf("inflating: %s%n", dst);
}
}
}
}
このJavaコードを実行すると、text.zip
がtext
ディレクトリに解凍されると同時に、以下のようなログが標準出力に表示されるはずです。
inflating: text\a.txt
inflating: text\dir1\b.txt
inflating: text\dir1\dir2\c.txt
では本当にtext.zip
ファイルがtext
ディレクトリ配下に解凍されたのか。これについては以下のようなコマンドで確かめることができます。
$ find ./text -name "*.txt" | while read path; do
> echo "---> ${path} <---"
> cat ${path}
> done
---> ./text/a.txt <---
AAAAAAAAAA
---> ./text/dir1/b.txt <---
BBBBBBBBBB
---> ./text/dir1/dir2/c.txt <---
CCCCCCCCCC