【发布时间】:2018-12-27 18:46:52
【问题描述】:
我有一个不断更新新数据行的日志文件。我需要在写入后立即在 java 中获取新添加的数据。目前我的解决方案是:
public static void readNonStop(String filename, boolean goToEnd, FileReadCallback readCallback) {
if(readCallback == null) {
return;
}
try {
BufferedReader br = new BufferedReader(new FileReader(filename));
try {
String line = br.readLine();
int lineNumber = 0;
if(goToEnd) {
while(br.readLine() != null) {}
}
while (true) {
if(line != null) {
readCallback.onRead(lineNumber++, line);
} else {
Thread.sleep(1);
}
line = br.readLine();
}
} finally {
br.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
但我有一种感觉,应该有更好的方法。我不喜欢内部有“睡眠”的持续运行循环的想法,我更喜欢某种事件驱动的方法。
如果我在每次修改文件时都依赖 FileSystem 事件重新打开文件,则会产生延迟。
对于这种情况,正确的做法是什么?
提前致谢!
【问题讨论】:
-
就目前而言,您没有具体的问题。因此,您的帖子更适合Code Review
-
你看过Java Watch Service吗?它比尝试实现自己的逻辑更好。看看这个帖子 - stackoverflow.com/questions/16251273/…
-
我目前正在使用 WatchService,但问题是,这会引入延迟,因为您需要一直打开和关闭文件。尽快需要数据。
-
你试过apache commons TailerListener吗? Javadoc:commons.apache.org/proper/commons-io/apidocs/org/apache/commons/… 实现:commons.apache.org/proper/commons-io/apidocs/src-html/org/…