前の調査から、ファイルを読み取る場合はそのファイルを指す入力ストリームを作成する必要があり、ファイルを書き込む場合はそのファイルを指す出力ストリームを作成する必要があることがわかりました。では、ファイルの読み取りと書き込みの両方ができるストリームを作成できるでしょうか?これはまさにこのセクションのランダム ストリームに関するものです。
RandomAccessFile クラスによって作成されるストリームは、ランダム ストリームと呼ばれます。前述の入力ストリームおよび出力ストリームとは異なり、RandomAccessFile クラスは、InputStream クラスのサブクラスでも、OutputStream クラスのサブクラスでもありません。ただし、RandomAccessFile クラスによって作成されたストリームのポイントは、ストリームのソースまたはストリームの宛先として使用できます。つまり、ファイルの読み取りおよび書き込みの準備をするときに、ファイルを指すランダム ストリームを作成します。ファイルなので、このストリームからファイルからデータを読み取ることができ、また、このストリームを通じてファイルにデータを書き込むこともできます。
以下は、RandomAccessFile クラスの 2 つのコンストラクターです。
name パラメーターはファイル名を決定するために使用され、作成されたストリームのソース (ストリームの宛先でもあります) を指定します。パラメータ モードは r (読み取り専用) または rw (読み取り/書き込み) で、これによって、作成されたストリームのファイルへのアクセス権が決まります。
パラメータ ファイルは、作成されたストリームのソースを指定する File オブジェクトであり、ストリームの宛先でもあります。パラメータ モードは r (読み取り専用) または rw (読み取り/書き込み) で、これによって、作成されたストリームのファイルへのアクセス権が決まります。
注: RandomAccessFile ストリームがファイルを指している場合、そのファイルは更新されません。
RandomAccessFile クラスには、RandomAccessFile ストリームの読み取りおよび書き込み位置を特定するために使用されるメソッド look(long a) があり、パラメーター a によって、読み取りおよび書き込み位置からファイルの先頭までのバイト数が決まります。さらに、ストリームは getFilePointer() メソッドを呼び出して、ストリームの現在の読み取りおよび書き込み位置を取得することもできます。 RandomAccessFile ストリームは、シーケンシャルな読み取りと書き込みよりもファイルの読み取りと書き込みに柔軟性があります。
たとえば、いくつかの int 整数を tom.dat という名前のファイルに書き込み、データを逆の順序で読み取ります。
importjava.io.*;publicclassMain{publicstaticvoidmain(Stringargs[]){RandomAccessFileinAndOut=null;intdata[]={1,2,3,4,5,6,7,8,9,10};try{inAndOut=newRandomAccessFile (tom.dat,rw);for(inti=0;i<data.length;i++){inAndOut.writeInt(data[i]);}for(longi=data.length-1;i>=0;i --){inAndOut.seek(i*4);System.out.printf(t%d,inAndOut.readInt());/*int型データは4バイトを占有し、inAndOutはファイルの36番目から始まります。最後の整数バイトを取得し、4 バイトごとに整数を読み取ります。forward*/}inAndOut.close();}catch(IOExceptione){}}}
RandomAccessFile ストリームの一般的なメソッドは次のとおりです。
注: RandomAccessFile ストリームの readLine() メソッドが、漢字を含むファイルなど、ASCⅡ以外の文字を含むファイルを読み込むと、「文字化け」が発生します。したがって、readLine() によって読み取られた文字列を「iso-8859-1」エンコーディングを使用して再エンコードしてバイト配列に格納し、その後、現在のマシンのデフォルトのエンコーディングを使用して配列を文字列に変換する必要があります。操作は次のとおりです。
Stringstr=in.readLine();
byteb[]=str.getBytes(iso-8859-1);
Stringcontent=newString(b);
マシンのデフォルトのエンコードが「GB2312」の場合、
Stringcontent=newString(b);
に相当
Stringcontent=newString(b,GB2312);
例えば:
importjava.io.*;publicclassMain{publicstaticvoidmain(Stringargs[]){RandomAccessFilein=null;try{in=newRandomAccessFile(Main.java,rw);longlength=in.length();//ファイルの長さを取得longposition= 0; in.seek(position);//読み取り位置をファイルの先頭に配置します while(position<length){Stringstr=in.readLine();byteb[]=str.getBytes(iso-8859-1) ;str =newString(b);position=in.getFilePointer();System.out.println(str);}}catch(IOExceptione){}}}