Java 實現檔案隨機讀寫-RandomAccessFile
阿新 • • 發佈:2019-01-27
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();
}
}