????????RandomAccessFile 是 Java 中一個非常特殊的類,它既可以用來讀取文件,也可以用來寫入文件。與其他 IO 類(如 FileInputStream 和 FileOutputStream)不同,RandomAccessFile 允許您跳轉到文件的任何位置,從那里開始讀取或寫入。這使得它特別適用于需要在文件中隨機訪問數據的場景,如數據庫系統。
下面是一個使用 RandomAccessFile 的示例,包括寫入和讀取文件:
import java.io.IOException;
import java.io.RandomAccessFile;public class RandomAccessFileDemo {public static void main(String[] args) {String filePath = "logs/javabetter/itwanger.txt";try {// 使用 RandomAccessFile 寫入文件writeToFile(filePath, "Hello, 沉默王二!");// 使用 RandomAccessFile 讀取文件String content = readFromFile(filePath);System.out.println("文件內容: " + content);} catch (IOException e) {e.printStackTrace();}}private static void writeToFile(String filePath, String content) throws IOException {try (RandomAccessFile randomAccessFile = new RandomAccessFile(filePath, "rw")) {// 將文件指針移動到文件末尾(在此處追加內容)randomAccessFile.seek(randomAccessFile.length());// 寫入內容randomAccessFile.writeUTF(content);}}private static String readFromFile(String filePath) throws IOException {StringBuilder content = new StringBuilder();try (RandomAccessFile randomAccessFile = new RandomAccessFile(filePath, "r")) {// 將文件指針移動到文件開始處(從頭開始讀取)randomAccessFile.seek(0);content.append(randomAccessFile.readUTF());}return content.toString();}
}
????????為了避免中文亂碼問題,我們使用 RandomAccessFile 的 writeUTF 和 readUTF 方法,它們將使用 UTF-8 編碼處理字符串。
構造方法
RandomAccessFile 主要有兩個構造方法:
RandomAccessFile(File file, String mode)
:使用給定的文件對象和訪問模式創建一個新的 RandomAccessFile 實例。RandomAccessFile(String name, String mode)
:使用給定的文件名和訪問模式創建一個新的 RandomAccessFile 實例。
訪問模式 mode 的值可以是:
- "r":以只讀模式打開文件。調用結果對象的任何 write 方法都將導致 IOException
- "rw":以讀寫模式打開文件。如果文件不存在,它將被創建
- "rws":以讀寫模式打開文件,并要求對內容或元數據的每個更新都被立即寫入到底層存儲設備。這種模式是同步的,可以確保在系統崩潰時不會丟失數據
- "rwd":與“rws”類似,以讀寫模式打開文件,但僅要求對文件內容的更新被立即寫入。元數據可能會被延遲寫入。
主要方法
long getFilePointer()
:返回文件指針的當前位置。long length()
:返回此文件的長度。int read()
:從該文件中讀取一個字節數據。int read(byte[] b)
:從該文件中讀取字節數據并將其存儲到指定的字節數組中。int read(byte[] b, int off, int len)
:從該文件中讀取字節數據并將其存儲到指定的字節數組中,從偏移量 off 開始,最多讀取 len 個字節。String readLine()
:從該文件中讀取一行文本。readUTF()
:從文件讀取 UTF-8 編碼的字符串。此方法首先讀取兩個字節的長度信息,然后根據這個長度讀取字符串的 UTF-8 字節。最后,這些字節被轉換為 Java 字符串。這意味著當你使用 readUTF 方法讀取字符串時,需要確保文件中的字符串是使用 writeUTF 方法寫入的,這樣它們之間的長度信息和編碼方式才能保持一致。void seek(long pos)
:將文件指針設置到文件中的 pos 位置。void write(byte[] b)
:將指定的字節數組的所有字節寫入該文件。void write(byte[] b, int off, int len)
:將指定字節數組的部分字節寫入該文件,從偏移量 off 開始,寫入 len 個字節。void write(int b)
:將指定的字節寫入該文件。writeUTF(String str)
:將一個字符串以 UTF-8 編碼寫入文件。此方法首先寫入兩個字節的長度信息,表示字符串的 UTF-8 字節長度,然后寫入 UTF-8 字節本身。因此,當你使用 writeUTF 寫入字符串時,實際寫入的字節數會比字符串的 UTF-8 字節長度多兩個字節。這兩個字節用于在讀取字符串時確定正確的字符串長度
File file = new File("logs/javabetter/itwanger.txt");try (RandomAccessFile raf = new RandomAccessFile(file, "rw")) {// 寫入文件raf.writeUTF("Hello, 沉默王二!");// 將文件指針移動到文件開頭raf.seek(0);// 讀取文件內容String content = raf.readUTF();System.out.println("內容: " + content);} catch (IOException e) {e.printStackTrace();
}
????????我們首先創建了一個名為 itwanger.txt 的文件對象。然后我們使用 RandomAccessFile 以讀寫模式打開這個文件。
????????接下來,我們使用 writeUTF 方法將字符串"Hello, 沉默王二!"寫入文件。然后,我們使用 seek 方法將文件指針移動到文件開頭,并使用 readUTF 方法讀取文件內容。輸出應該是"Hello, 沉默王二!"。