缓冲读取器无法读取日志文件中的新行



我正在尝试使用 Java 来实现 Unix tail 实用程序,以便在添加新行时读取日志文件。 日志文件每 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);
                }
            }
        }
*

更新 2 *感谢您的所有建议,但我决定最有效的解决方案只是防止在一天结束之前到达文件的末尾。 日志的每一行都指示该事件发生的时间,因此我只是使用它来滞后于当前系统时间 20 分钟。

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

一旦缓冲的读取器在第一次到达文件末尾时遇到 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();
     }
 }

当然,并在尝试/捕获中包围整个事情

最新更新