10

私はファイルを1行ずつ読んでいて、特定のパラメータに適合する行に到達した場合(私の場合は特定の単語で始まる場合)、その行を上書きできるようにしようとしています。

私の現在のコード:

try {
    FileInputStream fis = new FileInputStream(myFile);
    DataInputStream in = new DataInputStream(fis);
    BufferedReader br = new BufferedReader(new InputStreamReader(in));
    String line;

    while ((line = br.readLine()) != null) {
        System.out.println(line);
            if (line.startsWith("word")) {
                // replace line code here
            }
    }
} catch (Exception ex) {
    ex.printStackTrace();
}

...myFileFileオブジェクトです。

いつものように、ヘルプ、例、または提案は大歓迎です。

ありがとう!

4

3 に答える 3

16

RandomAccessFileが適しているようです。そのjavadocは言う:

このクラスのインスタンスは、ランダム アクセス ファイルの読み取りと書き込みの両方をサポートします。ランダム アクセス ファイルは、ファイル システムに格納された大きなバイト配列のように動作します。ファイル ポインターと呼ばれる、暗黙の配列への一種のカーソルまたはインデックスがあります。入力操作は、ファイル ポインターから始まるバイトを読み取り、ファイル ポインターを読み取ったバイトを超えて進めます。ランダム アクセス ファイルが読み取り/書き込みモードで作成されている場合は、出力操作も使用できます。出力操作は、ファイル ポインターから始まるバイトを書き込み、書き込まれたバイトを超えてファイル ポインターを進めます。暗黙の配列の現在の末尾を超えて書き込む出力操作により、配列が拡張されます。ファイル ポインタは、getFilePointer メソッドで読み取り、seek メソッドで設定できます。

とはいえ、テキスト ファイルはシーケンシャル ファイル形式であるため、行を別の長さの行に置き換えるには、後続のすべての文字を移動する必要があります。そのため、行を置き換えると、通常はファイル全体を読み書きすることになります。これは、別のファイルに書き込み、完了したら出力ファイルの名前を変更すると、より簡単に実行できます。これは、初期ファイルの内容で単純に再試行できるため、何か問題が発生した場合にもより堅牢です。RandomAccessFile の唯一の利点は、一時出力ファイル用のディスク領域が必要ないことと、アクセスの局所性が向上するため、ディスクのパフォーマンスがわずかに向上する可能性があることです。

于 2013-01-23T00:46:20.657 に答える
5

ここでの最善の策は、おそらくファイルをメモリに読み込み ( のようなものStringBuilder)、出力ファイルをStringBuilder. ファイルの読み込みが完了したら、ファイルの内容を書き込みStringBuilderます。

ファイルが大きすぎてメモリ内でこれを実行できない場合は、いつでもファイルの内容を 1 行ずつ読み込んで、StringBuilder. その後、古いファイルを削除し、一時ファイルをその場所に移動できます。

于 2013-01-23T00:41:24.437 に答える