我有一个日志文件,该文件会不断更新以新的数据行。我需要在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事件重新打开文件,则会产生延迟。
在这种情况下,正确的做法是什么?
谢谢!
答案 0 :(得分:2)
文件并非旨在作为消息传递解决方案。即使使用基于环回的TCP,也会有10到30微秒的延迟。在不更改文件格式的情况下,您的解决方案可能是最快的。
注意:您不必睡一整毫秒。您可以使用Thread.yield()
或LockSupport.parkNanos(100_000);
来获得更复杂的策略,您可以使用类似LongPauser的类,该类以可配置的方式退出。
顺便说一句,我实现了一种以低延迟方式写入/读取文件的解决方案,称为Chronicle Queue。使用二进制格式提高速度具有亚微秒的延迟。
注意:打开文件作为FileInputStream时,可以跳过所有字节available()
,直到最后。这可能会导致行不完整,具体取决于缓冲的工作方式。