入出力ストリーム |
このレッスンでこれまでのところ学習していた入出力ストリームは、順次アクセスストリームであり、このストリームの内容は連続的に読み書きしなければならない。 依然便利なことに変わりがないが、順次アクセスファイルは磁気テープのような逐次メディアの結果である。 また一方では、ランダムアクセスファイルはファイルの内容への非順次あるいはランダムなアクセスを認める。
このようなわけでランダムアクセスファイルが必要となる。"zip"(ジップ)として知られているアーカイブ形式を考えてみる。ジップアーカイブにはファイルが保在され、保存されるファイルは領域の節約のため一般に圧縮されている。ジップアーカイブの最後に"dir-entry"情報があり、この情報は,ジップアーカイブ内に保管されている種々のファイルがどこで始まるかを示す。
ジップアーカイブから特定のファイルを抽出したいと仮定する。 順次アクセスストリームを使用するなら、次のことを行わなければならない。
- ジップアーカイブを開く。
- 抽出したいファイルを探し当てるまで、ジップアーカイブを通して捜す。
- ファイルを抽出する。
- ジップアーカイブを閉じる。
このアルゴリズムを使用すると平均して、抽出したいファイルを見つける前に、ジップアーカイブの半分を読まなくてはならない。 ランダムアクセスファイルのシーク機能を使用して、より効率的にジップアーカイブから同じファイルを抽出することができる。
- ジップアーカイブを開く。
- dir - entryにシークして、ジップアーカイブから抽出したいファイルのエントリを捜す。
- 抽出するファイルの位置までジップアーカイブ内を(後方に)シークする。
- ファイルを抽出する。
- ジップアーカイブを閉じる。
このアルゴリズムは、dir - entryと抽出したいファイルを読み取るだけなので効率的である。
java.io パッケージの RandomAccessFile クラスは、ランダムアクセスファイルを実装する。
ランダムアクセスファイルの使用
java.io の入力ストリームクラスと出力ストリームクラスと異なり、RandomAccessFile はファイルの読み書きの両方に使用される。 読み込みを行うか書き込みを行うかによって、異なる引数で RandomAccessFile を作成する。
ランダムアクセスファイルのフィルタの作成
RandomAccessFile は java.io の入出力ストリームから幾分切り離される。RandomAccessFile は InputStream あるいは OutputStream から継承されたものではない。 これは、ストリームに適用できる同じフィルタを RandomAccessFiles に適用することができない点で、いくつかの不利がある。 しかし、 RandomAccessFile は DataInput と DataOutput インタフェースを実装するので、実際は DataInput あるいは DataOutput のために動作するフィルタを設計することができる。そして このファイルはRandomAccessFile と同様に(いくつかの)順次アクセスファイル( DataInput あるいは DataOutput を実装したもの)で動作する。
参照
入出力ストリーム |