15
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Javaでzipファイルを解凍する

Last updated at Posted at 2018-08-24

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.ziptextディレクトリに解凍されると同時に、以下のようなログが標準出力に表示されるはずです。

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
15
10
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?