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

Java 實現檔案隨機讀寫-RandomAccessFile

1.介紹

現有如下的一個需求,向已存在1G資料的txt文本里末尾追加一行文字,內容如下“Lucene是一款非常優秀的全文檢索庫”。可能大多數朋友會覺得這個需求很easy,說實話,確實easy,然後XXX君開始實現了,直接使用Java中的流讀取了txt文本里原來所有的資料轉成字串後,然後拼接了“Lucene是一款非常優秀的全文檢索庫”,又寫回文本里了,至此,大功告成。後來需求改了,向5G資料的txt文本里追加了,結果XXX君傻了,他記憶體只有4G,如果強制讀取所有的資料並追加,會報記憶體溢位的異常。

其實上面的需求很簡單,如果我們使用JAVA IO體系中的RandomAccessFile類來完成的話,可以實現零記憶體追加。其實這就是支援任意位置讀寫類的強大之處。

在這之前,還是先囉嗦的介紹下RandomAccessFile這個類,RandomAccessFile是Java中輸入,輸出流體系中功能最豐富的檔案內容訪問類,它提供很多方法來操作檔案,包括讀寫支援,與普通的IO流相比,它最大的特別之處就是支援任意訪問的方式,程式可以直接跳到任意地方來讀寫資料。

下面來看下RandomAccessFile類中比較重要的2個方法,其他的和普通IO類似
- getFilePointer() 返回檔案記錄指標的當前位置
- seek(long pos) 將檔案記錄指標定位到pos的位置

2.例子

/** 
 * 讀的方法 
 * @param path 檔案路徑 
 * @param
pointe 指標位置 * **/
public static void randomRed(String path,int pointe){ try{ //RandomAccessFile raf=new RandomAccessFile(new File("D:\\3\\test.txt"), "r"); /** * model各個引數詳解 * r 代表以只讀方式開啟指定檔案 * rw 以讀寫方式開啟指定檔案 * rws 讀寫方式開啟,並對內容或元資料都同步寫入底層儲存裝置 * rwd 讀寫方式開啟,對檔案內容的更新同步更新至底層儲存裝置 * * **/
RandomAccessFile raf=new RandomAccessFile(path, "r"); //獲取RandomAccessFile物件檔案指標的位置,初始位置是0 System.out.println("RandomAccessFile檔案指標的初始位置:"+raf.getFilePointer()); 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(); } }