我正在尝试使用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);
}
}
}
*更新2 * 感谢所有的建议,但我认为最有效的解决方案就是防止文件结束直到一天结束。日志的每一行都表示该事件发生的时间,所以我只是用它来落后当前系统时间20分钟。
long diff = System.currentTimeMillis() - eventCal.getTimeInMillis();
if (diff < _20_MINUTES) {
Thread.sleep(_20_MINUTES - diff);
}
答案 0 :(得分: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包围整个事物