web-dev-qa-db-ja.com

JavaのBufferedReaderでバッファをリセットしますか?

クラスBufferedReaderを使用して、バッファー内の行を1行ずつ読み取ります。バッファーの最後の行を読み取るときに、バッファーの先頭から再度読み取りを開始したいと思います。私はmark()reset()について読みましたが、その使用法はわかりませんが、それらが私を助けることができるとは思いません。

誰かが最後の行に達した後、バッファの最初から読み始める方法を知っていますか? RandomAccessFileseek(0)を使用できるように?

15
ipkiss

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));

(単純な例を使用するだけで、デフォルトの文字セットを使用することはお勧めしません)。

36
jtahlborn

はい。マークとリセットは、使用する方法です。

// 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();
4
Greg

これは私がこの問題を解決するのに役立ちました。ファイルを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"));
                }
0
JavaNoob