Javaに関する様々な情報をご紹介します。

9RandomAccessFileクラス

Javaに関する様々な情報をご紹介します。

RandomAccessFileクラス

このページではRandomAccessFileクラスについて説明します。

概要

FileReaderクラス、FileWriterクラス、FileInputStreamクラス、FileOutputStreamクラスなどのファイル入出力クラスはファイルに対し、順次アクセスにより動作します。つまり、ファイルから何らかのデータを読み込みたい場合、初めから該当するデータの位置まで順番にすべてのデータを読み込む必要があると言うことです。これはあまり効率のよい処理ではありません。

RandomAccessFileクラスを使用すると、任意の位置からデータの読み込み処理、書き込み処理を行うことができます。これは余計な読み込み処理、書き込み処理を行う必要がないため、効率的な処理と言うことができます。

RandomAccessFileクラス

RandomAccessFileクラスはどの入出力クラスにも属さないObjectクラス直下のクラスです。そのため、読み込みメソッドや書き込みメソッド、フィルタ処理などはRandomAccessFileクラス独自のものが用意されています。RandomAccessFileクラスの読み込みメソッド、書き込みメソッドには文字列やバイト型だけでなく、Javaの基本型でデータを処理するreadDoubleメソッドやwriteIntメソッドなどが用意されています。RandomAccessFileクラスを使用してフィルタ処理を行う場合はRandomAccessFileクラスが実装しているDataInputインタフェース、DataOutputインタフェースを使用して行います。

コンストラクタ

RandomAccessFileクラスで用意されているコンストラクタを紹介します。読み込み専用モードでRandomAccessFileオブジェクトを生成する際、該当するファイルがない場合、例外FileNotFoundExceptionがスローされます。読み書き両用モードでRandomAccessFileオブジェクトを生成する際、該当するファイルがない場合、長さ0のファイルが作られます。

コンストラクタ 説明
RandomAccessFile
(File, String)
第1引数にFileオブジェクトを指定し、第2引数が"r"の場合は読み込み専用モードで、"rw"の場合は読み書き両用モードで、該当するRandomAccessFileオブジェクトを生成します。
RandomAccessFile
(String , String)
第1引数にファイル名を指定し、第2引数が"r"の場合は読み込み専用モードで、"rw"の場合は読み書き両用モードで、該当するRandomAccessFileオブジェクトを生成します。

例1

Fileオブジェクトfile1を生成します。
RandomAccessFileクラスのコンストラクタの第1引数にFileオブジェクトfile1を指定し、第2引数に読み込み専用モード"r"を指定しRandomAccessFileオブジェクトrandomfile1を生成します。

File file1 = new File("abc.txt");
RandomAccessFile randomfile1 = new RandomAccessFile(file1, "r");

第1引数にファイル名"xyz.txt"を指定し、第2引数に読み書き両用モード"rw"を指定しRandomAccessFileオブジェクトrandomfile2を生成します。

RandomAccessFile randomfile2 = new RandomAccessFile("xyz.txt", "rw");

メソッド

RandomAccessFileクラスで用意されている主なメソッドを紹介します。

戻り型 メソッド 説明
void close( ) RandomAccessFileストリームを終了し、すべてのリソースを開放します。
long getFilePointer( ) ファイルに対する現在のファイルポインタの位置を返します。
long length( ) ファイルの長さを返します。
int read( ) ファイルから1バイトのデータを読み込みます。
boolean readBoolean( ) ファイルからbooleanを読み込みます。
byte readByte( ) ファイルから符号付8ビット値を読み込みます。
char readChar( ) ファイルからUnicode文字を読み込みます。
double readDouble( ) ファイルからdoubleを読み込みます。
float readFloat( ) ファイルからfloatを読み込みます。
int readInt( ) ファイルから符号付32ビット整数を読み込みます。
String readLine( ) ファイルから1行を読み込みます。
long readLong( ) ファイルから符号付64ビット整数を読み込みます。
short readShort( ) ファイルから16ビット数を読み込みます。
int readUnsignedByte( ) ファイルから符号なし8ビット数を読み込みます。
int readUnsignedShort( ) ファイルから符号なし16ビット数を読み込みます。
String readUTF( ) ファイルから文字列を読み込みます。
void seek(long) ファイルの先頭を起点として、ファイルポインタを設定します。
void write(byte[ ]) 現在のファイルポインタの位置から、引数に指定されたbyte配列分のデータをファイルに書き込みます。
void writeBoolean(boolean) booleanを1バイト値としてファイルに書き込みます。
void writeByte(int) byteを1バイト値としてファイルに書き込みます。
void writeBytes(String) 文字列を一連のバイト値としてファイルに書き込みます。
void writeChar(int) charを2バイト値としてファイルに書き込みます。
void writeChars(String) 文字列を一連の文字としてファイルに書き込みます。
void writeDouble(double) doubleをlongに変換してから、そのlong値を8バイト値として上位バイトから先にファイルに書き込みます。
void writeFloat(float) floatをintに変換してから、そのint値を4バイト値として上位バイトから先にファイルに書き込みます。
void writeInt(int) intを4バイト値としてファイルに書き込みます。
void writeLong(long) longを8バイト値としてファイルに書き込みます。
void writeShort(int) shortを2バイト値としてファイルに書き込みます(上位バイトから先に書き込む)。
void writeUTF(String) マシンに依存しないUTF-8エンコーディングを使って、文字列をファイルに書き込みます。

【例2】RandomAccessFileクラスで用意されているメソッドを使用して、「This is an alphabet.」を「This is ひらがな。」に変更する例です。

import java.io.*;

public class ExIO8 {
    public static void main(String[] args) {
        try {
            //(1)RandomAccessFileオブジェクトの生成
            RandomAccessFile randomfile1 = new RandomAccessFile("abc.txt", "rw");
            //(2)ファイルポインタの設定
            randomfile1.seek(8);
            //(3)データをbyte型配列に変換
            byte[] arraybytes = "ひらがな。  ".getBytes();
            //(4)ファイルポインタの位置からデータの書き込み
            randomfile1.write(arraybytes);
            randomfile1.close();  //(5)RandomAccessFileストリームのクローズ
        } catch (IOException e) {
        }
    }
}

解説2

  1. (1)第1引数にファイル名、第2引数に読み書き両用モード"rw"を指定してRandomAccessFileオブジェクトrandomfile1を生成します。
  2. (2)seekメソッドを使用し、ファイルポインタを8に設定します。
  3. (3)getBytesメソッドを使用し、Stringオブジェクト「ひらがな。  」をbyte型配列に変換します。
  4. (4)ファイルポインタ8の位置から、配列arraybytesの書き込みを行います。
  5. (5)closeメソッドを使用し、RandomAccessFileストリームを閉じます。

実行結果2

D:\JAVA>type abc.txt
This is an alphabet.   # 変更前データ
D:\JAVA>javac ExIO8.java

D:\JAVA>java ExIO8

D:\JAVA>type abc.txt
This is ひらがな。  # 変更後データ
D:\JAVA>

9RandomAccessFileクラス