🎲
【DBを自作する会 #1-2.5】ファイルシステムを理解しよう!─番外編(JavaにおけるRandomAccessFileの使い方)
概要
ファイルレベルインタフェースの典型例である「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]をみて、物理ブロック参照へのマッピングが行われています。
Discussion