第 7 章 ScratchPadとリソースの使用
7.1 ScratchPadに対する読み取りと書き込み
iアプリは、永続データ(長期間の保持・保存が必要なデータ)の主要な格納場所としてサーバー
もしくは ScratchPad を使用します。iアプリ実行環境では、iアプリの実行終了後もデータを保存
し続け、次にそのiアプリが実行されたときにそれを再び利用できるようにするための、 ScratchPad と呼ばれる特別な記憶領域が個々のiアプリに与えられます。使用可能な ScratchPad サイズには、
3.2 項で解説した制限があります。さらに、あるiアプリに割り当てられた ScratchPad にアクセス できるのは、それを作成したiアプリだけです。
iアプリで ScratchPad を使用するには、ADF の SPsize キーを使ってそのiアプリの使用する
ScratchPad サイズを指定する必要があります。JAM は、指定された ScratchPad サイズと JAR ファ
イルサイズの両面から、携帯電話にそのiアプリをダウンロードできるスペースがあるかどうかを 判定します。ADF の記述方法については、15.5.1 項を参照してください。
ScratchPad の記憶モデルには、トランザクションの概念の一部が導入されています。ScratchPad に
対する変更は、必ず全部が書き込まれるか、全部が拒否されます。
JAM は、ADF に ScratchPad サイズが指定されているiアプリごとに記憶領域を作成し、それを管 理します。JAM が記憶装置にデータを実際に書き込むタイミングは、メーカーのメモリやシステ ムモデルの最適化方法によって異なります。
ScratchPad へのアクセスは Generic Connection フレームワークを使用して行います。
ScratchPad の URL の書式は以下の通りです。
scratchpad:///<number> [;pos=<start-point> [,length=<access-length>] ]
アプリケーションに割り当てられた ScratchPad は、 ADF の SPsize キーの指定により最大 16 個ま
で分割管理することができます。<
number>には、何番目の ScratchPad にアクセスするかを 0~15
までの数字で指定します。
Copyright Ⓒ 2008-2012 NTT DOCOMO, Inc. All Rights Reserved.
また、pos オプションの値<start-point>には指定された番号の ScratchPad におけるアクセス開始オ フセットを、length オプションの値<access-length>にはアクセス開始オフセット位置からのバイ ト数を指定します。 pos オプションを指定した場合は、その位置からデータの読み取りまたは書き 込みが行えます。また pos オプションとともに length オプションを指定した場合は、そのスト リームの長さは length オプションで指定された長さとなります(pos オプションを指定せずに length オプションを指定することはできません)。pos オプション、length オプションとも、
それらを適用した結果 ScratchPad の領域(分割管理されている場合は分割された個々の領域)を逸 脱する値を指定することはできません。
Connector.open()に対して ScratchPad の URL を指定すると、このメソッドは
StreamConnection の実装インスタンスを返します。アプリケーションプログラムは、この StreamConnection インスタンスから入出力ストリームを取り出して ScratchPad へのアクセスを 行います。
【DoJa-3.0】
ScratchPadの分割管理およびlengthオプションは、DoJa-3.0プロファイルにて追加されました。DoJa-2.0プ ロファイル以前のプロファイルでは、ScratchPadのURLに指定する<number>の値は0固定となります。
ScratchPadを分割管理するためのADF(SPsizeキー)の宣言方法については、15.5.1項を参照してください。
なおScratchPadアクセスは、性能やリソースに制約のある携帯電話にとってコストの高い処理です。大きな
ScratchPad領域を使用するiアプリでは、ScratchPadアクセス時のURLにposオプションおよびlengthオ プションを適切に指定することで、必要なエリアだけを最低限のメモリ使用量でアクセスできるようにしてく ださい。機種によっては、メディアデータをScratchPadから読み込む場合(MediaManagerクラスのメディ アデータ取得メソッドにScratchPadのURLを指定する場合)、そのURLに適切なlengthオプションを設定 することでアプリケーションの実行パフォーマンスが向上する場合があります。
次の 2 つの例は、 ScratchPad への書き込みと ScratchPad からの読み取りをどのように行うかを示し たものです。
例: ScratchPad 領域への書き込み
import java.io.*;import javax.microedition.io.*;
public void save() { try {
OutputStream out = Connector.openOutputStream("scratchpad:///0") out.write((hi_score >> 24) & 0xff);
out.write((hi_score >> 16) & 0xff);
out.write((hi_score >> 8) & 0xff);
out.write(hi_score & 0xff);
out.close();
} catch (IOException e) {
// ScratchPad入出力の例外処理 }
}
例: ScratchPad 領域の読み取り
import java.io.*;import javax.microedition.io.*;
public void load() {
Copyright Ⓒ 2008-2012 NTT DOCOMO, Inc. All Rights Reserved.
try {
InputStream in= Connector.openInputStream("scratchpad:///0") hi_score = in.read() << 24;
hi_score |= (in.read() << 16);
hi_score |= (in.read() << 8);
hi_score |= in.read();
in.close();
} catch (IOException e) {
// ScratchPad入出力の例外処理 }
}
例: ScratchPad 領域の読み取り
// ScratchPadの4番めのバイトから始まるUTF(つまりUnicode)文字列を取り出す。
// 最初の4バイトは他の用途(前の例では4バイトの数値)で使用されている。
package spaceinv;
import java.io.*;
import javax.microedition.io.*;
public class UserNameScreen extends Panel implements TimerListener { private String name;
/** このクラスのインスタンスを作成する。 */
public UserNameScreen() { try {
DataInputStream in = Connector.openDataInputStream(
"scratchpad:///0;pos=4");
name = in.readUTF();
in.close();
} catch (IOException e) {
// ScratchPad入出力の例外処理 }
… }
… }
注意事項:
● ScratchPadへのStreamConnectionをオープンする場合、オープンモードとしてConnector.READ、
Connector.WRITE、Connector.READ_WRITEの各モードが指定できます。Connector.READ_WRITEモ ードでオープンしたScratchPadからは入力ストリーム、出力ストリームのいずれも取得できます。ただし、1 つのStreamConnectionについて、入力ストリームと出力ストリームを同時に有効な状態にすることはで きません。一方をオープンする際には、必ず他方がクローズされた状態となるようにしてください。
【DoJa-2.0】
Connector.READ_WRITEでのScratchPadのオープンは、DoJa-2.0プロファイル以降でのみ可能です。
DoJa-1.0プロファイルでは、ScratchPadをConnector.READ_WRITEでオープンした際の動作はメーカ ーにより異なります。
● DoJa-3.0プロファイル以降では、ユーティリティの位置付けとしてJarインフレータ機能
(com.nttdocomo.util.JarInflaterクラス)をサポートしており、Jar形式で圧縮されたファイルの エントリをiアプリで展開することができます。JarInflaterにJarファイルをScratchPadからの読み込み ストリームとして与える場合、ScratchPadのURLにはposオプションおよびlengthオプションを使用し て、厳密なJarファイル格納位置を指定するようにしてください。これを行わない場合、ファイルフォーマ ットエラーとして例外がスローされることがあります。
以下に、ScratchPadに格納されたJarファイルの内容をJarインフレータ機能を使用して読み込む例を示し ます。
Copyright Ⓒ 2008-2012 NTT DOCOMO, Inc. All Rights Reserved.
例: ScratchPadに格納されたJarファイルの利用
// ScratchPad先頭から1Kバイトの位置に格納された、長さ1867バイトの // Jarファイルを使用する。
try {
String url = "scratchpad:///0;pos=1024,length=1867";
// ScratchPadからの読み込みストリームをオープンする。
InputStream is = Connector.openInputStream(url);
// Jarインフレータオブジェクトを生成する。
JarInflater ji = new JarInflater(is);
// Jarインフレータオブジェクトが生成された後は、コンストラクタに指定した
// 読み込みストリームは不要となる。
is.close();
// Jarファイルに含まれるファイルのエントリ名を指定して、目的のファイルに
// アクセスするための読み込みストリームをオープンする。
InputStream is2 = ji.getInputStream("datafile.bin");
for (;;) {
// 読み込んだデータを処理する。
...
}
// Jarエントリ読み込み用のストリームをクローズする。
is2.close();
// Jarインフレータをクローズする。
ji.close();
} catch (IOException ioe) {
// ScratchPadアクセスでエラーが発生した場合はこの例外が発生する。
...
} catch (JarFormatException jfe) {
// JarインフレータがJarのファイルフォーマットエラーを検出した場合は // この例外が発生する。
...
}
なお、JarInflaterクラスの詳細についてはAPIリファレンスを参照してください。