- Java核心技術(shù)·卷Ⅱ:高級(jí)特性(原書第10版)
- (美)凱S.霍斯特曼
- 1121字
- 2020-10-30 18:10:40
2.3.2 隨機(jī)訪問(wèn)文件
RandomAccessFile類可以在文件中的任何位置查找或?qū)懭霐?shù)據(jù)。磁盤文件都是隨機(jī)訪問(wèn)的,但是與網(wǎng)絡(luò)套接字通信的輸入/輸出流卻不是。你可以打開(kāi)一個(gè)隨機(jī)訪問(wèn)文件,只用于讀入或者同時(shí)用于讀寫,你可以通過(guò)使用字符串“r”(用于讀入訪問(wèn))或“rw”(用于讀入/寫出訪問(wèn))作為構(gòu)造器的第二個(gè)參數(shù)來(lái)指定這個(gè)選項(xiàng)。

當(dāng)你將已有文件作為RandomAccessFile打開(kāi)時(shí),這個(gè)文件并不會(huì)被刪除。
隨機(jī)訪問(wèn)文件有一個(gè)表示下一個(gè)將被讀入或?qū)懗龅淖止?jié)所處位置的文件指針,seek方法可以用來(lái)將這個(gè)文件指針設(shè)置到文件中的任意字節(jié)位置,seek的參數(shù)是一個(gè)long類型的整數(shù),它的值位于0到文件按照字節(jié)來(lái)度量的長(zhǎng)度之間。
getFilePointer方法將返回文件指針的當(dāng)前位置。
RandomAccessFile類同時(shí)實(shí)現(xiàn)了DataInput和DataOutput接口。為了讀寫隨機(jī)訪問(wèn)文件,可以使用在前面小節(jié)中討論過(guò)的諸如readInt/writeInt和readChar/writeChar之類的方法。
我們現(xiàn)在要剖析一個(gè)將雇員記錄存儲(chǔ)到隨機(jī)訪問(wèn)文件中的示例程序,其中每條記錄都擁有相同的大小,這樣我們可以很容易地讀入任何記錄。假設(shè)你希望將文件指針置于第三條記錄處,那么你只需將文件指針置于恰當(dāng)?shù)淖止?jié)位置,然后就可以開(kāi)始讀入了。

如果你希望修改記錄,然后將其存回到相同的位置,那么請(qǐng)切記要將文件指針置回到這條記錄的開(kāi)始處:

要確定文件中的字節(jié)總數(shù),可以使用length方法,而記錄的總數(shù)則是用字節(jié)總數(shù)除以每條記錄的大小。

整數(shù)和浮點(diǎn)值在二進(jìn)制格式中都具有固定的尺寸,但是在處理字符串時(shí)就有些麻煩了,因此我們提供了兩個(gè)助手方法來(lái)讀寫具有固定尺寸的字符串。
writeFixedString寫出從字符串開(kāi)頭開(kāi)始的指定數(shù)量的碼元(如果碼元過(guò)少,該方法將用0值來(lái)補(bǔ)齊字符串)。

readFixedString方法從輸入流中讀入字符,直至讀入size個(gè)碼元,或者直至遇到具有0值的字符值,然后跳過(guò)輸入字段中剩余的0值。為了提高效率,這個(gè)方法使用了StringBuilder類來(lái)讀入字符串。


我們將writeFixedString和readFixedString方法放到了DataIO助手類的內(nèi)部。
為了寫出一條固定尺寸的記錄,我們直接以二進(jìn)制方式寫出所有的字段:

讀回?cái)?shù)據(jù)也很簡(jiǎn)單:

讓我們來(lái)計(jì)算每條記錄的大?。何覀儗⑹褂?0個(gè)字符來(lái)表示姓名字符串,因此,每條記錄包含100個(gè)字節(jié):
·40字符=80字節(jié),用于姓名。
·1 double=8字節(jié),用于薪水。
·3 int=12字節(jié),用于日期。
程序清單2-2中所示的程序?qū)⑷龡l記錄寫到了一個(gè)數(shù)據(jù)文件中,然后以逆序?qū)⑺鼈儚奈募凶x回。為了高效地執(zhí)行,這里需要使用隨機(jī)訪問(wèn),因?yàn)槲覀冃枰紫茸x入第三條記錄。
程序清單2-2 randomAccess/RandomAccessTest.java



java.io.RandomAccessFile 1.0
·RandomAccessFile(String file,String mode)
·RandomAccessFile(File file,String mode)
參數(shù):file 要打開(kāi)的文件
mode “r”表示只讀模式;“rw”表示讀/寫模式;“rws”表示每次更新時(shí),都對(duì)數(shù)據(jù)和元數(shù)據(jù)的寫磁盤操作進(jìn)行同步的讀/寫模式;“rwd”表示每次更新時(shí),只對(duì)數(shù)據(jù)的寫磁盤操作進(jìn)行同步的讀/寫模式
·long getFilePointer()
返回文件指針的當(dāng)前位置。
·void seek(long pos)
將文件指針設(shè)置到距文件開(kāi)頭pos個(gè)字節(jié)處。
·long length()
返回文件按照字節(jié)來(lái)度量的長(zhǎng)度。
- 多媒體CAI課件設(shè)計(jì)與制作導(dǎo)論(第二版)
- Beginning C++ Game Programming
- Learning Chef
- Learning Spring 5.0
- JavaScript 網(wǎng)頁(yè)編程從入門到精通 (清華社"視頻大講堂"大系·網(wǎng)絡(luò)開(kāi)發(fā)視頻大講堂)
- C和C++安全編碼(原書第2版)
- Java Web開(kāi)發(fā)之道
- FFmpeg入門詳解:音視頻流媒體播放器原理及應(yīng)用
- Git高手之路
- Banana Pi Cookbook
- Learning Apache Mahout Classification
- C和C++游戲趣味編程
- HoloLens與混合現(xiàn)實(shí)開(kāi)發(fā)
- Advanced UFT 12 for Test Engineers Cookbook
- Delphi開(kāi)發(fā)典型模塊大全(修訂版)