The next JAVA library(7)
さて、今日からファイルの取り扱いです。
と言っても、jarファイルを生成する際に、その中にリソースを中に含めるのであれば、
InputStream is = Connector.openInputStream("resource:///"+fileName);
これだけで良いです。
……これだけで終われば何も苦労はしませんて(;´Д`)
さて、ここで問題になるのが、スクラッチパッドとレコードストアの扱い。
これは、仕様が全く違います。
スクラッチパッドは、
InputStream is = Connector.openInputStream("scratchpad:///0");
こうやってOpenします。
それに対してレコードストアは、
RecordStore rs = RecordStore.openRecordStore(fileName, false);
こうやってOpenします。
DoCoMoはInputStreamを取得できるので、いつものようにread()やらclose()やらを呼び出せばいいのですが、RecordStoreはそんな簡単にはいきません(;´Д`)
こんな感じで読み込みます。
byte[] buf = rs.getRecord(1)
そう、レコードストアは、レコードごとのbyte配列しか取得できないのです。
これらの2つの違いをどうやって吸収するかが問題です。
当初、自分は、次のようなプログラムを書いていました。
Object fileStream; #if DOCOMO public boolean open(String fileName, int RW){ if(RW == READ){ //jarファイルのリソースから読み込む fileStream = Connector.openInputStream("reasource:///"+fileName); //jarの中にファイルが見つからない if(fileStream == null){ //スクラッチパッドから読み込む } }else if(RW == WRITE){ //スクラッチパッドをOpenする } } #else public boolean open(String fileName, int RW){ if(RW == READ){ //jarファイルのリソースから読み込む fileStream = Connector.openInputStream("reasource:///"+fileName); //jarの中にファイルが見つからない if(fileStream == null){ //レコードストアから読み込む } }else if(RW == WRITE){ //レコードストアをOpenする } } #endif
jarファイルの中のリソースと、レコードストア、スクラッチパッドを透過的に扱おうとしています。
fileStreamがObjectになっているので、InputStreamだろうとOutputStreamだろうと、RecordStoreだろうと取得できます。
で、その元の型情報をintか何かに保存しておいて、それぞれの型にダウンキャストして使用します。
最初はClassCastExceptionをtry,catchで引っかけて使っていたのですが、速度的にちょっと怖かったのでやめました。
あと、もちろん、スクラッチパッドには名前を指定できないので、
ファイル名の大きさ : 1Byte ファイル名 : ファイル名の大きさの値 ファイルデータの大きさ : 4Byte ファイルデータ : ファイルデータの大きさの値
という形式で保存して、先頭から順番に探すようにします。
とりあえずこれで動きます。
自分は実際これで使っていたのですから間違いないです。
しかし、
ファイルサイズが大き過ぎる
そう、あまりにも大きくなり過ぎます。
fileStreamに対して、read()やらreadInt()やらwrite()やらwriteInt()やらnew()やらをを、中で型判定をしてダウンキャストをして……という感じで、欲しい物を実装していくと、かなりやばいことになってました(;´Д`)
前回のライブラリはこの方法で実装していたので、DoCoMoでかなり苦しめられています(現在進行形)。
なので、新しい方法でやってみることにします。
続きはまた明日に(;´Д`)
最近時間がないのよ(;つД`)