RandomAccessFile 是 Java IO 中獨特的「雙向隨機存取」類,結合了 DataInput/DataOutput 與檔案指標控制,支援在檔案任意位置讀寫基本型別資料,適合結構化資料檔、索引檔、簡易資料庫等場景。
public static void main(String[] args) {
String sFile = args[0];
try {
// 1. 寫入 10 個 double (每個 8 bytes)
RandomAccessFile rf = new RandomAccessFile(sFile, "rw");
for (int i = 0; i < 10; i++) rf.writeDouble(i * 1.414);
rf.close();
// 2. 修改第 6 個 double (索引 5, 位移 5*8=40 bytes)
rf = new RandomAccessFile(sFile, "rw");
rf.seek(5 * 8); // 移動檔案指標
rf.writeDouble(47.0001); // 覆寫
rf.close();
// 3. 依序讀取全部
rf = new RandomAccessFile(sFile, "r");
for (int i = 0; i < 10; i++)
System.out.println("Value " + i + ": " + rf.readDouble());
rf.close();
} catch (IOException e) { e.printStackTrace(); }
}
| 方法 | 說明 |
|---|---|
seek(long pos) | 移動檔案指標到絕對位置 (bytes) |
getFilePointer() | 獲取當前指標位置 |
length() | 檔案總長度 |
readInt()/writeInt() 等 | 基本型別讀寫 (自動處理大端序 Network Byte Order) |
read(byte[] b)/write(byte[] b) | 位元組陣列塊讀寫 |
模式 "r" / "rw" / "rws" / "rwd" | 唯讀/讀寫/同步寫入內容/同步寫入內容+元數據 |
seek(recordId * recordSize) 直接定位,O(1) 讀寫。seek() 到各自區塊起始位置並行寫入。seek() 讀資料。FileChannel.map() 獲得更高效能 (OS 頁面快取、避免 JVM 堆外拷貝)。RandomAccessFile 實例需外部同步,或各執行緒開啟獨立實例 (同一檔案可開多個 handle)。readUTF()/writeUTF() 使用修改版 UTF-8,不等同標準 UTF-8,跨語言互操作需注意。"rws" 模式或手動 getFD().sync() 強制刷新到磁碟。