1

「BufferedReader」を使用してライブ ログ ファイルを読み取り、新しく追加されたコンテンツをコンソールに出力したいと考えています。

File logfile = new File("logFile.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(logfile)));
while(true) {
    String line = reader.readLine();
    System.out.println(line);
    Thread.sleep(1000L);
}

新しく追加された行が出力され、場合によってはnull出力されます (ログに追加された新しい行がないことを意味します)。

私の質問は、reader.readLine()ある条件でブロックされるかどうかです。私のテストでは、ブロックされませんが、常にブロックされるかどうかはわかりません。

4

3 に答える 3

1

はい、ブロックされますが、ネットワークドライブから読み取っていて、ネットワークに何か奇妙なことが起こった場合を除き、かなりの時間間隔ではブロックされません。別の例として、動的プロデューサーを持つパイプがあります。

私のテストでは、ブロックされません

EOF でブロックされません。これは、おそらく実際に知りたいことです。どうして?

null を出力します (ログに新しい行が追加されていないことを意味します)

過去の EOF を読み取ろうとしたことを意味します。

独自のログ ファイルを読み取るシステムは、私には非常に悪臭を放っています。システムがそれ自体と通信する必要がある場合は、実装してください。

于 2013-11-11T08:46:50.583 に答える
1

ブロッキングからFileInputStream読み取っているため、オペレーティング システムが永続ストレージからデータを読み取っている間、実行は短時間ブロックされます。ファイルがローカル ディスクに保存されている場合でも、ディスクを回転させ、読み取りヘッドを正しい位置に移動する必要があります。どちらも物理オブジェクトであるため、時間がかかります。その間、プログラムは待機するだけです。 .

ファイルの最後に到達すると、readLineメソッドは戻ります。nullその場合は、ファイルが更新されるのを待ってから、さらに読み込もうとします。

while(true) {
    String line = reader.readLine();
    if (line == null) {
        Thread.sleep(1000L);
        continue;
    }
    System.out.println(line);
}

ログファイルの最後の行が不完全なreadLine場合はそれを返し、外部プロセスが残りの行を書き込むと、 への別の呼び出しでそれを取得するため、実際にはこれも完全ではありませんreadLine。最終的な影響: 出力で一部の行が分割される場合があります。

于 2013-11-11T08:55:04.553 に答える