gpt4 book ai didi

java - BufferedReader 无法读取日志文件中的新行

转载 作者:行者123 更新时间:2023-12-01 05:15:42 25 4
gpt4 key购买 nike

我正在尝试使用 Java 来实现 Unix tail 实用程序,以在添加新行时读取日志文件。日志文件每 15 分钟写入一次新行。一旦 BufferedReader 到达文件末尾,我就会让它 hibernate 几分钟,当它醒来时,它会检查文件中是否存在新行。我的代码看起来像这样:

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();
}
}

当然,并将整个事情包围在 try/catch 中

关于java - BufferedReader 无法读取日志文件中的新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11263346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com