当前位置: 首页 > 知识库问答 >
问题:

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

段曦
2023-03-14

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

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

如果每次修改文件时都依赖文件系统事件重新打开文件,则会产生延迟。

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

提前谢谢!

共有1个答案

宋典
2023-03-14

文件不是设计为消息传递解决方案的。即使在环回上使用TCP,也会有10-30微秒的延迟。如果不更改文件格式,您的解决方案可能是最快的。

注意:你不需要睡整整一毫秒。你可以使用线程。yield()锁定支持。帕克纳诺(10万) 对于更复杂的策略,可以使用像LongPauser这样的类,该类以可配置的方式进行回退。

顺便说一句,我实现了一种以低延迟方式写入/读取文件的解决方案,称为“编年史队列”。这有亚微秒的延迟,使用二进制格式来提高速度。

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

 类似资料:
  • 问题内容: 我目前正在Linux系统上以python编写程序。目的是在发现特定字符串后读取日志文件并执行bash命令。日志文件正在被另一个程序不断写入。 我的问题 :如果使用该方法打开文件,我的Python文件对象将随着其他程序写入实际文件而更新,还是我必须在一定时间间隔内重新打开文件? 更新 :感谢到目前为止的答案。我也许应该提到,该文件是由Java EE应用程序写入的,所以我无法控制何时将数据

  • 问题内容: 我有以下格式的文本文件: Details.txt 该文件是.txt文件。我想从该文件中读取课程标题,并打印相应的教科书和教师信息。但是我不确定该遵循什么程序?将信息存储在数组中效率不高!我应该如何进行?注意:我无法更改文件中的信息,因此不应更改!显然,文件将通过以下代码读取: 但是我应该如何根据课程名称,教科书和讲师的标签从该文件中提取数据! 问题答案: 首先正确地逐行阅读文件,然后搜

  • 我是java的初学者,我正在尝试做一个小的java程序,读取一个excel文件,并在文件末尾添加一个新行来更新文件。然后再次读取并使用新行ecc,ecc进行更新。 这是我读取的文件(boh.xls): 点击这里查看图片 当他转到“workbook.write()”时,它会向我抛出这个错误: 有什么建议吗?谢谢你们!

  • 问题内容: 我开发了一个应用程序,可以从用户选择的文件夹中读取文件。它显示每个文件中有多少行代码。我只希望Java文件显示在文件选择器(扩展名为.java的文件)中。下面是我的代码: 我也进行了编辑,但是仍然无法正常工作,请告知请告知如何仅读取扩展名为.java的文件,换句话说,请仅从文件夹中读取java文件,请告知 问题答案: 您需要一个FilenameFilter。这应该为您工作:

  • 问题内容: 我需要一些帮助,将数据从文本文件读入我的。创建和将其放入文本文件的第一部分可以很好地工作。最后,我只需要在“已标记”区域中提供一些帮助。 请注意,某些标识符使用我的母语。 编译错误为。 问题答案: 每当我尝试运行此命令时,他们都会不断告诉我“无法解决该问题” 这意味着未在范围中声明。您不能访问它来调用任何方法。 他们 说对了。您需要在更大的范围内进行声明,或者将依赖于此的代码移到声明它

  • 问题内容: 我正在尝试解析一些日志文件,因为它们是用Go语言编写的,但是我不确定在不进行检查更改的情况下一次又一次地重新读取该文件的情况下,如何实现这一点。 我希望能够读到EOF,等到下一行写完后再读到EOF,依此类推。感觉有点像。 问题答案: 我已经编写了一个Go程序包github.com/hpcloud/tail来完成此任务。 … 引用kostix的答案: 在现实生活中,文件可能会被截断,替换