Java IO 实现 unix/linux 的 “tail -f”

2022-08-31 13:10:32

我想知道使用什么技术和/或库来实现linux命令“tail -f”的功能。我基本上正在寻找的附加组件/替代品的下降。客户端代码可能如下所示:java.io.FileReader

TailFileReader lft = new TailFileReader("application.log");
BufferedReader br = new BufferedReader(lft);
String line;
try {
  while (true) {
    line= br.readLine();
    // do something interesting with line
  }
} catch (IOException e) {
  // barf
}

缺失的部分是 的合理实现。它应该能够读取在打开文件之前存在的文件部分以及添加的行。TailFileReader


答案 1

看看Apache Commons对Tailer类的实现。它似乎也处理日志轮换。


答案 2

继续读取文件并等待文件具有更多更新的能力本身在代码中完成应该不难。下面是一些伪代码:

BufferedReader br = new BufferedReader(...);
String line;
while (keepReading) {
    line = reader.readLine();
    if (line == null) {
        //wait until there is more of the file for us to read
        Thread.sleep(1000);
    }
    else {
        //do something interesting with the line
    }
}

我假设您希望将这种类型的功能放在它自己的 Thread 中,以便您可以休眠它,而不会影响应用程序的任何其他区域。您可能希望在 setter 中公开,以便您的主类/应用程序的其他部分可以安全地关闭线程,而无需任何其他麻烦,只需调用或类似操作即可。keepReadingstopReading()