iアプリでは、jarファイル内のファイルを取得するcom.nttdocomo.util.JarInflaterクラスを利用することができます。このJarInflaterクラスを使うと、リソースやネットから取得したjarファイルのバイナリ/ストリームから、jarファイル内のファイルを取得することが可能です。
DoJa5.0より前の環境では、アプリケーションの実行ファイルとスクラッチパッドが分離されている(アプリケーションファイルサイズ最大100KB、携帯端末内スクラッチパッド400KBなど)ので、大きなデータを扱う携帯アプリ開発では配布用のファイルにすべてのデータを格納できません。「実行時にネットからデータを読み込んでスクラッチパッドに保存する」仕組みが必要になります。
そのような場合、圧縮とアーカイブ機能を持つjarファイルを簡単に扱えるJarInflaterは、非常に役に立つことでしょう。
また、最近の携帯端末が対応しているメガアプリでも、開発の段階でアプリで使用するデータをjarファイルとして外部から取り込む仕組みを実装しておけば、後から簡単に「追加データ」を配信できるようになります。
JarInflaterを使うには、まずjarファイルのバイナリデータ(byte型配列)か、jarファイルを読み込めるInputStreamを引数にコンストラクタを呼び出します。これで、jarファイルを扱うJarInflaterオブジェクトが作成されたので、後はgetInputStream()メソッドで指定ファイルを読み込むストリームを取得し、読み込むだけです。読み込みが終わったら、close()して処理を終えます。
たとえば、jarファイルのバイナリとファイル名を渡してjarファイル内にあるファイルのバイナリイメージを取得する関数は、以下のように書けます。
// jarファイルのバイナリjar内のファイルfileを取得
public byte[] getJarFile(byte[] jar, String file) {
if (jar == null || file == null) {
return null;
}
JarInflater inf = null;
// JarInflater作成
try {
inf = new JarInflater(jar);
} catch (Exception e) {
}
if (inf == null) {
return null;
}
InputStream is = null;
// ファイルのInputStream作成
try {
is = inf.getInputStream(file);
} catch (Exception e) {
}
if (is == null) {
inf.close();
return null;
}
// ストリーム読み込みバッファ確保
byte[] cash = new byte[512];
if (cash == null) {
try {
is.close();
} catch(Exception ee) {
}
inf.close();
return null;
}
// 読み込んだデータを保存するByteArrayOutputStream作成
ByteArrayOutputStream buf = new ByteArrayOutputStream();
int loaded = -1;
// ストリームからデータ読み込み
do {
try {
loaded = is.read(cash);
} catch (Exception e) {
loaded = -1;
}
if (loaded > 0) {
try {
buf.write(cash, 0, loaded);
} catch (Exception ee) {}
}
} while (loaded > 0);
try {
is.close();
} catch(Exception ee) {
}
inf.close();
// 読み込んだデータを配列化
byte[] data = buf.toByteArray();
try {
buf.close();
} catch(Exception ee) {
}
return data;
}
なお、jarファイル内のファイルパスにはディレクトリを含むこともできるので、jarファイルを作成・利用する際はディレクトリ構造に注意してください。jarファイルを作成したら、
jar tvf test.jar
などとして、ファイルの内容を確認しておきましょう。
サーバーからjarファイルをダウンロードするiアプリを配信する場合は、iアプリの設定ファイルでネットワーク(http)の使用設定を忘れずに。