Javaの標準アーカイブであるJARファイルは,Javaの標準APIで作成したり,解凍したりすることが可能です。ここでは,JARファイルに含まれる特定の拡張子がついているファイルの抽出を例に,プログラムでJARファイルを読み込む方法を紹介します。
サン・マイクロシステムズが提供しているJARファイルのドキュメントによると,JARファイルはZIPファイル形式に基づいたファイル形式で,META-INFディレクトリにマニフェストファイルを格納することがオプションになっています。プログラムでJARファイルやZIPファイルを読み込む場合は,次のリストに示すようにjava.util.jar.JarFileおよびjava.util.zip.ZipEntryクラスを使います。
JarFile jar = new JarFile(jarfile);
Enumeration files = jar.entries();
while (filest.hasMoreElements()) {
ZipEntry entry = (ZipEntry)files.nextElement();
// entryを使ってJARファイルに格納されたディレクトリやファイルにアクセス
System.out.println(entry.getName());
}
使い方としては,JarFileのコンストラクタにファイルのパス名(URL)を示す文字列またはFileオブジェクトを与え,JarFileオブジェクトを生成します。JarFile#entriesメソッドでアーカイブされているファイルのエントリの列挙を取得します。Enumerationに格納されているオブジェクトはZipEntryオブジェクトで,エントリ情報にアクセスするためのメソッドが提供されています。
表 ZipEntryクラスの主なメソッド
メソッド | 概要 |
---|---|
getCompressedSize() | 圧縮サイズを取得する |
getCrc() | 解凍後のCRC-32チェックサムを取得する |
getName() | エントリ(ファイル)名を取得する |
getSize() | 解凍後のファイルサイズを取得する |
getTime() | エントリの更新時間を取得する |
isDirectory() | エントリがディレクトリかどうか調べる |
JARファイルに格納されたファイル(ディレクトリ)のエントリは,ZipEntry#getNameメソッドを使って取得します。isDirectoryメソッドを使うことで,エントリがディレクトリかファイルなのかを調べることができます。
エントリ名は,ディレクトリ構造ごとアーカイブされている場合,次に示すように/(スラッシュ)で区切られています。
org/eclipse/ui/texteditor/EditorMessages.properties
実際にファイルエントリを読み込む場合は,エントリのZipEntryオブジェクトを渡してJarFile#getInputStreamメソッドを呼びます。
byte[] buf = new byte[1024];
int readsize = 0;
InputStream is = jar.getInputStream(entry);
while ((readsize = is.read(buf, 0, 1024)) != -1) {
// 読み込んだデータを処理
}
is.close();
ここではInputStreamオブジェクトをそのまま利用していますが,BufferedInputStreamを利用したり,読み込むエントリがテキストファイルであればBufferedReaderクラスを利用したりしてもよいでしょう。
「JAVA Developer」より毎週役立つJava Tipsを配信中。ほかにも参考になるTipsは、JAVA Developerサイトのバックナンバーから探すことが可能です。
Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.