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

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

Jul 18, 2024 pm 07:08 PM

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

会社のセキュリティソフトウェアはアプリケーションの実行に失敗していますか?それをトラブルシューティングと解決する方法は? 会社のセキュリティソフトウェアはアプリケーションの実行に失敗していますか?それをトラブルシューティングと解決する方法は? Apr 19, 2025 pm 04:51 PM

一部のアプリケーションが適切に機能しないようにする会社のセキュリティソフトウェアのトラブルシューティングとソリューション。多くの企業は、内部ネットワークセキュリティを確保するためにセキュリティソフトウェアを展開します。 ...

名前を数値に変換してソートを実装し、グループの一貫性を維持するにはどうすればよいですか? 名前を数値に変換してソートを実装し、グループの一貫性を維持するにはどうすればよいですか? Apr 19, 2025 pm 11:30 PM

多くのアプリケーションシナリオでソートを実装するために名前を数値に変換するソリューションでは、ユーザーはグループ、特に1つでソートする必要がある場合があります...

MapsTructを使用したシステムドッキングのフィールドマッピングの問題を簡素化する方法は? MapsTructを使用したシステムドッキングのフィールドマッピングの問題を簡素化する方法は? Apr 19, 2025 pm 06:21 PM

システムドッキングでのフィールドマッピング処理は、システムドッキングを実行する際に難しい問題に遭遇することがよくあります。システムのインターフェイスフィールドを効果的にマッピングする方法A ...

Intellijのアイデアは、ログを出力せずにSpring Bootプロジェクトのポート番号をどのように識別しますか? Intellijのアイデアは、ログを出力せずにSpring Bootプロジェクトのポート番号をどのように識別しますか? Apr 19, 2025 pm 11:45 PM

intellijideaultimatiateバージョンを使用してスプリングを開始します...

エンティティクラス変数名をエレガントに取得して、データベースクエリ条件を構築する方法は? エンティティクラス変数名をエレガントに取得して、データベースクエリ条件を構築する方法は? Apr 19, 2025 pm 11:42 PM

データベース操作にMyBatis-Plusまたはその他のORMフレームワークを使用する場合、エンティティクラスの属性名に基づいてクエリ条件を構築する必要があることがよくあります。あなたが毎回手動で...

Javaオブジェクトを配列に安全に変換する方法は? Javaオブジェクトを配列に安全に変換する方法は? Apr 19, 2025 pm 11:33 PM

Javaオブジェクトと配列の変換:リスクの詳細な議論と鋳造タイプ変換の正しい方法多くのJava初心者は、オブジェクトのアレイへの変換に遭遇します...

eコマースプラットフォームSKUおよびSPUデータベースデザイン:ユーザー定義の属性と原因のない製品の両方を考慮する方法は? eコマースプラットフォームSKUおよびSPUデータベースデザイン:ユーザー定義の属性と原因のない製品の両方を考慮する方法は? Apr 19, 2025 pm 11:27 PM

eコマースプラットフォーム上のSKUおよびSPUテーブルの設計の詳細な説明この記事では、eコマースプラットフォームでのSKUとSPUのデータベース設計の問題、特にユーザー定義の販売を扱う方法について説明します。

Redisキャッシュソリューションを使用して、製品ランキングリストの要件を効率的に実現する方法は? Redisキャッシュソリューションを使用して、製品ランキングリストの要件を効率的に実現する方法は? Apr 19, 2025 pm 11:36 PM

Redisキャッシュソリューションは、製品ランキングリストの要件をどのように実現しますか?開発プロセス中に、多くの場合、ランキングの要件に対処する必要があります。

See all articles