1. 程式人生 > >Java 檔案隨機讀寫流 RandomAccessFile

Java 檔案隨機讀寫流 RandomAccessFile

一.簡述

1、是JAVA I/O流體系中功能最豐富的檔案內容訪問類,它提供了眾多方法來訪問檔案內容。

2、由於可以自由訪問檔案的任意位置,所以如果需要訪問檔案的部分內容,RandomAccessFile將是更好的選擇。

3、可以用來訪問儲存資料記錄的檔案,檔案的記錄的大小不必相同,但是其大小和位置必須是可知的。

RandomAccessFile類中比較重要的2個方法
方法名 作用
getFilePointer() 返回檔案記錄指標的當前位置
seek(long pos) 將檔案記錄指標定位到pos的位置

二.使用方法

(1)java檔案模型 
   在硬碟上的檔案是byte byte儲存的是資料的集合 
(2)開啟檔案 
   兩種模式 “rw”(讀寫) “r“(只讀) 
   RandomAccessFile raf = new RandomAccessFile(file,"rw") 
   檔案指標,開啟檔案時指標在開頭pointer = 0 
(3)寫方法 
   raf.write(int) ---> 只寫一個位元組(後八位),同時指標指向下一個位置,準備再次寫入 
(4)讀方法 
   int b = raf.read() ---->讀一個位元組 
(5)關閉 
   檔案讀寫完成以後一定要關閉(Oracle 官方說明)
public static void main(String[] args) throws IOException {
        File demo = new File("demo");
        if(!demo.exists()){
            demo.mkdir();
        }

        File file = new File(demo,"raf.dat");
        if(!file.exists()){
            file.createNewFile();
        }

        RandomAccessFile raf = new RandomAccessFile(file,"rw");
        //指標位置
        System.out.println(raf.getFilePointer());

        //只寫了一個位元組
        raf.write('A');
        System.out.println(raf.getFilePointer());
        raf.write('B');

        int i = 0x7fffffff;
        /**
         * 用write方法每次只能寫一個位元組,如果要把i寫進去就得寫4次
         */
        raf.write(i >>> 24);
        raf.write(i >>> 16);
        raf.write(i >>> 8);
        raf.write(i );
        System.out.println(raf.getFilePointer());

        /**
         * writeInt  直接寫入
         */
        raf.writeInt(i);

        String s = "中";
        byte[] gbk = s.getBytes("gbk");
        raf.write(gbk);
        System.out.println(raf.length());


        //讀檔案,必須把指標移到頭部
        raf.seek(0);
        //一次性讀取,把檔案中的內容都讀到位元組陣列中
        byte[] buf = new byte[(int)raf.length()];
        raf.read(buf);
        System.out.println(Arrays.toString(buf));

        raf.close();

    }