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; }
長すぎ(;´Д`)
こんなのをいくつも作ってると、さすがに危険です。
しかも、ほんとは、DoCoMoとMIDPの、例外発生時の仕様も同じにしなければならないのですが、そんなことをすると、これだけでは足りません。たかだかファイル操作にそこまで容量を取りたくないです。
なので、新しい方法を考えることにしました。
その方法とは、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が同時に出来ないのはおかしいのではないかと思います。
……今日は眠いのでこれで終わりです(;´Д`)
続きはまた明日。