RandomAccessFile

超大充電寶發表於2020-11-30

1、RandomAccessFile簡介

     隨機流(RandomAccessFile)不屬於IO流,支援對檔案的讀取和寫入隨機訪問。
     其原理是首先把隨機訪問的檔案物件看作儲存在檔案系統中的一個大型 byte 陣列,然後通過指向該 byte 陣列的游標或索引(即:檔案指標 FilePointer)在該陣列任意位置讀取或寫入任意資料。

2、RandomAccessFile的使用

(1)建立物件

  1. RandomAccessFile raf = new RandomAccessFile(File file, String mode);
  2. RandomAccessFile raf = new RandomAccessFile(String name, String mode);

(2)常用方法

  • getFileponiter() 返回檔案指標的位置
  • seek(pos) 設定檔案指標的位置

(3)mode:4種模式

  1. "r": 以只讀的方式開啟 呼叫write方法會丟擲IOException
  2. "rw": 便於讀取和寫入
  3. "rws": 便於讀取和寫入,同時對檔案的內容和後設資料的更新都會同步儲存
    到基礎儲存裝置
  4. "rwd": 便於讀取和寫入,同時對檔案的內容的更新都會同步儲存到基礎存
    儲裝置

(4)例項使用

public static void main(String[] args) {
        //隨機訪問檔案當中的某一部分資料
        RandomAccessFile raf = null;
        {
            try {
                raf = new RandomAccessFile("a.txt", "r");
                //將檔案指標移動到指定位置
                raf.seek(500);

                byte[] buf = new byte[256];
                int hasRead = 0;//真實讀取到的位元組數 <= buf.length
                while((hasRead=raf.read(buf)) > 0){
                    System.out.println(new String(buf, 0, hasRead));
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    raf.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

(5)練習1&2

1、隨機訪問檔案當中的某一部分資料,列印出來500之後的資料

    public static void main(String[] args) {
        RandomAccessFile raf = null;

        try {
            raf =new RandomAccessFile("a.txt","rw");
            raf.seek(500);

            byte [] buffer =new  byte[1024];
            int temp = -1;
            while ((temp=raf.read(buffer))!=-1){

                System.out.println(new String(buffer,0,temp));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

2、在指定位置追加"西安圖論軟體科技有限公司"

public class TestDemo {
    public static void main(String[] args) {
        RandomAccessFile raf = null;
        File tmp = null;
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            tmp = File.createTempFile("tmp", null);
            raf = new RandomAccessFile("a.txt", "rw");

            //需要讓檔案指標移動到該位置
            int pos = (int) (Math.random() * raf.length());
            raf.seek(pos);

            //複製指定位置之後的所有內容到tmp檔案中
            fis = new FileInputStream(tmp);
            fos = new FileOutputStream(tmp);

            byte[] buf = new byte[256];
            int hasRead = 0;
            while ((hasRead = raf.read(buf)) > 0) {
                fos.write(buf, 0, hasRead);
            }

            //在指定位置追加內容
            raf.write("西安圖論軟體科技有限公司".getBytes());


            //複製tmp檔案中的內容到該檔案之後
            while ((hasRead = fis.read(buf)) > 0) {
                raf.write(buf, 0, hasRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                raf.close();
                fis.close();
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}