Java RandomAccessFileは、ファイルへのデータの読み書き機能を提供します。RandomAccessFileは、ファイルシステムに格納されたバイトの配列と、ファイルポインタの位置を移動するために使用するカーソルとしてファイルと連携します。
Java RandomAccessFile
RandomAccessFileクラスは、Java IOの一部です。JavaでRandomAccessFileのインスタンスを作成する際には、ファイルを開くためのモードを指定する必要があります。たとえば、読み取り専用モードでファイルを開く場合は「r」を使用し、読み書き操作の場合は「rw」を使用する必要があります。ファイルポインタを使用して、ランダムアクセスファイルから任意の位置にデータを読み書きすることができます。現在のファイルポインタを取得するには、
getFilePointer()
メソッドを呼び出し、ファイルポインタのインデックスを設定するには、seek(int i)
メソッドを呼び出すことができます。既にデータが存在するインデックスにデータを書き込むと、それが上書きされます。
Java RandomAccessFileの読み取りの例
JavaでRandomAccessFileを使用してファイルからバイト配列を読み取ることができます。以下は、RandomAccessFileを使用してファイルを読み取るための疑似コードです。
RandomAccessFile raf = new RandomAccessFile("file.txt", "r");
raf.seek(1);
byte[] bytes = new byte[5];
raf.read(bytes);
raf.close();
System.out.println(new String(bytes));
最初の行では、読み取り専用モードでファイルのRandomAccessFileインスタンスを作成しています。次の行では、ファイルポインタをインデックス1に移動しています。長さ5のバイト配列を作成したため、read(bytes)メソッドを呼び出すと、5バイトがファイルからバイト配列に読み取られます。最後に、RandomAccessFileリソースを閉じて、バイト配列をコンソールに出力しています。
Java RandomAccessFileの書き込みの例
以下は、JavaでRandomAccessFileを使用してデータをファイルに書き込む方法を示すシンプルな例です。
RandomAccessFile raf = new RandomAccessFile("file.txt", "rw");
raf.seek(5);
raf.write("Data".getBytes());
raf.close();
RandomAccessFileはファイルをバイト配列として扱うため、書き込み操作はデータを上書きすることも、ファイルに追記することもできます。これは、ファイルポインタの位置に依存します。ポインタがファイルの長さを超えて移動し、その後書き込み操作が呼び出されると、ファイルにはジャンクデータが書き込まれます。したがって、書き込み操作を使用する際には、これに注意する必要があります。
RandomAccessFileの追記の例
すべて私たちが必要なのは、ファイルポインタがファイルの末尾にあることを確認して、ファイルに追記することです。以下は、RandomAccessFileを使用してファイルに追記するためのコードです。
RandomAccessFile raf = new RandomAccessFile("file.txt", "rw");
raf.seek(raf.length());
raf.write("Data".getBytes());
raf.close();
Java RandomAccessFileの例
以下は、さまざまな読み取りおよび書き込み操作を行う完全なJava RandomAccessFileの例です。
package com.journaldev.files;
import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomAccessFileExample {
public static void main(String[] args) {
try {
// ファイルの内容は「ABCDEFGH」です
String filePath = "/Users/pankaj/Downloads/source.txt";
System.out.println(new String(readCharsFromFile(filePath, 1, 5)));
writeData(filePath, "Data", 5);
// ファイルの内容は「ABCDEData」になります
appendData(filePath, "pankaj");
// ファイルの内容は「ABCDEDatapankaj」になります
} catch (IOException e) {
e.printStackTrace();
}
}
private static void appendData(String filePath, String data) throws IOException {
RandomAccessFile raFile = new RandomAccessFile(filePath, "rw");
raFile.seek(raFile.length());
System.out.println("current pointer = "+raFile.getFilePointer());
raFile.write(data.getBytes());
raFile.close();
}
private static void writeData(String filePath, String data, int seek) throws IOException {
RandomAccessFile file = new RandomAccessFile(filePath, "rw");
file.seek(seek);
file.write(data.getBytes());
file.close();
}
private static byte[] readCharsFromFile(String filePath, int seek, int chars) throws IOException {
RandomAccessFile file = new RandomAccessFile(filePath, "r");
file.seek(seek);
byte[] bytes = new byte[chars];
file.read(bytes);
file.close();
return bytes;
}
}
以上がJavaでのRandomAccessFileについてのすべてです。RandomAccessFile
Source:
https://www.digitalocean.com/community/tutorials/java-randomaccessfile-example