Java使用RandomAccessFile類(lèi)對(duì)文件進(jìn)行讀寫(xiě)
1. RandomAccessFile類(lèi)簡(jiǎn)介
前面一篇隨筆《File類(lèi)遍歷目錄及文件》中有說(shuō)到,F(xiàn)ile類(lèi)只能用于表示文件或目錄的名稱(chēng)、大小等信息,而不能用于文件內(nèi)容的訪(fǎng)問(wèn)。而當(dāng)需要訪(fǎng)問(wèn)文件內(nèi)容時(shí),就可以用RandomAccessFile類(lèi)了。
RandomAccessFile是Java提供用來(lái)訪(fǎng)問(wèn)一些保存數(shù)據(jù)記錄的文件的類(lèi),可以進(jìn)行讀取操作,也可以進(jìn)行寫(xiě)入操作,寫(xiě)入的數(shù)據(jù)則以byte的形式存儲(chǔ);支持隨機(jī)訪(fǎng)問(wèn),也就是可以訪(fǎng)問(wèn)文件的任意位置(通過(guò)文件指針實(shí)現(xiàn))。
2. 構(gòu)造函數(shù)
RandomAccessFile(String name, String mode) RandomAccessFile(File file, String mode)
兩個(gè)構(gòu)造函數(shù)用法非常相似,name、file都是用于指定打開(kāi)的文件路徑和名稱(chēng),mode則是指定打開(kāi)文件的方式,常用的參數(shù)有兩個(gè)"r"和"rw",也就是只讀和讀寫(xiě)。
文件打開(kāi)后,文件指針指向文件最開(kāi)始,也就是pointer=0,可通過(guò)RandomAccessFile了的getFilePointer()方法查看。
范例: 創(chuàng)建并打開(kāi)一個(gè)數(shù)據(jù)文件。
//創(chuàng)建目錄 File dir = new File("demo"); if (!dir.exists()) { dir.mkdir(); } //創(chuàng)建文件 File file = new File(dir, "test.dat"); if (!file.exists()) { file.createNewFile(); } //實(shí)例化RandomAccessFile對(duì)象 RandomAccessFile raf = new RandomAccessFile(file, "rw"); //打開(kāi)文件時(shí)指針位置在最前,即0 System.out.println(raf.getFilePointer());
3. 寫(xiě)入操作
write(int i) write(byte[] b) write(byte[] b, int off, int len)
第三個(gè)方法中的off為數(shù)組b中需要寫(xiě)入的數(shù)據(jù)的起始索引值,len則是要寫(xiě)入的長(zhǎng)度。write方法每次寫(xiě)入一個(gè)字節(jié),如果寫(xiě)入的數(shù)據(jù)超過(guò)一個(gè)字節(jié),則寫(xiě)入后八位(如果這里不太理解,可看看:二進(jìn)制運(yùn)算基礎(chǔ))。
另外,每寫(xiě)入一個(gè)字節(jié),文件指針指向下一個(gè)字節(jié)。
范例: 通過(guò)write()方法向文件中寫(xiě)入一個(gè)整型數(shù)。(沿用上面例子創(chuàng)建的對(duì)象)
//write()方法每次只插入一個(gè)字節(jié),大于一個(gè)字節(jié)的則寫(xiě)入后八位,因此寫(xiě)入一個(gè)整型數(shù)需要寫(xiě)入四次 int num = 28; raf.write(num >>> 24); raf.write(num >>> 16); raf.write(num >>> 8); raf.write(num);
當(dāng)然,RandomAccessFile類(lèi)也提供了更簡(jiǎn)便的方法writeXxx(),如果插入一個(gè)整型,可直接writeInt(i);,boolean的則為writeBoolean(),以此類(lèi)推。但是要清楚的是,這些方法的還是通過(guò)上面的write()方法實(shí)現(xiàn)的。
范例: 以下為RandomAccessFile類(lèi)中writeInt()方法的方法體。
public final void writeInt(int v) throws IOException { write((v >>> 24) & xFF); write((v >>> 16) & xFF); write((v >>> 8) & xFF); write((v >>> 0) & xFF); //written += 4; }
4. 讀取操作
read(int i) read(byte[] b) read(byte[] b, int off, int len)
與寫(xiě)入操作類(lèi)似,讀取操作是通過(guò)read()方法實(shí)現(xiàn)的,每次讀取一個(gè)字節(jié),同時(shí)文件指針指向下一個(gè)位置(通過(guò)seek()方法將指針移到讀取位置)。同時(shí),RandomAccessFile類(lèi)也封裝了readXxx()系列方法用于簡(jiǎn)便讀取,原理和使用方法可參考寫(xiě)入操作,基本類(lèi)似。
范例: 將數(shù)據(jù)文件中的所有數(shù)據(jù)以整型形式讀取出來(lái)。
//讀取文件,在讀取前需要通過(guò)seek()方法把文件指針移到最前 raf.seek(0); for (int i = 0; i*4 < raf.length(); i++) { System.out.println(raf.readInt()); }
5. 關(guān)閉文件
打開(kāi)的文件一定要通過(guò)close()關(guān)閉,否則可能會(huì)出現(xiàn)不可預(yù)料的錯(cuò)誤。
6. 完整例子
import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; public class MyRandomAccessFile { public static void main(String[] args) throws IOException { //創(chuàng)建目錄 File dir = new File("demo"); if (!dir.exists()) { dir.mkdir(); } //創(chuàng)建文件 File file = new File(dir, "test.dat"); if (!file.exists()) { file.createNewFile(); } //實(shí)例化RandomAccessFile對(duì)象 RandomAccessFile raf = new RandomAccessFile(file, "rw"); //打開(kāi)文件時(shí)指針位置在最前,即0 System.out.println(raf.getFilePointer()); //寫(xiě)入數(shù)據(jù) int[] num = {28, 14, 56, 23, 98}; for (int i : num) { raf.writeInt(i); } //讀取文件,在讀取前需要通過(guò)seek()方法把文件指針移到最前 raf.seek(0); for (int i = 0; i*4 < raf.length(); i++) { System.out.println(raf.readInt()); } //操作結(jié)束后一定要關(guān)閉文件 raf.close(); } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- java使用randomaccessfile在文件任意位置寫(xiě)入數(shù)據(jù)
- Java RandomAccessFile 指定位置實(shí)現(xiàn)文件讀取與寫(xiě)入
- Java RandomAccessFile的用法詳解
- Java I/O深入學(xué)習(xí)之File和RandomAccessFile
- Java中IO流 RandomAccessFile類(lèi)實(shí)例詳解
- java使用RandomAccessFile類(lèi)基于指針讀寫(xiě)文件實(shí)例代碼
- Java核心編程之文件隨機(jī)讀寫(xiě)類(lèi)RandomAccessFile詳解
- RandomAccessFile簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- java文件操作工具類(lèi)分享(file文件工具類(lèi))
- Java最全文件操作實(shí)例匯總
- Java RandomAccessFile基本文件操作示例
相關(guān)文章
Caused?by:?java.lang.NumberFormatException:?For?input?s
這篇文章主要介紹了Caused?by:?java.lang.NumberFormatException:?For?input?string:?“port“,本文給大家分享完美解決方法,需要的朋友可以參考下2023-01-01java多線(xiàn)程實(shí)現(xiàn)取款小程序
這篇文章主要為大家詳細(xì)介紹了java多線(xiàn)程實(shí)現(xiàn)取款小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05一文詳解Java線(xiàn)程的6種狀態(tài)與生命周期
一個(gè)線(xiàn)程在給定的時(shí)間點(diǎn)只能處于一種狀態(tài)。線(xiàn)程可以有6種狀態(tài):New、Runnable、Blocked、Waiting、Timed?waiting和Terminated。本文將詳細(xì)講解這6種狀態(tài),需要的可以參考一下2022-05-05Java程序執(zhí)行時(shí)間的2種簡(jiǎn)單方法
這篇文章介紹了Java程序執(zhí)行時(shí)間的2種簡(jiǎn)單方法,有需要的朋友可以參考一下2013-09-09Hutool開(kāi)發(fā)MapUtil工具類(lèi)使用示例
這篇文章主要為大家介紹了Hutool開(kāi)發(fā)MapUtil工具類(lèi)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Java中的JPA實(shí)體關(guān)系:JPA一對(duì)一,一對(duì)多(多對(duì)一),多對(duì)多
Java Persistence API(JPA)是Java平臺(tái)上的一個(gè)對(duì)象關(guān)系映射(ORM)規(guī)范,用于簡(jiǎn)化數(shù)據(jù)庫(kù)操作,其中實(shí)體關(guān)系的映射是核心內(nèi)容之一,本文將深入淺出地探討JPA中的三種基本實(shí)體關(guān)系類(lèi)型:一對(duì)一、一對(duì)多、多對(duì)多,揭示常見(jiàn)問(wèn)題、易錯(cuò)點(diǎn)及其避免策略,希望能幫助大家2024-06-06Java中String的intern()方法詳細(xì)說(shuō)明
這篇文章主要介紹了Java中String的intern()方法詳細(xì)說(shuō)明,String::intern()是一個(gè)本地方法,他的作用就是如果字符串常量池中已經(jīng)包含了一個(gè)等于此String對(duì)象的字符串,則返回代表池中的這個(gè)字符串額String對(duì)象的引用,需要的朋友可以參考下2023-11-11