意外と知らないファイル圧縮技術の常識:プログラマーの常識をJavaで身につける(8)(2/4 ページ)
本連載は、Java言語やその文法は一通り理解しているが、「プログラマー」としては初心者、という方を対象とします。Javaコアパッケージを掘り下げることにより「プログラマーの常識」を身に付けられるように話を進めていきます。今回はアーカイブと圧縮の違いなどの基礎知識とともに、Java APIでJava定番のファイル圧縮形式jarやgzip、zip形式を扱う方法も紹介。
ファイル展開(解凍)をしてみよう、そして「可逆圧縮」とは?
ファイル圧縮+アーカイブしたファイルは展開(解凍)の操作によって元に戻すことができます。
先ほどの「単調で大きなファイル.zip」をダブルクリックして開くと、中に含まれるファイルやディレクトリを表示できます。ここでは、先ほど圧縮した「単調で大きなファイル.txt」が中に含まれていることが分かります。
[エクスプローラ]の[ファイルをすべて展開]メニューを選ぶと、アーカイブ内のすべてのディレクトリやファイルを展開(解凍)できます。
展開(解凍)の結果、下記のように圧縮される前と同じ内容のファイルを取り出すことができます。
なお、一般的なデータ圧縮には、圧縮前のデータが完全に復元される圧縮と、完全には復元されない圧縮との2種類があります。ここで紹介しているファイル圧縮(そして、今回の記事で紹介するもの)では、圧縮前のデータが完全に復元されます。
このような圧縮のことを、「可逆圧縮」と呼びます。
Java APIで提供されているアーカイブ/圧縮機能
Java APIでもアーカイブ/ファイル圧縮に関する機能が提供されています。標準的に利用できるアーカイブ/ファイル圧縮形式はgzip、zip、jarの3形式です。この3形式が標準的なAPIで利用できるのは、とても便利なことです。
java.util.zipパッケージでgzipファイルを操作
gzipファイル形式の概要
gzip、zip、jarの3形式のうち、gzip形式には複数のディレクトリやファイルを1つにまとめるアーカイブ機能はありません。Linuxなどでは、よくgzip形式が利用されますが、アーカイブ機能を併せて利用したい場合には、tar形式という別のアーカイブ機能を併用することによってzip形式やjar形式と同様の機能を実現することが多いです。
gzipファイルを作成するサンプル
それでは、gzip形式のファイル圧縮を見ていきましょう。gzipには、アーカイブ機能がないのでAPIは単純です。このため、ストリームプログラミングに組み込んで利用しやすくなっています。ストリームプログラミングについては、前回の記事を参照してください。
前提条件
この記事で挙げるサンプルプログラムは、現実的なプログラムで必要となる粒度の例外処理を実装していません。これは、現実的な例外処理を実装すると、APIの見通しが悪くなってしまうためです。現実的なプログラムで必要となる例外処理の粒度については、前回の記事を参照してください
実際に、gzipファイルを作成するサンプルを見ていきましょう。gzip形式で圧縮されたファイルは伝統的に拡張子「.gz」を付けます。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
java.util.zip.GZIPOutputStreamクラスのオブジェクトにバイナリデータを書き込むと、gzip形式で圧縮してから連結先の出力ストリーム(ここでは、java.io.BufferedOutputStreamクラス)に渡されます。
gzipファイルを読み込むサンプル
次に、作成したgzipファイルを展開(解凍)しながら読み込むサンプルプログラムを見ていきましょう。
なお、このサンプルは、直前で示したCreateGzipSampleが作成したgzipファイルを読み込むという仮定の下に作られています。具体的には、読み込まれるデータは少量のテキストファイルであり、かつ同じデフォルト文字エンコーディング環境で動作しているものと仮定しています。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
ここでは、java.util.zip.GZIPInputStreamクラスを使用しています。連結先の入力ストリーム(ここでは、java.io.BufferedInputStreamクラス)からデータをgzip形式で展開(解凍)しながら読み込んでいます。
さらに次ページでは、java.util.zipパッケージでzipファイルを操作する方法を見ていきましょう。
Copyright © ITmedia, Inc. All Rights Reserved.