Java隨機存取檔案


使用隨機存取檔案,我們可以從檔案讀取以及寫入檔案。使用檔案輸入和輸出流的讀取和寫入是順序過程。使用隨機存取檔案,可以在檔案中的任何位置讀取或寫入。
RandomAccessFile類的一個物件可以進行隨機檔案存取。可以讀/寫位元組和所有原始型別的值到一個檔案。

RandomAccessFile可以使用其readUTF()writeUTF()方法處理字串。RandomAccessFile類不在InputStreamOutputStream類的類層次結構中。

模式

可以在四種不同的存取模式中建立隨機存取檔案。存取模式值是一個字串。 它們列出如下:

模式 含義
「r」 檔案以唯讀模式開啟。
「rw」 該檔案以讀寫模式開啟。 如果檔案不存在,則建立該檔案。
「rws」 該檔案以讀寫模式開啟。 對檔案的內容及其後設資料的任何修改就會立即被寫入儲存裝置。
「rwd」 該檔案以讀寫模式開啟。 對檔案內容的任何修改都會立即寫入儲存裝置。

讀和寫

通過指定檔案名和存取模式來建立RandomAccessFile類的範例。

RandomAccessFile  raf = new RandomAccessFile("randomtest.txt", "rw");

隨機存取檔案具有檔案指標,當從其讀取資料或向其寫入資料時,檔案指標向前移動。檔案指標是下一次讀取或寫入將開始的游標。其值指示游標與檔案開頭的距離(以位元組為單位)。

可以通過使用其getFilePointer()方法來獲取檔案指標的值。當建立一個RandomAccessFile類的物件時,檔案指標被設定為零。可以使用seek()方法將檔案指標設定在檔案中的特定位置。

RandomAccessFile類的length()方法返回檔案的當前長度。可以通過使用其setLength()方法來擴充套件或截斷檔案。

範例

以下程式碼顯示如何使用RandomAccessFile物件讀取和寫入檔案。

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

public class Main {
  public static void main(String[] args) throws IOException {
    String fileName = "randomaccessfile.txt";
    File fileObject = new File(fileName);

    if (!fileObject.exists()) {
      initialWrite(fileName);
    }
    readFile(fileName);
    readFile(fileName);
  }

  public static void readFile(String fileName) throws IOException {
    RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
    int counter = raf.readInt();
    String msg = raf.readUTF();

    System.out.println(counter);
    System.out.println(msg);
    incrementReadCounter(raf);
    raf.close();
  }

  public static void incrementReadCounter(RandomAccessFile raf)
      throws IOException {
    long currentPosition = raf.getFilePointer();
    raf.seek(0);
    int counter = raf.readInt();
    counter++;
    raf.seek(0);
    raf.writeInt(counter);
    raf.seek(currentPosition);
  }

  public static void initialWrite(String fileName) throws IOException {
    RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
    raf.writeInt(0);
    raf.writeUTF("Hello world!");
    raf.close();
  }
}

上面的程式碼生成以下結果。

0
Hello world!
1
Hello world!