LoginSignup
4
4

More than 3 years have passed since last update.

Javaでgzファイルを解凍するサンプル

Last updated at Posted at 2019-11-07

サーバ上のgzの中身を確認する必要があるにも関わらず、手元のへっぽこWindows7 PCには7zipのようなgzに対応したソフトウェアがインストールされていない。サーバ上で解凍すると、元ファイルが巨大すぎて、手元のPCに持ってこれない恐れがある。手元で使えそうなものはJavaとEclipseだけ--ということで、Javaでgzファイルを解凍するという機会がありましたので、そのサンプルコードをQiitaに供養しておきたいと思います。

import java.io.IOException;
import java.io.OutputStream;
import java.io.UncheckedIOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.zip.GZIPInputStream;

public class GZIPUtils {
    public static void unzip(Path src, Path dst) {
        try (GZIPInputStream in = new GZIPInputStream(Files.newInputStream(src));
             OutputStream out = Files.newOutputStream(dst)) {
            int len;
            byte[] b = new byte[1024 * 4];
            while ((len = in.read(b)) != -1) {
                out.write(b, 0, len);
            }
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    }
}

稼働確認をしてみましょう。まず適当なテキストファイルを作成します。ここでは1MB, 10MB, 100MBのファイルを作るとして、名前をそれぞれ001mb.txt, 010mb.txt, 100mb.txtとしておきましょう。

$ cat /dev/urandom | tr -cd [:print:] | head -c 1m   > 001mb.txt
$ cat /dev/urandom | tr -cd [:print:] | head -c 10m  > 010mb.txt
$ cat /dev/urandom | tr -cd [:print:] | head -c 100m > 100mb.txt

この3つのファイルについて、メッセージダイジェストを取得しておき、正しく解凍できているかどうかの検証に使うことにします。

$ sha256sum *.txt
f2cddb9f0bb64033f7a9d8979a47d925af06271b2e7d79b99bd9e41ad504616d  001mb.txt
0282119ac4c00a1c14370b65e72f3283d988264fb3240f46b679ada117db3979  010mb.txt
1104a28dd5a4033c5dd495289b590526b60c1f285357dd26af53ed0f5c4898c0  100mb.txt

メッセージダイジェストも取得できたということで、この3つのファイルをGZIP形式で圧縮します。

$ gzip *.txt
$ ls -lh *.gz
-rwxrwxrwx 1 dev dev 852K Nov  7 20:33 001mb.txt.gz
-rwxrwxrwx 1 dev dev 8.4M Nov  7 20:33 010mb.txt.gz
-rwxrwxrwx 1 dev dev  84M Nov  7 20:34 100mb.txt.gz

ここで圧縮したファイルを自作のJavaプログラムで解凍してみます。以下のMain.javaGZIPUtils::unzipを利用して001mb.txt.gz, 010mb.txt.gz, 100mb.txt.gzをそれぞれunzipped_001mb.txt, unzipped_010mb.txt, unzipped_100mb.txtという名前に解凍します。

Main.java
import java.nio.file.Paths;

public class Main {
    public static void main(String[] args) {
        GZIPUtils.unzip(Paths.get("001mb.txt.gz"), Paths.get("unzipped_001mb.txt"));
        GZIPUtils.unzip(Paths.get("010mb.txt.gz"), Paths.get("unzipped_010mb.txt"));
        GZIPUtils.unzip(Paths.get("100mb.txt.gz"), Paths.get("unzipped_100mb.txt"));
    }
}

あとはMain.javaをコンパイルしたあとに実行、その実行結果を確認すると、想定通りunzipped_001mb.txt, unzipped_010mb.txt, unzipped_100mb.txtという3つのファイルが作成されていることがわかります。

$ javac Main.java GZIPUtils.java
$ java -cp . Main
$ ls -hl unzipped*
-rwxrwxrwx 1 dev dev 1.0M Nov  7 23:09 unzipped_001mb.txt
-rwxrwxrwx 1 dev dev  10M Nov  7 23:09 unzipped_010mb.txt
-rwxrwxrwx 1 dev dev 100M Nov  7 23:09 unzipped_100mb.txt

この3つのファイルについてメッセージダイジェストを確認すると、圧縮前のtxtファイルと全く同じことがわかります。つまりGZIPUtils::unzipは想定通り動作していると考えられます。

$ sha256sum unzipped*
f2cddb9f0bb64033f7a9d8979a47d925af06271b2e7d79b99bd9e41ad504616d  unzipped_001mb.txt
0282119ac4c00a1c14370b65e72f3283d988264fb3240f46b679ada117db3979  unzipped_010mb.txt
1104a28dd5a4033c5dd495289b590526b60c1f285357dd26af53ed0f5c4898c0  unzipped_100mb.txt
4
4
0

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
4
4