gpt4 book ai didi

java - 从 Java 中不断更新的文件中读取新数据

转载 作者:行者123 更新时间:2023-11-30 01:57:21 29 4
gpt4 key购买 nike

我有一个日志文件,它不断更新新的数据行。我需要在 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();
}
}

但我有一种感觉,应该有更好的方法。我不喜欢内部有“ sleep ”的持续运行循环的想法,并且更喜欢某种事件驱动的方法。

如果我依靠文件系统事件在每次修改文件时重新打开文件,则会导致延迟。

对于这种情况,正确的做法是什么?

提前致谢!

最佳答案

文件并非旨在成为消息传递解决方案。即使使用基于环回的 TCP 也会有 10 - 30 微秒的延迟。在不更改文件格式的情况下,您的解决方案可能是最快的。

注意:您不必 sleep 整整一毫秒。您可以使用Thread.yield()LockSupport.parkNanos(100_000);对于更复杂的策略,您可以拥有类似 LongPauser 的类。它以可配置的方式退出。

顺便说一句,我实现了一种以低延迟方式写入/读取文件的解决方案,称为 Chronicle Queue。使用二进制格式实现亚微秒延迟以提高速度。

注意:您可以跳过所有字节 available() 直到结束。当您将文件作为 FileInputStream 打开时。这可能会导致行不完整,具体取决于缓冲的工作方式。

关于java - 从 Java 中不断更新的文件中读取新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53949520/

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