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

Java RandomAccessFile 實現文件任意位置插入內容完整代碼詳解

     編輯:Java 相關知識

核心需求

在不讀取整個文件到內存的前提下,在文件指定位置插入新內容,並保留原有後續數據。RandomAccessFile 支持隨機讀寫,是實現此需求的理想選擇。

完整可運行代碼

import java.io.*;

public class RandomAccessFileInsert {
    /**
     * 在文件指定位置插入內容
     * @param fileName 文件路徑
     * @param pos 插入位置(字節偏移量)
     * @param insertContent 要插入的字符串內容
     */
    public static void insert(String fileName, long pos, String insertContent) throws IOException {
        File tempFile = File.createTempFile("raf_insert_", ".tmp");
        tempFile.deleteOnExit(); // JVM 退出時自動刪除

        try (RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
             FileInputStream fis = new FileInputStream(tempFile);
             FileOutputStream fos = new FileOutputStream(tempFile)) {

            // 1. 定位到插入位置
            raf.seek(pos);

            // 2. 將插入位置後的原有內容讀出並寫入臨時文件(備份)
            byte[] buffer = new byte[8192]; // 8KB 緩衝區
            int len;
            while ((len = raf.read(buffer)) > 0) {
                fos.write(buffer, 0, len);
            }

            // 3. 回到插入位置,寫入新內容
            raf.seek(pos);
            byte[] insertBytes = insertContent.getBytes("UTF-8"); // 指定編碼
            raf.write(insertBytes);

            // 4. 將臨時文件中的備份內容追加寫回原文件
            int read;
            while ((read = fis.read(buffer)) > 0) {
                raf.write(buffer, 0, read);
            }
        }
    }

    public static void main(String[] args) {
        try {
            // 測試:在文件第 57 字節處插入 "插入的內容\r\n"
            insert("F:/AttendanceActivity.java", 57, "插入的內容\r\n");
            System.out.println("插入完成!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

核心流程圖解

原文件: [前半部分][插入位置][後半部分]
步驟1: 讀取 [後半部分] -> 臨時文件
步驟2: 寫入 [新內容] -> 原文件插入位置
步驟3: 讀取 臨時文件 -> 追加寫入 原文件
結果: [前半部分][新內容][後半部分]

關鍵技術點解析

技術點說明
RandomAccessFile("rw")以讀寫模式打開,支持 seek() 隨機定位
seek(pos)將文件指針移動到指定字節偏移量
臨時文件備份避免大文件後半部分佔用過多內存,磁盤換磁盤
緩衝區大小 8KB平衡內存佔用與 I/O 次數,可根據文件大小調整
編碼一致性讀寫字符串時必須指定編碼(如 UTF-8),否則跨平台亂碼
deleteOnExit()確保臨時文件最終被清理,避免垃圾文件殘留

性能與適用場景

  • 適用:中小型文件(<100MB)、配置文件修改、日誌插入、文件頭部添加許可證等。
  • 不適用:超大文件(GB 級)、高頻並發寫入、需事務性保證的場景。
  • 替代方案:
    • NIO FileChannel + MappedByteBuffer(大文件高性能)
    • 臨時文件全量重寫(簡單、安全、適合大多數場景)
    • 資料庫 / 索引文件結構(頻繁隨機修改)

常見坑與避坑指南

  1. 位置單位是字節非字符:pos=57 表示第 57 個字節。中文 UTF-8 佔 3 字節,需精確計算。
  2. 編碼不一致導致亂碼:讀取時未指定編碼用平台默認,寫入時用 UTF-8。統一顯式指定編碼。
  3. 未關閉流導致文件鎖定:使用 try-with-resources 確保所有流正確關閉。
  4. 臨時文件同名衝突:File.createTempFile 保證唯一性。

總結

RandomAccessFile 配合臨時文件備份,能以常數內存實現文件任意位置插入。掌握 seek()、讀寫分離、編碼處理、資源管理四大要點,即可靈活應對文件隨機修改需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved