構(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
*/