サーバ上の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.java
はGZIPUtils::unzip
を利用して001mb.txt.gz, 010mb.txt.gz, 100mb.txt.gzをそれぞれunzipped_001mb.txt, unzipped_010mb.txt, unzipped_100mb.txtという名前に解凍します。
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