天天看點

RandomAccessFile完成在指定位置插入資料

RandomAccessFile:随機讀取檔案流 可以讀 寫檔案任意位置的資料

通過構造器建立對象 

RandomAccessFile accessFile = new RandomAccessFile(fileName, "rw");

RandomAccessFile完成在指定位置插入資料

mode有四種模式

RandomAccessFile完成在指定位置插入資料

了解後看代碼

import org.junit.jupiter.api.Test;

import java.io.*;
import java.util.Arrays;

public class RandomAccessFileTest {

    public static void main(String[] args) {

        File file = new File("D:/a.txt");
        try {
            insert(file, 10, "您吃飯了沒有");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("插入失敗");
        }
        System.out.println("插入成功");
    }

    /**
     * @param fileName 要插入的檔案
     * @param position 插入的位置
     * @param mess     插入的資訊
     */
    private static void insert(File fileName, int position, String mess) throws Exception {

        /**
         * mode: r
         *       s
         *       rw
         *       rw
         */
        RandomAccessFile accessFile = new RandomAccessFile(fileName, "rw");

        //建立一個臨時檔案
        File tempFile = File.createTempFile("temp", null);

        //使用臨時檔案儲存插入點後的資料

        FileOutputStream tmpOut = new FileOutputStream(tempFile);

        FileInputStream tmpIn = new FileInputStream(tempFile);

        //設定插入點
        accessFile.seek(position);

        //開始儲存插入點後的資料

        byte[] bytes = new byte[20];

        int len = 0;//實際存入資料的位元組數

        while((len=accessFile.read(bytes))>0){
            //将讀取的内容儲存到臨時檔案
            tmpOut.write(bytes,0,len);
        }
        System.out.println("===="+tempFile.length());

        //開始進行資料插入
        accessFile.seek(position);
        System.out.println(Arrays.toString(bytes));

        accessFile.write(mess.getBytes());
        
        while ((len=tmpIn.read(bytes))>0){
            //将臨時檔案的内容重新放入磁盤檔案内
            accessFile.write(bytes,0,len);
        }
        System.out.println(Arrays.toString(bytes));
    }
}      

效果:插入前