1

Java を使用して UNIX テール ユーティリティを実装し、新しい行が追加されたときにログ ファイルを読み取ろうとしています。ログ ファイルには、15 分ごとに新しい行が書き込まれます。BufferedReader がファイルの最後に到達したら、数分間スリープ状態にし、起動時にファイルに新しい行が存在するかどうかを確認します。私のコードは次のようになります。

String line;
BufferedReader br = new BufferedReader(new FileReader("logfile.log"));
while (alive) {
    line = br.readline();
    if (line != null) {
        processLine(line);
    } else {
        Thread.sleep(1000 * 60 * 5);
    }
}

何らかの理由で、BufferedReader が最初に最後の行を読み取った後、その時点以降に入ってくる新しい行を検出できなくなります。誰にもアイデアはありますか?ありがとう!

* 更新 * 本当に奇妙なことは、当日のログを読むだけでこのコードが正常に動作することです。ただし、前日を読んで閉じてから当日を開くと、問題が発生します。前日のログからのデータを使用することは、プログラムの要件です。

テスト コードは次のようになります。

        String yestFile = "\\\\2012\\06\\28\\logfile.log"; 
        String todayFile = "\\\\2012\\06\\29\\logfile.log"; 

        FileWriter out;
        String outputFile = "c:\\temp\\brOut.txt";
        File outFile = new File(outputFile);
        if (!outFile.exists()) {
            outFile.createNewFile();
        }
        out = new FileWriter(outputFile);

        String line;
        String file = yestFile;
        while (true) {
            BufferedReader br = new BufferedReader(new FileReader(file));
            while (true) {
                line = br.readLine();
                if (line != null) {
                    out.write(line + "\n");
                } else {
                    if (file.equals(yestFile)) {
                        br.close();
                        br = null;
                        file = todayFile;
                        break;
                    }
                    Thread.sleep(1000 * 60);
                }
            }
        }

* Update 2 * すべての提案に感謝しますが、最も効果的な解決策は、その日の終わりまでファイルの最後に到達しないようにすることだと判断しました。ログの各行は、そのイベントが発生した時刻を示しているので、それを使用して現在のシステム時刻から 20 分遅れています。

long diff = System.currentTimeMillis() - eventCal.getTimeInMillis();
if (diff < _20_MINUTES) {
    Thread.sleep(_20_MINUTES - diff);
}
4

1 に答える 1

0

バッファリングされたリーダーが初めてファイルの最後に到達したときに EOF 文字に遭遇すると、br.readline()null 以外は何も返されません。

String line;
BufferedReader br = new BufferedReader(new FileReader("logfile.log"));
 while (alive) {
     line = br.readLine();
     if (line != null) {
         processLine(line);
     } else {
         Thread.sleep(1000 * 60 * 5);
         br.read();
     }
 }

もちろん、すべてを try/catch で囲みます。

于 2012-06-29T14:18:34.770 に答える