1. 程式人生 > >Java 實現文件隨機讀寫-RandomAccessFile

Java 實現文件隨機讀寫-RandomAccessFile

randomaccessfile類

RandomAccessFile是Java中輸入,輸出流體系中功能最豐富的文件內容訪問類,它提供很多方法來操作文件,包括讀寫支持,與普通的IO流相比,它最大的特別之處就是支持任意訪問的方式,程序可以直接跳到任意地方來讀寫數據。

如果我們只希望訪問文件的部分內容,而不是把文件從頭讀到尾,使用RandomAccessFile將會帶來更簡潔的代碼以及更好的性能。

下面來看下RandomAccessFile類中比較重要的2個方法,其他的和普通IO類似,在這裏,就不詳細說明了。

方法名作用
getFilePointer()返回文件記錄指針的當前位置
seek(long pos)將文件記錄指針定位到pos的位置

功能one,讀取任意位置的數據,代碼如下


public static void randomRed(String path,int pointe){

try{

RandomAccessFile raf=new RandomAccessFile(path, "r");

raf.seek(pointe);//移動文件指針位置

byte[] buff=new byte[1024];

//用於保存實際讀取的字節數

int hasRead=0;

//循環讀取

while((hasRead=raf.read(buff))>0){

//打印讀取的內容,並將字節轉為字符串輸入

System.out.println(new String(buff,0,hasRead));

}

}catch(Exception e){

e.printStackTrace();

}

至此,RandomAccessFile類的幾個功能,散仙在代碼中已給出實現了,現在回到本文開始前的提的那個需求,用RandomAccessFile類就可以輕而易舉的完成了,另外需要註意的是,向指定位置插入數據,是散仙自己改造的功能,RandomAccessFile並不直接支持,需要新建一個緩沖區臨時空間,存數據,然後在寫,因為一旦數據量上了級別,在任意位置插入數據,是很耗內存的,這個也就是為什麽hadoop的HDFS文件系統,只支持append的方式,而沒有提供修改的操作。



另外我們可以用RandomAccessFile這個類,來實現一個多線程斷點下載的功能,用過下載工具的朋友們都知道,下載前都會建立兩個臨時文件,一個是與被下載文件大小相同的空文件,另一個是記錄文件指針的位置文件,每次暫停的時候,都會保存上一次的指針,然後斷點下載的時候,會繼續從上一次的地方下載,從而實現斷點下載或上傳的功能,有興趣的朋友們可以自己實現下。


RandomAccessFile讀取的效率

比較Scanner和RandomAccessFile的效率,使用Scanner按行讀取文件效率高好多好多倍,內存占用高一點點而已;而使用RandomAccessFile按行讀取數據效率極低,推薦使用Scanner。

RandomAccessFile類。其I/O性能較之其它常用開發語言的同類性能差距甚遠,嚴重影響程序的運行效率。


在改進之前先做一個基本測試:逐字節COPY一個12兆的文件(這裏牽涉到讀和寫)。


耗用時間(秒)
RandomAccessFileRandomAccessFile95.848
BufferedInputStream + DataInputStreamBufferedOutputStream + DataOutputStream2.935


我們可以看到兩者差距約32倍,RandomAccessFile也太慢了。由其源碼可見,RandomAccessFile每讀/寫一個字節就需對磁盤進行一次I/O操作。





Java 實現文件隨機讀寫-RandomAccessFile