Jarファイルのリソース

Javaアプリケーションを格納するJarファイルには、任意のバイナリファイルをリソースとして入れる事が出来ます。これにより、たくさんのファイルを一つにまとめられるので開発したアプリケーションを配布したり、Javaアプレットを公開する時にはJarファイルにまとめればすっきりするでしょう。Jarファイルに格納するファイルはまとめてZIP圧縮をかけることができるので、容量面でも有利です。
今回は、このJarファイルにbmpを入れて読み出してみる事にします。

Jarファイル

 Jarファイルを作るには、

jar cvf jarファイル名 アーカイブするファイル名

 とします。これで、指定したファイルがデフォルト状態ではZIPで圧縮されjarファイルにまとめられます。なお、引数を変えることで圧縮しないアーカイブや署名を施したアーカイブも作成可能です。
 作成されたjarファイル内のファイルは、同じjarファイル内のクラスからリソースとして自由に利用できるようになります。jar内のリソースを読み込む時には、読み込むクラスのclassオブジェクトのgetResourceAsStream()にファイル名を指定し、jarファイル内にリソース化されたファイルを読み込むストリームを開いてください。例えば、jarres.classtest.bmp

jar cvf jarres.jar jarres.class test.bmp

 としてjarres.jarというjarファイルにまとめ、jarres.classからtest.bmpを読み込むストリームを開くには、jarres.classのソースファイルで

InputStream fs=jarres.class.getResourceAsStream("test.bmp");

 としてtest.bmpを読み込むストリームを作ってストリームからデータを読み込みます。

 このように複数のファイルを一つのアーカイブにまとめる機能は、特に多くのグラフィックやサウンドを利用するアプリケーション開発で有効でしょう。

リソースからのBMP読み込み

 では、実際にjarファイルからファイルを読み込んでみましょう。今回は、クラスファイルとbmpファイルをjarファイルにアーカイブして、Javaのプログラムからbmpファイルをバイナリリソースとして読み込んでみます。

 まず、読み込む処理ですが、これはBMPファイルの読み込みで作成したreadBMP()をそのまま使います。ただし、今回はファイルではなくリソースのストリームから読み込むので、その部分だけを変えれば良いでしょう。リソースを読み込むストリームは、classオブジェクトのgetResourceAsStream()で開いて、リソースの大きさはavailable()で取得してみました。

  InputStream fs=jarres.class.getResourceAsStream(fn);

  size=fs.available();

  dat=new byte[size];

  fs.read(dat);

  fs.close();

 これで、BYTE型配列datfnで指定されたリソースの全内容が格納されたので、後はBMPファイルの読み込みの時と同様の処理でその内容からBufferedImageを作るだけです。

プログラム

 今回もJava2です。まず、コンパイルしてクラスファイルjarres.classが出来たら、適当な24ビットBMPを用意してください。そして、

jar cvf jarres.jar jarres.class bmpファイル名

 としてjarファイルを作成します。プログラムでは、読み込むファイルをテキストフィールドで指定できるようにしておきましたので、早速jarファイルを実行(java jarres)して、bmpファイルを読み込んでみてください。実行する時には、ちゃんとjarファイルから読み込まれているかを確かめるためにjarファイルだけを他のディレクトリに移しておくと良いでしょう。

プログラムソース表示


Javaプログラミング実験室 > プログラミング資料庫