功能簡介
我們之前一直說流順序的,不能隨機訪問,的確之前說的IO體系的確如此
但是 RandomAccessFile自成一派
此類的實例支持對隨機訪問文件的讀取和寫入
我們之前介紹過DataOutput 和DataInput
這是兩個接口,約定了從基本數據類型與字節的操作交互方式
所以,我們從類層級結構也可以想得到
他必然是提供了便捷的讀寫基本數據類型的方法
構造方法
既然是文件隨機讀寫,自然需要文件 內部維護了一個文件描述符 fd 還有文件的讀寫方式 rw |
|
明明只有兩個構造方法 path的注釋還說,如果通過文件描述符創建,path為null 此處提醒,有些注釋或者API文檔,他可能沒及時刪除,可能沒及時修改,如果有的地方明顯不太對勁 不要非去找證據證明他是對的,他可能就是錯的,就看代碼就好了,JDK的源碼也是人寫的,不是神丟向人間的 |
構造方法需要文件,以及讀寫模式這兩個信息來打開文件
mode的字符串形式有如下幾種,如果不對,可以看得到,如果這幾種不是 imode為-1 小於0 直接拋異常了
"r" 以只讀方式打開。調用結果對象的任何 write 方法都將導致拋出 IOException。
"rw" 打開以便讀取和寫入。如果該文件尚不存在,則嘗試創建該文件。
"rws" 打開以便讀取和寫入,對於 "rw",還要求對文件的內容或元數據的每個更新都同步寫入到底層存儲設備。
"rwd" 打開以便讀取和寫入,對於 "rw",還要求對文件內容的每個更新都同步寫入到底層存儲設備。
|
|
構造方法中會打開文件 文件的打開使用的是本地方法 |
RandomAccessFile邏輯原理
RandomAccessFile僅僅只能用於文件
|
RandomAccessFile 對於文件的操縱,就好像是對於一個巨大的數組進行訪問一樣
存在着一種類似下標索引的東西,可以叫做文件指針
至於到底怎么抽象成這個模型的,底層的實現我們不去關注,我們只關注我們看起來RandomAccessFile的樣子就好
|
|
如上圖所示,這就是RandomAccessFile訪問文件的模型
可以返回這個文件的文件描述符 FileDescriptor getFD() 可以返回當前的文件指針 native long getFilePointer() 可以返回文件的長度 native long length() 還可以設置文件的長度 native void setLength(long newLength) 設置讀寫偏移量位置 void seek(long pos) |
setLength 為什么還能設置文件長度? 你可以理解為這是一個"動態數組"!!
假設你想要設置為newLength 長度
1. 如果這個長度小於 實際長度(length方法返回的值), 文件被截斷,並且如果getFilePointer 大於newLength ,那么它將變成newLength
2. 如果 newLength大於 實際長度(length方法返回的值),則該文件將被擴展 在此情況下,未定義文件擴展部分的內容。
seek方法設置的偏移量,下一次的讀寫將從這個位置開始
偏移量的設置可能會超出文件末尾,這並不會改變什么
但是一旦你在這個超出文件末尾的偏移量位置寫入數據,長度將會改變
|
也正是此處的這幾個方法提供了隨機訪問的能力 |
方法簡介
RandomAccessFile的神秘之處就在於它的邏輯原理 那就是呈現給我們的操作方式就像操作數組一樣 他根本的讀寫方法,全都是本地方法 |
|
對於其他的readXXX 以及writeXXX方法 則是借助於基本的讀寫方法的情況下, 提供了對基本數據類型的支持 這一部分就相當於把DataInputStream和DataOutputStream結合起來了 而且還能夠隨機存取 不再對readXXX和 writeXXX方法進行介紹 如有興趣可以對DataInput DataOutput 以及 DataInputStream和DataOutputStream 進行深入研究
|