🎲

【DBを自作する会 #1-2.5】ファイルシステムを理解しよう!─番外編(JavaにおけるRandomAccessFileの使い方)

2025/02/12に公開

概要

ファイルレベルインタフェースの典型例である「RandomAccessFile」の紹介です。下の画像に示す機能を実現してくれます。

使い方

サンプルコードは以下の通りです。

public class FileMgr {
  public static void fileRandomAccess() {
    try {
      // f は、今「ファイルの先頭」を指している
      RandomAccessFile f = new RandomAccessFile("./text.txt", "rws");

      // ファイルの先頭から、2バイト文字を書き込む
      f.writeChar(0x68);  // 'h'書く
      f.writeChar(0x65);  // 'e'書く
      f.writeChar(0x6c);  // 'l'書く
      f.writeChar(0x6c);  // 'l'書く
      f.writeChar(0x6f);  // 'o'書く

      // 移動
      f.seek(0);  // seekは、ファイルにおけるバイト列の任意の場所を指せる
      char n = f.readChar();   // 'h'読む
      System.out.print(n);     // 出力
      n = f.readChar();        // 'e'読む
      System.out.print(n);     // 出力
      n = f.readChar();        // 'l'読む
      System.out.print(n);     // 出力
      n = f.readChar();        // 'l'読む
      System.out.print(n);     // 出力
      n = f.readChar();        // 'o'読む
      System.out.println(n);   // 出力

      f.close();
    } catch (FileNotFoundException e) {
      System.err.println("File not found.");
    } catch (IOException e) {
      System.err.println("Exception on I/O occured");
    }
  }
}

実行結果は、

[INFO] ----------------------------< zendb:zendb >-----------------------------
[INFO] Building zendb 1.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- exec:3.5.0:java (default-cli) @ zendb ---
hello  # helloが出力された
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.482 s
[INFO] Finished at: 2025-02-11T18:02:37+09:00
[INFO] ------------------------------------------------------------------------

です。

ポイント

このRandomAccessFileでは、「ファイル」の下位に存在している「ブロック」の存在が見えません。しかし、裏側では、必要な分の論理ブロック参照[1]をみて、物理ブロック参照へのマッピングが行われています。


脚注
  1. 論理ブロック参照について詳細はこちら↩︎

Discussion