「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > ランダムアクセスファイル

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

2024 年 8 月 1 日に公開
ブラウズ:265

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

と呼ばれます。

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

Image description

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

の読み取りおよび書き込みが可能になります。

ランダムアクセスファイル raf = 新しいランダムアクセスファイル("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.
を示しています。

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 



現在のファイルの長さは 800 です
最初の数字は 0
2 番目の数字は 1
10番目の数字は9
です 新しい長さは 804
です 11番目の数字は555

です

RandomAccessFile が、モード rwinout.dat という名前のファイルに対して作成され、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 行目に表示されます。 ]

リリースステートメント この記事は次の場所に転載されています: https://dev.to/paulike/random-access-files-1464?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3