您好,登錄后才能下訂單哦!
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兆的文件(這里牽涉到讀和寫)。
讀 | 寫 | 耗用時間(秒) |
RandomAccessFile | RandomAccessFile | 95.848 |
BufferedInputStream + DataInputStream | BufferedOutputStream + DataOutputStream | 2.935 |
我們可以看到兩者差距約32倍,RandomAccessFile也太慢了。由其源碼可見,RandomAccessFile每讀/寫一個字節就需對磁盤進行一次I/O操作。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。