第13回 スクラッチパッドへの書き込み

iアプリを存分に活用するには,ネットワークへの接続が必須。まずは前段階としてスクラッチパッドの扱いを解説する。

【国内記事】 2001年4月20日 更新

 読者からの質問コーナーで何度か,「データが大きくなりすぎるようならネットからダウンロードするように作るといい」と述べてきた。それを読んで「どうやってやるんじゃい!」と怒っている読者がいるといけないので,今回は簡単な例を示すことにする。

パケット代を浮かせる賢い方法

 繰り返しになるが,iアプリはプログラムのアーカイブ(JAR)サイズ10Kバイト以内,スクラッチパッドの使用サイズは5Kバイト以内に制限されている。スクラッチパッドに関しては,事実上,多くの機種が10Kバイトまで利用できるようだが,iアプリのミニマム仕様に従っておいたほうが無難といえば無難だろうと思う。

 サイズ制限で,頭を悩めるのが前々回に取り上げたサウンドやグラフィックのデータの取り扱いだ。グラフィックはシンプルに収めれば数百バイトで済むが,サウンドはそうはいかない。数秒のデータでさえキロバイト単位になってしまうことがあり,サイズ制限の壁に突き当たる要因になりそうだ。

 そんなときに,逃げる1つの手としてネットワーク接続がある。これまでに説明してきたように,グラフィックデータやサウンドデータはメディアマネージャというクラスを通して入手できる。データのロケーション(場所)としてURLが指定できるので,ネットから取得させるのは簡単だ。たとえば,サウンドなら次のようにすればいい。

ms =
 MediaManager.getSound(
   "http://foo.bar.co.jp/i/hoge.mld" );

 ただ,この手法には問題もある。そのソフトを使うたびにネットへ接続しなければならないので,結果的にパケット代がかかるのである。1パケット(128バイト)=0.3円とはいえ,ユーザーにとっては痛い出費だ。

 そこで次に考えるのが,初回起動時だけネットにアクセスして,必要なデータをiアプリの保存領域=スクラッチパッドに保存し,次からはネットに接続せずにスクラッチパッドのデータを使うという手法である。これなら,ネットの接続は最初の1回だけなので,ユーザーの負担も軽くて済む。

 ということで今回は,以前に取り上げたImageDemo(キーボードに合わせて絵が動く)を改造して,絵のデータをネットからダウンロードして使えるようにしてみる。そのために,まずスクラッチパッドの取り扱いから説明していくことにしよう。

スクラッチパッドへの書き込み

 以前に少し触れたが,スクラッチパッドもURLでアクセスする。スクラッチパッドのURLは次のように指定する。

scratchpad:///0;pos=n

 後ろの;pos=nの部分はオプションで,nは先頭からのオフセットのバイト数を指定する。たとえば,先頭から100バイト目を取り扱いたいのならscratch:///0;pos=100というURLを指定するわけだ。オプションを省略した場合,オフセットは0とみなされる。

 この例で分かるように,スクラッチパッドでは基本的に「ファイル名」という概念は使えない。複数のデータを入れたいのなら,サイズとオフセットを使ってプログラム側で管理してやらなければならないわけだ。

 次に典型的な,スクラッチパッドへの書き込みを示す。

OutputStream out;
try {
 out = Connector.openOutputStream(
       "scratchpad:///0" );

 out.write(書き込むデータ);
 out.close();
}
catch( IOException e) {
  //
}

 ネット接続を取り扱うConnectorクラス(後述するがConnectorクラスが取り扱えるのはHTTPまたはHTTPSのみ)を使い,OutputStreamを開き,それに対して書き込みを行う形を取るわけだ。

 得られるOutputStreamは,標準Javaで多用されるjava.io.OutputStreamと基本的に同じと考えていい。ただし,標準ストリーム入出力ライブラリのうち,iアプリ仕様で使えるユーティリティクラスは制限されている。使える主なクラスを挙げておこう。

ByteArrayInputStream
ByteArrayOutputStream
DataInputStream
DataOutputStream
InputStreamReader
OutputStreamWriter

 これらを必要に応じて使い分ければいいのだが,Javaに慣れていないと,これらの何が異なり,どう使い分ければいいのか悩む人もいるかもしれない。が,あんまり悩まなくてかまわない。

 Javaでは,OutputStream(あるいはInputStream)が基底クラスになっていて,それ以外の入出力クラスは,OutputStreamをカプセル化し,便利そうな機能を付加してくれる形に作られている。たとえば,OutputStreamだけでは,データの書き込みに(せいぜい)上記に示したwrite()メソッドしか使えないが,OutputStreamからDataOutputStreamクラスを作れば,writeInt()(整数値を書き込む)やwriteByte()(バイト値を書き込む)などが使えるという具合になっている。そっちが便利だなと思えば,それを使えばいいし,write()が使えれば用は足りると思えば,それでもいい。どちらを使っても結果的に指定したストリームに書き込みが行われる点は同じだからだ。

 そのwrite()だが,上記で「書き込むデータ」の部分に指定した整数値(int)の下位8ビット=1バイトを,出力ストリームに書き込むメソッドだ。整数値を指定するが,上位ビットは無視され,書き込まれるのは1バイトだけという点に気をつけてほしい。

 以上が書き込みだが,スクラッチパットからの読み込みは上記の逆で,Connectorクラスを使いInputStreamを得ればいい。改めて説明するまでもないと思うので,次に基本形だけを示しておこう。

int value; // 読み込みデータ
InputStream in;
try {
 in = Connector.openInputStream(
       "scratchpad:///0" );
 value = in.read();
 in.close();
}
catch(IOException e) {
 // エラー
}

 さて,次回はネット接続の部分を取り上げたい。冒頭でアナウンスしたImageDemoのネット接続改造バージョンのソースコードは完成している。
http://gadget.mda.or.jp/iapp/ImageDemo.java
からダウンロードして参考にして欲しい。また,503iを所有している人は
http://gadget.mda.or.jp/i/ImageDemo.html
にアクセスして,そのiアプリを動かしてみることができる。

関連記事
▼KDDI,au端末搭載Javaの概要を公開──プログラムサイズは50Kバイト
▼J-フォン,Java端末の全貌を公開──ハードウェアの制御も可能
▼iアプリの互換性は大丈夫なのか?
▼iモード対応Javaを作るのに必要なものは?──NTTドコモ,仕様をついに公開

[米田 聡,ITmedia]

Copyright © ITmedia, Inc. All Rights Reserved.



モバイルショップ

最新CPU搭載パソコンはドスパラで!!
第3世代インテルCoreプロセッサー搭載PC ドスパラはスピード出荷でお届けします!!

最新スペック搭載ゲームパソコン
高性能でゲームが快適なのは
ドスパラゲームパソコンガレリア!