Java RandomAccessFile文件操作詳解

簡介:
RandomAccessFile類可以對文件隨機訪問的操作,訪問包括讀和寫操作。該類的讀寫是基於指針的操作。
RandomAccessFile對文件進行隨機訪問操作時有兩個模式,一種是隻讀(r),另一種是讀寫(rw),需在創建RandomAccessFile對象時傳入一個參數進行設置,第一個參數代表要訪問的文件,第二個參數代表設置訪問模式
RandomAccessFile(File file,String mode)
RandomAccessFile(String filename,String mode)
只讀模式: new RandomAccessFile(“filename”,”r”);
讀寫模式: new RandomAccessFile(filename,”rw”);

public static void main(String[] args) throws IOException {
        //以讀寫方式打開並寫入一行文本
        File fis = new File("test.date");
        RandomAccessFile raf = new RandomAccessFile(fis, "rw");
        byte[] writeStr = "this is a demo!".getBytes();
        raf.write(writeStr);
        raf.close();
        //以只讀方式打開並讀取一行數據
        RandomAccessFile rafRead = new RandomAccessFile("test.date", "r");
        System.out.println(rafRead.readLine());
        rafRead.close();
    }

運行結果:
this is a demo!

RandomAccessFile常用方法彙總:
void write(int d)
該方法會根據當前指針所在位置處寫入一個字節,是將參數int的”低8位”寫出

int read()
如果返回-1表示讀取到了文件末尾EOF(EOF:End Of File)! 每次讀取後自動移動文件指針, 準備下次讀取。

void write(byte[] d)
根據當前指針所在位置處連續寫出給定數組中的所有字節

void write(byte[] d,int offset,int len)
根據當前指針所在位置處連續寫出給定數組中的部分字節,這個部分是從數組的offset處開始,連續len個字節

int read(byte[] b)
從文件中嘗試最多讀取給定數組的總長度的字節量,並從給定的字節數組第一個位置開始,將讀取到的字節順序存放至數組中,返回值爲實際讀取到的字節量

void close()
RandomAccessFile在對文件訪問的操作全部結束後,要調用close()方法來釋放與其關聯的所有系統資源

    public static void main(String[] args) throws IOException {
        //以讀寫方式打開並寫入一行文本
        File fis = new File("test.dat");
        RandomAccessFile rafw = new RandomAccessFile(fis, "rw");
        byte[] writeStr = "this is a demo!\n".getBytes();
        for(int i = 0; i < 10; i++) {
            rafw.write(writeStr, 0, writeStr.length);
        }
        rafw.close();

        //以只讀方式打開test.dat
        RandomAccessFile rafr = new RandomAccessFile(fis, "r");
        byte[] rd = new byte[1024];
        int len = -1;
        //循環讀取,讀到結束後len被重新賦值爲-1
        while((len = rafr.read(rd))!= -1) {
            System.out.println(new String(rd));
        }
        System.out.println("讀取結束,len="+len);
        rafr.close();
    }

運行結果:
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
讀取結束,len=-1

文件指針操作:
RandomAccessFile的讀寫操作都是基於指針的,也就是說總是在指針當前所指向的位置進行讀寫操作。

long getFilePointer()
獲取當前指針位置

void seek(long pos)
使用該方法可以移動指針到指定位置。

int skipBytes(int n)
嘗試跳過輸入的 n 個字節以丟棄跳過的字節

實現文件追加:

    public static void main(String[] args) throws IOException { 
        RandomAccessFile raf = new RandomAccessFile("test.dat", "rw"); 
        //將記錄指針移動到文件最後 ,進行追加操作 
        raf.seek(raf.length());  
        raf.write("追加後的文本\n".getBytes());  
        raf.close();
    }

運行後test.dat文本內容:
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
this is a demo!
追加後的文本

總結:
RandomAccessFile,優點是可以控制指針的位置,對文件進行指定位置的讀寫操作。
但是同時也有一些缺點,執行效率比較慢,大量進行指針控制操作很耗內存。

發佈了51 篇原創文章 · 獲贊 41 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章