ホームページ >Java >&#&チュートリアル >ランダムアクセスファイル

ランダムアクセスファイル

王林
王林オリジナル
2024-07-18 19:08:51993ブラウズ

Java は、ファイル内の任意の場所でデータを読み書きできるようにする RandomAccessFile クラスを提供します。これまでに使用したスト​​リームはすべて、読み取り専用 または 書き込み専用 ストリームと呼ばれます。これらのストリームはシーケンシャル ストリームと呼ばれます。シーケンシャル ストリームを使用して開かれるファイルは、シーケンシャル アクセス ファイルと呼ばれます。順アクセスファイルの内容は更新できません。ただし、多くの場合、ファイルの変更が必要になります。 Java は、ファイル内の任意の場所でデータの読み取りおよび書き込みを可能にする RandomAccessFile クラスを提供します。 RandomAccessFile クラスを使用して開かれたファイルは、ランダム アクセス ファイル と呼ばれます。

RandomAccessFile クラスは、以下の図に示すように、DataInput インターフェイスと DataOutput インターフェイスを実装します。 DataInput インターフェースは、プリミティブ型の値と文字列を読み取るためのメソッドを定義します (例: readIntreadDoublereadChar) readBooleanreadUTF) と DataOutput インターフェイスは、プリミティブ型の値と文字列を書き込むためのメソッドを定義します (例: writeIntwriteDouble、writeCharwriteBooleanwriteUTF).

Image description

RandomAccessFile を作成する場合、r または rw の 2 つのモードのいずれかを指定できます。モード r はストリームが読み取り専用であることを意味し、モード rw はストリームが読み取りと書き込みの両方を許可することを示します。たとえば、次のステートメントは新しいストリーム raf を作成します。これにより、プログラムはファイル test.dat: に対して読み書きできるようになります。

RandomAccessFile raf = new RandomAccessFile("test.dat", "rw");

test.dat がすでに存在する場合、それにアクセスするために raf が作成されます。 test.dat が存在しない場合は、test.dat という名前の新しいファイルが作成され、新しいファイルにアクセスするために raf が作成されます。メソッド raf.length() は、常に test.dat 内のバイト数を返します。ファイルに新しいデータを追加すると、raf.length() が増加します。

ファイルを変更するつもりがない場合は、

r モードで開きます。これにより、ファイルが意図せず変更されるのを防ぎます。

ランダム アクセス ファイルは一連のバイトで構成されます。

ファイル ポインター と呼ばれる特別なマーカーが、これらのバイトの 1 つに配置されます。読み取りまたは書き込み操作は、ファイル ポインターの位置で行われます。ファイルを開くと、ファイル ポインタがファイルの先頭に設定されます。ファイルにデータを読み書きすると、ファイル ポインタは次のデータ項目に移動します。たとえば、readInt() を使用して int 値を読み取る場合、JVM はファイル ポインターから 4 バイトを読み取り、ファイル ポインターは 4 バイト進んでいます。

Image description

RandomAccessFile raf

の場合、raf.seek(position) メソッドを使用して、ファイル ポインターを指定した位置に移動できます。 raf.seek(0) はファイルの先頭に移動し、raf.seek(raf.length()) はファイルの末尾に移動します。以下のコードは、RandomAccessFile. を示しています。

現在のファイルの長さは 800 です
package demo;
import java.io.*;

public class TestRandomAccessFile {

    public static void main(String[] args) throws IOException {
        try( // Create a random access file
            RandomAccessFile inout = new RandomAccessFile("inout.dat", "rw");
        ) {
            // Clear the file to destroy the old contents if exists
            inout.setLength(0);

            // Write new integers to the file
            for(int i = 0; i < 200; i++)
                inout.writeInt(i);

            // Display the current length of the file
            System.out.println("Current file length is " + inout.length());

            // Retrieve the first number
            inout.seek(0); // Move the file pointer to the beginning
            System.out.println("The first number is " + inout.readInt());

            // Retrieve the second number
            inout.seek(1 * 4); // Move the file pointer to the second number
            System.out.println("The second number is " + inout.readInt());

            // Retrieve the tenth number
            inout.seek(9 * 4); // Move the file pointer to the tenth number
            System.out.println("The tenth number is " + inout.readInt());

            // Modify the eleventh number
            inout.writeInt(555);

            // Append a new number
            inout.seek(inout.length()); // Move the file pointer to the end
            inout.writeInt(999);

            // Display the new length
            System.out.println("The new length is " + inout.length());

            // Retrieve the new eleventh number
            inout.seek(10 * 4); // Move the file pointer to the eleventh number
            System.out.println("The eleventh number is " + inout.readInt());
        }
    }

}

最初の数字は 0

2 番目の数字は 1
10番目の数字は9です
新しい長さは 804
11番目の数字は555

RandomAccessFile

inout.dat という名前のファイルに対してモード rw で作成され、8 行目で読み取りと書き込みの両方の操作が可能になります。

inout.setLength(0)

は、11 行目で長さを 0 に設定します。これにより、事実上、ファイルの古い内容が破棄されます。

for

ループは、0 から 199 までの 200 int 値をファイルの 14 行目と 15 行目に書き込みます。 🎜>int 値は 4 バイトを必要とし、inout.length() から返されるファイルの合計長は 800 になります (18 行目)。サンプル出力に示すように。

21 行目で inout.seek(0) を呼び出すと、ファイル ポインターがファイルの先頭に設定されます。 inout.readInt() は、22 行目の最初の値を読み取り、ファイル ポインタを次の番号に移動します。 2 番目の数値は 26 行目で読み取られます。

inout.seek(9 * 4) (29 行目) ファイル ポインタを 10 番目の番号に移動します。 inout.readInt() は 10 番目の数値を読み取り、ファイル ポインタを 30 行目の 11 番目の数値に移動します。 inout.write(555) は、現在の位置に新しい 11 番目の数値を書き込みます ( 33行目)。前の 11 番目の数字は破棄されます。

inout.seek(inout.length()) は、ファイル ポインタをファイルの末尾に移動します (行 36)。 inout.writeInt(999) は、999 をファイルに書き込みます (行 37)。ファイルの長さが 4 だけ増加したため、inout.length()804 を返します (行 40)。

inout.seek(10 * 4) は、ファイル ポインタを 43 行目の 11 番目の番号に移動します。新しい 11 番目の番号 555 が 44 行目に表示されます。 >

以上がランダムアクセスファイルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。