Revised: Mar./16th/2002
今まで扱ってきたストリームはシーケンシャル (sequential) と呼ばれます。つまり、頭から順番に読み込み、書き込みを行うものです。
一般に、記憶媒体というものはシーケンシャルアクセス (sequential access) とランダムアクセス (random access) に分けられます。前者は文字型、後者はブロック型とも呼ばれます。ランダムアクセス可能なデバイスはシーケンシャルアクセスデバイスと比べると、目的のデータを直接読みにいかれることが異なります。もちろん、ブロックデバイスもシーケンシャルにアクセスすることも可能です。
コンピュータのメモリ(ストレージ)や磁気ディスク(ハードディスク、フロッピーディスク)はランダムアクセス可能なデバイスの代表例です。例えば、ハードディスクでは、シリンダ、トラック、セクタ (CTS) を指定したり、その情報を格納したアロケーションテーブル (File Allocation Table) を参照することで、対応する記憶場所までアクセスアームを動かして、ダイレクトに読み書きすることが可能です。一方、一部のコンピュータで現在でもバックアップ用途などで使われている磁気テープはシーケンシャルアクセスしか出来ないデバイスの代表です。
頭から順番に読むことで目的のデータに行き当たるというサーチ (seek) 方法しかないシーケンシャルアクセスのデバイスに対して、目的のデータに直接アクセス可能なランダムアクセスデバイスはシーク時間が飛躍的に短縮します。
Java でも、ネィティブなハードウェアのアクセス特性を利用することが出来ます。つまり、ハードディスクなどランダムアクセス可能なデバイス上のファイルシステムに対しては、ランダムアクセスが可能です。具体的には、通常のファイルに対して、任意の位置で読み書きが可能になります。
もちろん、 JavaVM 上のオブジェクトとしてアクセスするわけですが、ランダムアクセス可能なオブジェクトを、 Random Access File と呼びます。
例えば、 ZIP などのアーカイブを考えてみましょう。圧縮ファイルは、多くの圧縮スキームでディレクトリ構造をサポートしています。圧縮ファイルの中で独自のファイルシステムを持っていると云っても良いでしょう。ここではディレクトリ構造やそのメンバーであるファイルの情報などが記載されたヘッダ情報を用意します。各ファイルごとにヘッダをつけて愚直につなぎ合わせた圧縮アルゴリズムでは、シーケンシャルにサーチする他無いのでアクセス速度が悪くなりますが、ヘッダ情報を頭か末尾にまとめた場合は、そこだけをサーチして目的のファイルにダイレクトにアクセスできるため、アクセス効率が良くなります。
このようなヘッダが用意されている場合でも、シーケンシャルなストリームではシーケンシャルにしかアクセスできないので、目的のデータに到達するまでのシークタイムは短くなりません。ランダムアクセス可能なストリームならば、ヘッダのサーチの時間だけで目的のデータに到達できるのでシークタイムが短縮されます。
このような、 Random Access File を実装するクラスが RandomAccessFile
クラスです。