[二十五]JavaIO之RandomAccessFile

功能簡介


咱們以前一直說流順序的,不能隨機訪問,的確以前說的IO體系的確如此
可是 RandomAccessFile自成一派
此類的實例支持對隨機訪問文件的讀取和寫入

image_5b9b66df_3da4
咱們以前介紹過DataOutput 和DataInput
這是兩個接口,約定了從基本數據類型與字節的操做交互方式
因此,咱們從類層級結構也能夠想獲得
他必然是提供了便捷的讀寫基本數據類型的方法

構造方法


既然是文件隨機讀寫,天然須要文件
內部維護了一個文件描述符 fd
還有文件的讀寫方式 rw
image_5b9b66df_4729
明明只有兩個構造方法 path的註釋還說,若是經過文件描述符建立,path爲null
此處提醒,有些註釋或者API文檔,他可能沒及時刪除,可能沒及時修改,若是有的地方明顯不太對勁
不要非去找證據證實他是對的,他可能就是錯的,就看代碼就行了,JDK的源碼也是人寫的,不是神丟向人間的
構造方法須要文件,以及讀寫模式這兩個信息來打開文件

mode的字符串形式有以下幾種,若是不對,能夠看獲得,若是這幾種不是 imode爲-1 小於0 直接拋異常了
"r" 以只讀方式打開。調用結果對象的任何 write 方法都將致使拋出 IOException。 
"rw" 打開以便讀取和寫入。若是該文件尚不存在,則嘗試建立該文件。 
"rws" 打開以便讀取和寫入,對於 "rw",還要求對文件的內容或元數據的每一個更新都同步寫入到底層存儲設備。 
"rwd"   打開以便讀取和寫入,對於 "rw",還要求對文件內容的每一個更新都同步寫入到底層存儲設備。 
image_5b9b66df_1824
構造方法中會打開文件
文件的打開使用的是本地方法

RandomAccessFile邏輯原理


RandomAccessFile僅僅只能用於文件
RandomAccessFile 對於文件的操縱,就好像是對於一個巨大的數組進行訪問同樣
存在着一種相似下標索引的東西,能夠叫作文件指針
至於到底怎麼抽象成這個模型的,底層的實現咱們不去關注,咱們只關注咱們看起來RandomAccessFile的樣子就好
image_5b9b66df_6630
如上圖所示,這就是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的神祕之處就在於它的邏輯原理
那就是呈現給咱們的操做方式就像操做數組同樣
他根本的讀寫方法,全都是本地方法
image_5b9b66df_5d53

對於其餘的readXXX 以及writeXXX方法則是藉助於基本的讀寫方法的狀況下, 提供了對基本數據類型的支持這一部分就至關於把DataInputStream和DataOutputStream結合起來了並且還可以隨機存取再也不對readXXX和 writeXXX方法進行介紹若有興趣能夠對DataInput  DataOutput  以及 DataInputStream和DataOutputStream 進行深刻研究
相關文章
相關標籤/搜索