Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 > Java基本 > 入出力 −9.RandomAccessFileクラス
更新日:2006/1/2
入出力−9.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引数にファイル名、第2引数に読み書き両用モード"rw"を指定してRandomAccessFileオブジェクトrandomfile1を生成します。
(2). seekメソッドを使用し、ファイルポインタを8に設定します。
(3). getBytesメソッドを使用し、Stringオブジェクト「ひらがな。  」をbyte型配列に変換します。
(4). ファイルポインタ8の位置から、配列arraybytesの書き込みを行います。
(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>



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道