クラスBufferedReader
を使用して、バッファー内の行を1行ずつ読み取ります。バッファーの最後の行を読み取るときに、バッファーの先頭から再度読み取りを開始したいと思います。私はmark()
とreset()
について読みましたが、その使用法はわかりませんが、それらが私を助けることができるとは思いません。
誰かが最後の行に達した後、バッファの最初から読み始める方法を知っていますか? RandomAccessFile
のseek(0)
を使用できるように?
mark/resetは必要なものですが、特定のバイト数(バッファサイズ)しかリセットできないため、BufferedReaderでは実際には使用できません。ファイルがそれよりも大きい場合は機能しません。 (残念ながら)これを行う「単純な」方法はありませんが、処理するのはそれほど難しくありません。元のFileInputStreamへのハンドルが必要なだけです。
FileInputStream fIn = ...;
BufferedReader bRead = new BufferedReader(new InputStreamReader(fIn));
// ... read through bRead ...
// "reset" to beginning of file (discard old buffered reader)
fIn.getChannel().position(0);
bRead = new BufferedReader(new InputStreamReader(fIn));
(単純な例を使用するだけで、デフォルトの文字セットを使用することはお勧めしません)。
はい。マークとリセットは、使用する方法です。
// set the mark at the beginning of the buffer
bufferedReader.mark(0);
// read through the buffer here...
// reset to the last mark; in this case, it's the beginning of the buffer
bufferedReader.reset();
これは私がこの問題を解決するのに役立ちました。ファイルを1行ずつ読み込んでいます。私はプログラムの非常に早い段階でBufferedReaderを実行しています。次に、readLineがnullかどうかを確認し、myFile.closeを実行してから、新しいBufferedReaderを実行します。最初のパススルーでは、readLine変数はnullになります。これは、グローバルに設定したため、まだreadLineを実行していないためです。変数はグローバルに定義され、nullに設定されます。その結果、クローズして新しいBufferedReaderが発生します。プログラムの最初でBufferedReaderを実行しない場合、このmyFile.closeは最初のパスでNPEをスローします。
ファイルが1行ずつ読み取られている間、readLineがnullではないため、このテストは失敗します。テストでは何も起こらず、残りのファイルの解析が続行されます。
後で、readLineがEOFに到達すると、再びnullとして評価されます。IE:このチェックの2回目のパスでも、myFile.closeと新しいBufferedREaderが実行され、readLineが最初にリセットされます。 。
事実上、ループの内側または外側では、このアクションはreadLine変数がグローバルにnullに設定されているか、EOFでのみ発生します。どちらの場合も、ファイルの先頭に戻るための「リセット」と新しいBufferedReaderを行います。
if (readLineOutput == null) {
//end of file reached or the variable was just set up as null
readMyFile.close();
readMyFile = new BufferedReader(new FileReader("MyFile.txt"));
}