Java BufferedReader はテキスト ファイルの先頭に戻りますか?
-
06-07-2019 - |
質問
現在2つ持っています BufferedReader
■ 同じテキスト ファイル上で初期化されます。最初のテキストファイルを読み終わったら、 BufferedReader
, 2 番目のものを使用して、ファイルを上からもう一度パススルーします。同じファイルを複数回パスする必要があります。
については知っています reset()
, 、ただし、その前に呼び出しを行う必要があります mark()
そして mark()
ファイルのサイズを知る必要がありますが、気にする必要はないと思います。
アイデアは?パッケージ?リブ?コード?
TJに感謝します
解決
上から読むための新しい BufferedReader
を作成するだけの欠点は何ですか?ファイルが十分に小さい場合、オペレーティングシステムがファイルをキャッシュすると予想します。
パフォーマンスに懸念がある場合、それがボトルネックであることを証明しましたか?私は最も簡単なことをするだけで、特定の理由があるまで心配する必要はありません。つまり、すべてをメモリに読み込んで、結果に2つのパスを実行することもできますが、新しいリーダーで最初から読み直すよりも複雑になります。
他のヒント
バッファー リーダーは、ファイルを順番に読み取ることを目的としています。あなたが探しているのは、 java.io.RandomAccessファイル, 、その後、使用できます seek()
ファイル内の目的の場所に移動します。
ランダム アクセス リーダーは次のように実装されます。
try{
String fileName = "c:/myraffile.txt";
File file = new File(fileName);
RandomAccessFile raf = new RandomAccessFile(file, "rw");
raf.readChar();
raf.seek(0);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
の "rw"
はモード文字です。 詳細はこちら.
シーケンシャル アクセス リーダーがこのように設定されているのは、バッファーを実装でき、足元で変更できないようにするためです。たとえば、バッファ付きリーダーに与えられたファイル リーダーは、そのバッファ付きリーダーによってのみ操作される必要があります。影響を与える可能性のある別の場所があった場合、一方のリーダーがファイル リーダー内で位置を進めた一方で、もう一方のリーダーは同じ位置を維持したいため、動作が一貫性がなくなる可能性があります。現在、もう一方のリーダーを使用していて、そのリーダーが不明な場所にあります。
続行する最善の方法は、2回目のパスが不要な方法でアルゴリズムを変更することです。このアプローチを数回使用し、使用可能なメモリに収まらない巨大な(ひどい、つまり数GB)ファイルを処理する必要がありました。
それは難しいかもしれませんが、パフォーマンスの向上は通常努力する価値があります
マーク/リセットについて:
BufferedReaderのmarkメソッドはreadAheadLimitパラメーターを取ります。これは、マークがリセットされてから不可能になるまでの読み取り範囲を制限します。リセットは、実際にはファイルシステムのseek(0)を意味するのではなく、バッファ内をシークするだけです。 Javadocを引用するには:
readAheadLimit-マークを保持したまま読み取ることができる文字数の制限。この数の文字を読み取った後、ストリームをリセットしようとすると失敗する場合があります。入力バッファのサイズよりも大きい制限値は、サイズが制限以上の新しいバッファを割り当てます。したがって、大きな値は注意して使用する必要があります。
" Marked()とreset()に関するビジネス全体が、デザインの悪いBufferedReaderのスマックです。"
このクラスを拡張して、constructor()でmark()を実行し、topOfFile()メソッドでseek(0)を実行しないのはなぜですか。
BR、
〜A