繁体   English   中英

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

[英]Reading new data from a constantly updating file in Java

我有一个日志文件,该文件会不断更新以新的数据行。 我需要在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事件重新打开文件,则会产生延迟。

在这种情况下,正确的做法是什么?

提前致谢!

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM