次のページへjava.util.zipパッケージでzipファイルを操作zipファイル形式の概要zip形式には、ファイル圧縮機能とアーカイブ機能があります。アーカイブ機能がある分、gzip形式よりも複雑です。APIも、より複雑な構造になっています。zipファイルを標準APIで利用できるのはとても便利ですが、残念なことに、ここで注意しなければならない点をお知らせしなくてはなりません。zipファイル名の文字コードによる悲劇java.util.zipパッケージのzipファイル入出力は、zipファイルをアーカイブする際にファイル名としてUTF-8文字エンコーディングを利用しています。これはさまざまな国と地域で利用されるJava言語にとって自然な判断なのでしょう。ところが、世間一般に出回っているzipファイルを扱うためのユーティリティプログラム(「アーカイバ」などと呼ばれる)はUTF-8文字エンコーディングによるファイル名に対応していないものがほとんどなのです。XP標準で提供されているzip形式関連機能も同様です)。646(通称、ASCIIコード)については連載第6回「‘愛’で学ぶ文字コードと文字化けの常識」の「文字化けには問題がこんなにたくさんある!」を参照してください)。zipファイルを作成するサンプルzipファイルを作成するためには、java.util.zip.ZipOutputStreamクラスを利用します。java.util.zip.GZIPOutputStreamと異なり、java.util.zip.ZipEntryというアーカイブに含まれるファイルやディレクトリを表すクラスを利用しながら、ファイル圧縮およびアーカイブを行います。java.util.zip.ZipOutputStreamにより圧縮されて連結先の出力ストリーム(この例では、java.io.BufferedOutputStream)に書き込まれていきます。{System.out.println("zipファイル作成中に"+"例外が発生しました。出力するzipファイル。入出力例外が発生した場合。終了このプログラムが作成したzipファイルを[エクスプローラ]で表示すると、下記のようになります。APIを利用してディレクトリを作成すると、下記の「ABC」のように、ディレクトリ実体と余分なエントリの2つが作成されます。APIの仕様上、仕方がないようです(Javaツールのjarコマンドにおいても同様の現象が発生します)。作成されたzipファイルzipファイルを読み込むサンプル次に、作成したzipファイルを展開(解凍)しながら読み込むサンプルプログラムを見ていきましょう。このサンプルも、直前で示したCreateZipSampleが作成したzipファイルを読み込むという仮定の下に作られています。具体的には、ファイル名はUTF-8文字エンコーディング、読み込まれるデータは少量のテキストファイルであり、かつ同じデフォルト文字エンコーディング環境で動作しているものと仮定しています。{System.out.println("zipファイル読込中に"+"例外が発生しました。{zipInStream.close();}}}ここでは、java.util.zip.ZipInputStreamクラスを使用しています。連結先の入力ストリーム(ここでは、java.io.BufferedInputStream)からデータを読み込んで、java.util.zip.ZipEntryを取り出してアーカイブ前のディレクトリおよびファイルの情報を取り出し、zip形式で展開(解凍)しながら読み込んでいます。終了いよいよ次ページでは、Javaに欠かせないjar形式を見ていきます。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。