java.io.RandomAccessFile 提供四種開啟模式:"r"、"rw"、"rws"、"rwd"。前兩者常用,後兩者涉及同步寫入語義,關鍵在於資料與中繼資料何時真正落盤。本文詳細比較三種讀寫模式的行為差異、效能權衡與適用場景。
| 模式 | 讀/寫 | 同步策略 | 資料落盤時機 | 中繼資料落盤 | 效能 |
|---|---|---|---|---|---|
r | 唯讀 | — | — | — | 最高 |
rw | 讀寫 | 緩衝/延遲 | 緩衝區滿或 close() 時 | 延遲 | 高 |
rws | 讀寫 | 資料+中繼資料同步 | 每次 write() 後立即 | 同步 | 低 |
rwd | 讀寫 | 僅資料同步 | 每次 write() 後立即 | 延遲 | 中 |
write() 只是複製到記憶體。close()、或 OS 定期刷新。write() 返回前,確保檔案內容與中繼資料(檔案大小、最後修改時間、權限等)均已物理寫入儲存裝置。write() 強制同步檔案內容,但中繼資料(如長度、時間戳)仍由 OS 延遲更新。rw 與 rws 之間:資料安全性較高,效能優於 rws。rw : ~120,000 ops/sec
rwd : ~ 8,000 ops/sec
rws : ~ 3,000 ops/sec
"r""rw""rwd""rws"FileChannel.force(boolean metaData) 可在 rw 模式下手動控制同步粒度。MappedByteBuffer(記憶體映射),再配合 force() 控制落盤。rws/rwd 可能因磁碟快取策略仍有極小視窗遺失資料,極高可靠度需求請加裝 UPS 或使用資料庫。理解同步語義差異,能在資料安全與系統效能間做出最佳權衡。