首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 隨機存取檔案:RandomAccessFile 實現任意位置讀寫與檔案修改

     編輯:Java 相關知識

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(); }
}

關鍵 API 與模式

方法說明
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() 讀資料。
  • 記憶體映射檔案 (MappedByteBuffer) 替代品:JDK 1.4 前無 MappedByteBuffer 時的主流方案,現建議優先用 FileChannel.map() 獲得更高效能 (OS 頁面快取、避免 JVM 堆外拷貝)。

效能與注意事項

  • 頻繁 seek 昂貴:機械硬碟磁頭移動慢,SSD 較佳但仍有系統呼叫開銷。批次操作時盡量循序讀寫。
  • 非執行緒安全:多執行緒共用同一 RandomAccessFile 實例需外部同步,或各執行緒開啟獨立實例 (同一檔案可開多個 handle)。
  • 編碼問題:readUTF()/writeUTF() 使用修改版 UTF-8,不等同標準 UTF-8,跨語言互操作需注意。
  • 資料完整性:關鍵資料建議用 "rws" 模式或手動 getFD().sync() 強制刷新到磁碟。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved