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

