私が持っているタスクは、非常に大きく、継続的に成長しているファイルを (ある程度効率的に) 1 行ずつ読み取ることです。基本的に私が今やっていることは次のとおりです。
BufferedReader rd = //initialize BufferedReader
String line;
while(true){
while((line=rd.readLine())==null){
try{
Thread.sleep(1000);
}catch(InterruptedException e){
//handle exception
}
}
//process line
}
したがって、私の BufferedReader は、読み取るものがさらにあるまで、ファイルの最後でハングします。これはうまく機能しますが、1 つ問題があります。ファイルに書き込むプロセスが行を書き込んでいる最中に readLine が呼び出された場合です。次に、readLine の最初の呼び出しで行の最初のセクションが返され、次の呼び出しで 2 番目のセクションが返されます。しかし、私は本当にこれら 2 つの部分を一緒にする必要があります。完全なセリフが必要です。
より具体的には、次のイベントのインターリーブが発生したときに問題が発生します。
- 書き込みプロセスはほとんどの行を書き込みます
- readLine() が呼び出されます
- 書き込みプロセスはその行を終了し、改行文字を追加します
- readLine() が呼び出されます
その結果、各 readLine() は、書き込みプロセスが出力している行全体のセクションを取得します。呼び出されるたびにファイルの最後に到達し、読み取ったものを返すため、期待どおりに動作しています。
したがって、基本的に必要な機能は、readLine の 1 つ前に null を返す BufferedReader です。EOFだけでなく、改行が続くまで行を提供しないもの。したがって、EOF が見つかった場合、その時点までの行は返されず、null が返され、ファイルが書き込まれ、その後に新しい行があると、その行が返されます。
FileReader をより直接的に処理し、本質的に BufferedReader を書き直すことで、おそらくこれを行う大まかな方法を実装できますが、これを効率的に行う方法についてはあまり知りません。私の実装はおそらく実際の BufferedReader ほど高速ではなく、読み取るデータがあるときにプログラムの速度が低下するのを避けたいと考えています。