RandomAccessFile

RandomAccessFile

RandomAccessFile的唯一父類是Object,與其他流父類不同。是用來訪問那些保存數據記錄的文件的,這樣你就可以用seek( )方法來訪問記錄,並進行讀寫了。這些記錄的大小不必相同;但是其大小和位置必須是可知的。

介紹


RandomAccessFile是不屬於InputStream和OutputStream類系的。實際上,除了實現DataInput和DataOutput介面之外(DataInputStream和DataOutputStream也實現了這兩個介面),它和這兩個類系毫不相干,甚至都沒有用InputStream和OutputStream已經準備好的功能;它是一個完全獨立的類,所有方法(絕大多數都只屬於它自己)都是從零開始寫的。這可能是因為RandomAccessFile能在文件裡面前後移動,所以它的行為與其它的I/O類有些根本性的不同。總而言之,它是一個直接繼承Object的,獨立的類。

工作方式


基本上,RandomAccessFile的工作方式是,把DataInputStream和DataOutputStream粘起來,再加上它自己的一些方法,比如定位用的getFilePointer( ),在文件里移動用的seek( ),以及判斷文件大小的length( )。此外,它的構造函數還要一個表示以只讀方式("r"),還是以讀寫方式("rw")打開文件的參數 (和C的fopen( )一模一樣)。它不支持只寫文件,從這一點上看,假如RandomAccessFile繼承了DataInputStream,它也許會幹得更好。
只有RandomAccessFile才有seek方法,而這個方法也只適用於文件。BufferedInputStream有一個mark( )方法,你可以用它來設定標記(把結果保存在一個內部變數里),然後再調用reset( )返回這個位置,但是它的功能太弱了,而且也不怎麼實用。
RandomAccessFile的絕大多數功能,如果不是全部的話,已經被JDK1.4的nio的"內存映射文件(memory-mapped files)"給取代了。