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でかなり苦しめられています(現在進行形)。


なので、新しい方法でやってみることにします。
続きはまた明日に(;´Д`)
最近時間がないのよ(;つД`)