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!