文件操作——RandomAccessFile

構(gòu)建RandomAccessFile

Java提供了一個可以對文件隨機訪問的操作,訪問包括讀和寫操作。該類名為RandomAccessFile。該類的讀寫是基于指針的操作。

1. 只讀模式

RandomAccessFile在對文件進(jìn)行隨機訪問操作時有兩個模式,分別為只讀模式(只讀取文件數(shù)據(jù)),和讀寫模式(對文件數(shù)據(jù)進(jìn)行讀寫)。

只讀模式:

在創(chuàng)建RandomAccessFile時,其提供的構(gòu)造方法要求我們傳入訪問模式:

RandomAccessFile(File file,String mode)

RandomAccessFile(String filename,String mode)

其中構(gòu)造方法的第一個參數(shù)是需要訪問的文件,而第二個參數(shù)則是訪問模式:

r”:字符串”r”表示對該文件的訪問是只讀的。

2. 讀寫模式

創(chuàng)建一個基于文件訪問的讀寫模式的RandomAccessFile我們只需要在第二個參數(shù)中傳入”rw”即可

RandomAccessFile raf = new RandomAccessFile(file,”rw”);

那么這時在使用RandomAccessFile對該文件的訪問就是又可讀又可寫的。

字節(jié)數(shù)據(jù)讀寫操作

1. read()方法

RandomAccessFile提供了一個可以從文件中讀取字節(jié)的方法:

int read()

該方法會從RandomAccessFile當(dāng)前指針位置讀取一個byte(8位) 填充到int的低八位, 高24位為0, 返回值范圍正數(shù): 0~255, 如果返回-1表示讀取到了文件末尾EOF(EOF:End Of File)! 每次讀取后自動移動文件指針, 準(zhǔn)備下次讀取。

2. read(byte[] d)方法

RandomAccessFile提供了一個可以從文件中批量讀取字節(jié)的方法:

int read(byte[] b)

該方法會從文件中嘗試最多讀取給定數(shù)組的總長度的字節(jié)量,并從給定的字節(jié)數(shù)組第一個位置開始,將讀取到的字節(jié)順序存放至數(shù)組中,返回值為實際讀取到的字節(jié)量 。

3. write(int d)方法

RandomAccessFile提供了一個可以向文件中寫出字節(jié)的方法:

void write(int d)

該方法會根據(jù)當(dāng)前指針?biāo)谖恢锰帉懭胍粋€字節(jié),是將參數(shù)int的”低8位”寫出。

4. write(byte[] d)方法

RandomAccessFile提供了一個可以向文件中寫出一組字節(jié)的方法:

void write(byte[] d)

該方法會根據(jù)當(dāng)前指針?biāo)谖恢锰庍B續(xù)寫出給定數(shù)組中的所有字節(jié),與該方法相似的還有一個常用方法:

void write(byte[] d,int offset,int len)

該方法會根據(jù)當(dāng)前指針?biāo)谖恢锰庍B續(xù)寫出給定數(shù)組中的部分字節(jié),這個部分是從數(shù)組的offset處開始,連續(xù)len個字節(jié)。

offset + len < 數(shù)組的長度

5. close方法

RandomAccessFile在對文件訪問的操作全部結(jié)束后,要調(diào)用close()方法來釋放與其關(guān)聯(lián)的所有系統(tǒng)資源。

void close()

例如:

RandomAccessFile raf = new RandomAccessFile(file,”rw”);
…..//讀寫操作
raf.close();//訪問完畢后要關(guān)閉以釋放系統(tǒng)資源

/**
 * java.io.RandomAccessFile
 * 用于讀寫文件數(shù)據(jù)的類
 * RAF讀寫文件數(shù)據(jù)總是在指針當(dāng)前位置進(jìn)行讀或?qū)懀? * 并且讀寫后指針是指向文件數(shù)據(jù)位置的標(biāo)記(底層實現(xiàn)).
 * 
 * @author soft01
 *
 */
public class pm02_RandomAccessFile_write {
    public static void main(String[] args) throws IOException {
        /*
         * 第二個參數(shù)是讀寫模式,常用的有:
         * “r”:只讀模式,該模式要求讀取的文件必須存在
         * “rw”:讀寫模式,該模式若文件不存在會自動創(chuàng)建
         * read write
         */
        
        RandomAccessFile raf = new RandomAccessFile("raf.dat","rw");
    
        /*
         * void write(int d)
         * 向文件中寫入一個字節(jié),寫的是給定的int值對應(yīng)2進(jìn)制的“低八位”
         * 
         *                             vvvvvvvv
         * 00000000 00000000 000000000 00000001
         * 
         * 寫一個-1其實寫入的是 1111111
         * 00000000 00000000 000000000 11111111
         * 
         */
        raf.write(1); //0000001
        System.out.println("寫出完畢");
        
        //讀寫完畢最終要close
        raf.close();
    }
}
/**
 * 讀取一個字節(jié)
 * @author 高行行
 *
 */
public class pm03_RandomAccessFile_read {
    public static void main(String[] args) throws IOException {
        RandomAccessFile raf = new RandomAccessFile("raf.dat","r");
        
        /*
         * 讀取一個字節(jié),并以int形式返回
         * 若返回值為-1表示讀取到文件末尾
         * 這里-1的二進(jìn)制是11111111 111111111 111111111 11111111
         * 
         * 如果讀取的值是-1
         * 讀取的二進(jìn)制是1111111
         * 
         * read()方法
         * 該方法會從RandomAccessFile當(dāng)前指針位置讀取一個byte(8位) 
         *  填充到int的低八位,
         *  高24位為0, 返回值范圍正數(shù): 0~255, 
         *  如果返回-1表示讀取到了文件末尾EOF(EOF:End Of File)! 
         *  每次讀取后自動移動文件指針, 準(zhǔn)備下次讀取。
         */
        int d = raf.read(); 
        System.out.println(d); //1
        
        //由于文件只有一個字節(jié),再次讀寫會返回-1
        d = raf.read(); //-1
        System.out.println(d);
        raf.close();
    }
}/* Output:
1
-1
*/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,734評論 18 399
  • 在經(jīng)過一次沒有準(zhǔn)備的面試后,發(fā)現(xiàn)自己雖然寫了兩年的android代碼,基礎(chǔ)知識卻忘的差不多了。這是程序員的大忌,沒...
    猿來如癡閱讀 3,122評論 3 10
  • 并發(fā)編程模型分類:共享內(nèi)存:線程之間共享程序的公共狀態(tài),線程之間通過寫-讀內(nèi) 存中的公共狀態(tài)來隱式進(jìn)行通信消息傳遞...
    idioitcbear閱讀 354評論 0 0
  • 在Android開發(fā)中,可能會遇到一個可滾動且布局比較復(fù)雜的界面,但它并不是一個純粹的List,類似如下圖: 通常...
    cfanr閱讀 19,419評論 17 35
  • 徘徊在人生之旅的我,已漸近不惑之年,面對生活的繁雜瑣碎,越來趆對中國傳統(tǒng)文化的奧妙精深感到崇敬,相比之下恐怕還是源...
    錦心明道閱讀 413評論 0 0

友情鏈接更多精彩內(nèi)容