すべて、私は複数のスレッドによって書き込まれるファイルを読み取ろうとしBufferedReader
ています。スレッドでそのファイルを読み取るために使用します。
コードは次のようになります。
FileReader reader = new FileReader(file);
BufferedReader br = new BufferedReader(reader);
String detail;
while ((detail =br.readLine()) != null)
{
...
}
現在は問題なく動作しているようです。しかし、私はそれについていくつか質問があります。質問がばかげているように聞こえる場合。私を笑わないでください。ありがとう。
ループが壊れたことがない可能性はありますか?他のスレッドがファイルに書き込んでいるので、おそらくはreadLine()
nullを返さない可能性がありますか?
更新しました
3つのスレッド(T1、T2、T3)があるとしましょう。
T1とT2はライターです。
T3はリーダーです。
コードは以下の順序で実行されます。
1.現在のファイル行数は100です。
2.T1はファイルに行を書き込みます(ファイル行は101に増加します)
3.T3はファイル(101)の最後の行を読み取ります。次の読み取りはnullになります。
4.T2ファイルに行を追加します(ファイル行は102に増加します)
5.T3が再度読み取られます...(T3が再度読み取られる前にT2がファイルに新しい行を追加したため、nullが返されるかどうかはわかりません。)
事前に確認してください。ありがとうございます。
はい、ループが決して終了しない可能性があります(少なくともメモリが不足するまで)。これを証明するコードは次のとおりです。
public class test {
public static void main(String[] args) {
// start thread to write to file
new Thread(new Runnable() {
@Override
public void run() {
FileWriter writer;
try {
int i = 1;
writer = new FileWriter("D:\\text.txt");
writer.append("line"+ i++ + "\n");
writer.flush();
while (true)
{
writer.append("line"+ i++ + "\n");
writer.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
try {
Thread.sleep(500);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// start thread to read file
new Thread(new Runnable() {
@Override
public void run() {
try {
FileReader reader = new FileReader("D:\\text.txt");
BufferedReader br = new BufferedReader(reader);
String detail;
while ((detail =br.readLine()) != null)
{
System.out.println(detail);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加