The next JAVA library(8)

さて、ファイルの操作メソッドの作り方です。
前回の使い方だと、元の型に合わせて分岐して、ダウンキャストをして使用しなければならなかったので、非常に長くなってしまいます。
例えば、MIDP用のread(byte[], int, int)は、このように書いてました。

protected int _read(byte buf, int off, int len){
    nRet = -1;
    try{
        if(fileStreamKind == INPUT_STREAM){
            nRet = ((InputStream)fileStream).read(buf, off, len);
        }else{
            RecordStore rs = (RecordStore)fileStream;
            int l = rs.getRecordSize(1)-record_offset;
            l = (l<len) ? l : len;
            if(record_offset < rs.getRecordSize(1)){
                byte b = new byte[record_offset + l];
                b = rs.getRecord(1);
                System.arraycopy(buf, off, b, record_offset, l);
                record_offset += l;
                nRet = l;
            }
        }
    }catch(Exception e){
        System.out.println("ReadArray:"+e);
    }
    return nRet;
}

長すぎ(;´Д`)
こんなのをいくつも作ってると、さすがに危険です。
しかも、ほんとは、DoCoMoMIDPの、例外発生時の仕様も同じにしなければならないのですが、そんなことをすると、これだけでは足りません。たかだかファイル操作にそこまで容量を取りたくないです。


なので、新しい方法を考えることにしました。
その方法とは、ByteArrayInputStreamを使うことです。
ByteArrayInputStreamとは、byte配列を、ストリームのように扱うことが出来るクラスです。
つまり、

byte[] buf = getBuffer();
ByteArrayInputStream bais = new ByteArrayInputStream(b);
int n = bais.read();
bais.close();

こうやって扱うことが出来るのです。
これを使えば、ファイルをopenしたときに、全てのデータをbyte配列に入れておいて、このbyte配列をByteArrayInputStreamに入れてしまえば、あとはDoCoMoだろうとMIDPだろうと同じように扱うことが出来ます。
しかし、このままだと実用には耐えません。
なぜなら、ファイルには、読み込みと書き込みの2種類があるからです。
つまり、ByteArrayInputStreamと、ByteArrayOutputStreamを使用します。
これは、openの引数で、readモードか、writeモードかを指定しても良いのですが、同じbyte配列なのに、readとwriteが同時に出来ないのはおかしいのではないかと思います。


……今日は眠いのでこれで終わりです(;´Д`)
続きはまた明日。