文件操作——RandomAccessFile
- 創(chuàng)建對(duì)象
1.1. 簡(jiǎn)介
Java提供了一個(gè)可以對(duì)文件隨機(jī)訪問(wèn)的操作蚂且,訪問(wèn)包括讀和寫操作。該類名為RandomAccessFile。該類的讀寫是基于指針的操作。
1.2. 只讀模式
RandomAccessFile在對(duì)文件進(jìn)行隨機(jī)訪問(wèn)操作時(shí)有兩個(gè)模式,分別為只讀模式(只讀取文件數(shù)據(jù))腻格,和讀寫模式(對(duì)文件數(shù)據(jù)進(jìn)行讀寫)。
只讀模式:
在創(chuàng)建RandomAccessFile時(shí)啥繁,其提供的構(gòu)造方法要求我們傳入訪問(wèn)模式:
RandomAccessFile(File file,String mode)
RandomAccessFile(String filename,String mode)
其中構(gòu)造方法的第一個(gè)參數(shù)是需要訪問(wèn)的文件菜职,而第二個(gè)參數(shù)則是訪問(wèn)模式:
r”:字符串”r”表示對(duì)該文件的訪問(wèn)是只讀的。
1.3. 讀寫模式
創(chuàng)建一個(gè)基于文件訪問(wèn)的讀寫模式的RandomAccessFile我們只需要在第二個(gè)參數(shù)中傳入”rw”即可旗闽。
RandomAccessFile raf = new RandomAccessFile(file,”rw”);
那么這時(shí)在使用RandomAccessFile對(duì)該文件的訪問(wèn)就是又可讀又可寫的酬核。
- 字節(jié)數(shù)據(jù)讀寫操作
2.1. write(int d)方法
RandomAccessFile提供了一個(gè)可以向文件中寫出字節(jié)的方法:
void write(int d)
該方法會(huì)根據(jù)當(dāng)前指針?biāo)谖恢锰帉懭胍粋€(gè)字節(jié)蜜另,是將參數(shù)int的”低8位”寫出。
2.2. read()方法
RandomAccessFile提供了一個(gè)可以從文件中讀取字節(jié)的方法:
int read()
該方法會(huì)從RandomAccessFile當(dāng)前指針位置讀取一個(gè)byte(8位) 填充到int的低八位, 高24位為0, 返回值范圍正數(shù): 0~255, 如果返回-1表示讀取到了文件末尾EOF(EOF:End Of File)! 每次讀取后自動(dòng)移動(dòng)文件指針, 準(zhǔn)備下次讀取愁茁。
2.3. write(byte[] d)方法
RandomAccessFile提供了一個(gè)可以向文件中寫出一組字節(jié)的方法:
void write(byte[] d)
該方法會(huì)根據(jù)當(dāng)前指針?biāo)谖恢锰庍B續(xù)寫出給定數(shù)組中的所有字節(jié)蚕钦,與該方法相似的還有一個(gè)常用方法:
void write(byte[] d,int offset,int len)
該方法會(huì)根據(jù)當(dāng)前指針?biāo)谖恢锰庍B續(xù)寫出給定數(shù)組中的部分字節(jié),這個(gè)部分是從數(shù)組的offset處開(kāi)始鹅很,連續(xù)len個(gè)字節(jié)嘶居。
2.4. read(byte[] d)方法
RandomAccessFile提供了一個(gè)可以從文件中批量讀取字節(jié)的方法:
int read(byte[] b)
該方法會(huì)從文件中嘗試最多讀取給定數(shù)組的總長(zhǎng)度的字節(jié)量,并從給定的字節(jié)數(shù)組第一個(gè)位置開(kāi)始促煮,將讀取到的字節(jié)順序存放至數(shù)組中邮屁,返回值為實(shí)際讀取到的字節(jié)量 。
2.5. close方法
RandomAccessFile在對(duì)文件訪問(wèn)的操作全部結(jié)束后菠齿,要調(diào)用close()方法來(lái)釋放與其關(guān)聯(lián)的所有系統(tǒng)資源佑吝。
void close()
例如:
RandomAccessFile raf = new RandomAccessFile(file,”rw”);
…..//讀寫操作
raf.close();//訪問(wèn)完畢后要關(guān)閉以釋放系統(tǒng)資源。
2.3. 文件指針操作
2.3.1. getFilePointer方法
RandomAccessFile的讀寫操作都是基于指針的绳匀,也就是說(shuō)總是在指針當(dāng)前所指向的位置進(jìn)行讀寫操作芋忿。
RandomAccessFile提供了一個(gè)可以獲取當(dāng)前指針位置的方法:
long getFilePointer()
RandomAccessFile在創(chuàng)建時(shí)默認(rèn)指向文件開(kāi)始(第一個(gè)字節(jié)),通過(guò)getFilePointer方法獲取指針位置時(shí)值是"0"疾棵。
例如:
RandomAccessFile raf = new RandomAccessFile(file,”rw”);
System.out.println(raf.getFilePointer());//0
raf.write(‘A’);//寫出一個(gè)字節(jié)后戈钢,指針自動(dòng)向后移動(dòng)到下一個(gè)字節(jié)位置
System.out.println(raf.getFilePointer());//1
raf.writeInt(3);
System.out.println(raf.getFilePointer());//5
raf.close();
2.3.2. seek方法
RandomAccessFile的提供了一個(gè)方法用于移動(dòng)指針位置。
void seek(long pos)文件操作——RandomAccessFile
2.1. 創(chuàng)建對(duì)象
2.1.1. 簡(jiǎn)介
Java提供了一個(gè)可以對(duì)文件隨機(jī)訪問(wèn)的操作是尔,訪問(wèn)包括讀和寫操作殉了。該類名為RandomAccessFile。該類的讀寫是基于指針的操作拟枚。
2.1.2. 只讀模式
RandomAccessFile在對(duì)文件進(jìn)行隨機(jī)訪問(wèn)操作時(shí)有兩個(gè)模式薪铜,分別為只讀模式(只讀取文件數(shù)據(jù)),和讀寫模式(對(duì)文件數(shù)據(jù)進(jìn)行讀寫)恩溅。
只讀模式:
在創(chuàng)建RandomAccessFile時(shí)隔箍,其提供的構(gòu)造方法要求我們傳入訪問(wèn)模式:
RandomAccessFile(File file,String mode)
RandomAccessFile(String filename,String mode)
其中構(gòu)造方法的第一個(gè)參數(shù)是需要訪問(wèn)的文件,而第二個(gè)參數(shù)則是訪問(wèn)模式:
r”:字符串”r”表示對(duì)該文件的訪問(wèn)是只讀的脚乡。
2.1.3. 讀寫模式
創(chuàng)建一個(gè)基于文件訪問(wèn)的讀寫模式的RandomAccessFile我們只需要在第二個(gè)參數(shù)中傳入”rw”即可鞍恢。
RandomAccessFile raf = new RandomAccessFile(file,”rw”);
那么這時(shí)在使用RandomAccessFile對(duì)該文件的訪問(wèn)就是又可讀又可寫的。
2.2. 字節(jié)數(shù)據(jù)讀寫操作
2.2.1. write(int d)方法
RandomAccessFile提供了一個(gè)可以向文件中寫出字節(jié)的方法:
void write(int d)
該方法會(huì)根據(jù)當(dāng)前指針?biāo)谖恢锰帉懭胍粋€(gè)字節(jié)每窖,是將參數(shù)int的”低8位”寫出。
2.2.2. read()方法
RandomAccessFile提供了一個(gè)可以從文件中讀取字節(jié)的方法:
int read()
該方法會(huì)從RandomAccessFile當(dāng)前指針位置讀取一個(gè)byte(8位) 填充到int的低八位, 高24位為0, 返回值范圍正數(shù): 0~255, 如果返回-1表示讀取到了文件末尾EOF(EOF:End Of File)! 每次讀取后自動(dòng)移動(dòng)文件指針, 準(zhǔn)備下次讀取弦悉。
2.2.3. write(byte[] d)方法
RandomAccessFile提供了一個(gè)可以向文件中寫出一組字節(jié)的方法:
void write(byte[] d)
該方法會(huì)根據(jù)當(dāng)前指針?biāo)谖恢锰庍B續(xù)寫出給定數(shù)組中的所有字節(jié)窒典,與該方法相似的還有一個(gè)常用方法:
void write(byte[] d,int offset,int len)
該方法會(huì)根據(jù)當(dāng)前指針?biāo)谖恢锰庍B續(xù)寫出給定數(shù)組中的部分字節(jié),這個(gè)部分是從數(shù)組的offset處開(kāi)始稽莉,連續(xù)len個(gè)字節(jié)瀑志。
2.2.4. read(byte[] d)方法
RandomAccessFile提供了一個(gè)可以從文件中批量讀取字節(jié)的方法:
int read(byte[] b)
該方法會(huì)從文件中嘗試最多讀取給定數(shù)組的總長(zhǎng)度的字節(jié)量,并從給定的字節(jié)數(shù)組第一個(gè)位置開(kāi)始,將讀取到的字節(jié)順序存放至數(shù)組中劈猪,返回值為實(shí)際讀取到的字節(jié)量 昧甘。
2.2.5. close方法
RandomAccessFile在對(duì)文件訪問(wèn)的操作全部結(jié)束后,要調(diào)用close()方法來(lái)釋放與其關(guān)聯(lián)的所有系統(tǒng)資源战得。
void close()
例如:
RandomAccessFile raf = new RandomAccessFile(file,”rw”);
…..//讀寫操作
raf.close();//訪問(wèn)完畢后要關(guān)閉以釋放系統(tǒng)資源充边。
2.3. 文件指針操作
2.3.1. getFilePointer方法
RandomAccessFile的讀寫操作都是基于指針的,也就是說(shuō)總是在指針當(dāng)前所指向的位置進(jìn)行讀寫操作常侦。
RandomAccessFile提供了一個(gè)可以獲取當(dāng)前指針位置的方法:
long getFilePointer()
RandomAccessFile在創(chuàng)建時(shí)默認(rèn)指向文件開(kāi)始(第一個(gè)字節(jié))浇冰,通過(guò)getFilePointer方法獲取指針位置時(shí)值是"0"。
例如:
RandomAccessFile raf = new RandomAccessFile(file,”rw”);
System.out.println(raf.getFilePointer());//0
raf.write(‘A’);//寫出一個(gè)字節(jié)后聋亡,指針自動(dòng)向后移動(dòng)到下一個(gè)字節(jié)位置
System.out.println(raf.getFilePointer());//1
raf.writeInt(3);
System.out.println(raf.getFilePointer());//5
raf.close();
2.3.2. seek方法
RandomAccessFile的提供了一個(gè)方法用于移動(dòng)指針位置肘习。
void seek(long pos)
使用該方法可以移動(dòng)指針到指定位置。
例如:
RandomAccessFile raf = new RandomAccessFile(file,”rw”);
System.out.println(raf.getFilePointer());//0
raf.write(‘A’);//指針位置1
raf.writeInt(3);//指針位置5
raf.seek(0);//將指針移動(dòng)到文件開(kāi)始處(第一個(gè)字節(jié)的位置)
使用該方法可以移動(dòng)指針到指定位置坡倔。
例如:
RandomAccessFile raf = new RandomAccessFile(file,”rw”);
System.out.println(raf.getFilePointer());//0
raf.write(‘A’);//指針位置1
raf.writeInt(3);//指針位置5
raf.seek(0);//將指針移動(dòng)到文件開(kāi)始處(第一個(gè)字節(jié)的位置)
System.out.println(raf.getFilePointer());//0
raf.close();
2.3.3. skipBytes方法
RandomAccessFile的提供了一個(gè)方法可以嘗試跳過(guò)輸入的 n 個(gè)字節(jié)以丟棄跳過(guò)的字節(jié)漂佩,方法定義為:
int skipBytes(int n)
該方法可能跳過(guò)一些較少數(shù)量的字節(jié)(可能包括零)。這可能由任意數(shù)量的條件引起罪塔;在跳過(guò)n個(gè)字節(jié)之前已到達(dá)文件的末尾只是其中的一種可能投蝉。此方法不拋出 EOFException。返回跳過(guò)的實(shí)際字節(jié)數(shù)垢袱。如果 n 為負(fù)數(shù)墓拜,則不跳過(guò)任何字節(jié)。