2021-06-16

文件操作——RandomAccessFile

  1. 創(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)就是又可讀又可寫的酬核。

  1. 字節(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é)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末请契,一起剝皮案震驚了整個(gè)濱河市咳榜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌爽锥,老刑警劉巖涌韩,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異氯夷,居然都是意外死亡臣樱,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門腮考,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)雇毫,“玉大人,你說(shuō)我怎么就攤上這事踩蔚∨锓牛” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵馅闽,是天一觀的道長(zhǎng)飘蚯。 經(jīng)常有香客問(wèn)我馍迄,道長(zhǎng),這世上最難降的妖魔是什么局骤? 我笑而不...
    開(kāi)封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任攀圈,我火速辦了婚禮,結(jié)果婚禮上峦甩,老公的妹妹穿的比我還像新娘赘来。我一直安慰自己,他們只是感情好穴店,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布撕捍。 她就那樣靜靜地躺著,像睡著了一般泣洞。 火紅的嫁衣襯著肌膚如雪忧风。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天球凰,我揣著相機(jī)與錄音狮腿,去河邊找鬼。 笑死呕诉,一個(gè)胖子當(dāng)著我的面吹牛缘厢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播甩挫,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼贴硫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了伊者?” 一聲冷哼從身側(cè)響起英遭,我...
    開(kāi)封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎亦渗,沒(méi)想到半個(gè)月后挖诸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡法精,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年多律,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搂蜓。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡狼荞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出帮碰,到底是詐尸還是另有隱情粘秆,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布收毫,位于F島的核電站攻走,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏此再。R本人自食惡果不足惜昔搂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望输拇。 院中可真熱鬧摘符,春花似錦、人聲如沸策吠。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)猴抹。三九已至带族,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蟀给,已是汗流浹背蝙砌。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留跋理,地道東北人择克。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像前普,于是被迫代替她去往敵國(guó)和親肚邢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 管道流 管道流的輸入輸出流可以直接連接拭卿,通過(guò)結(jié)合線程來(lái)使用骡湖。(Properties是IO與集合的結(jié)合,而管道流是I...
    ML_Osiris閱讀 272評(píng)論 0 0
  • 1)java.io.File:File的每一個(gè)實(shí)例用于表示文件系統(tǒng)中的一個(gè)文件或目錄 File.separator...
    smallnumber閱讀 259評(píng)論 0 1
  • 文件操作——RandomAccessFile 1. 創(chuàng)建對(duì)象 1.1. 簡(jiǎn)介 Java提供了一個(gè)可以對(duì)文件隨機(jī)訪問(wèn)...
    好名字都被取完了呀閱讀 1,280評(píng)論 0 1
  • 表情是什么记劈,我認(rèn)為表情就是表現(xiàn)出來(lái)的情緒勺鸦。表情可以傳達(dá)很多信息。高興了當(dāng)然就笑了目木,難過(guò)就哭了换途。兩者是相互影響密不可...
    Persistenc_6aea閱讀 124,545評(píng)論 2 7
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者,不喜歡去冒險(xiǎn)刽射,但是人生放棄了冒險(xiǎn)军拟,也就放棄了無(wú)數(shù)的可能。 ...
    yichen大刀閱讀 6,041評(píng)論 0 4