unix/linux "tail -f" 的Java IO实现也有类似的问题;但该解决方案不适用于每秒生成约 50-100 行的日志文件。
我有一个模拟 Linux 中尾部功能的算法。例如,
File _logFile = new File("/tmp/myFile.txt");
long _filePtr = _logFile.length();
while (true)
{
long length = _logFile.length();
if (length < _filePtr)
{
// means file was truncated
}
else if (length > _filePtr)
{
// means something was added to the file
}
// we ignore len = _filePtr ... nothing was written to file
}
我的问题是什么时候:“文件中添加了一些东西”(指的是 else if() 语句)。
else if (length > _filePtr)
{
RandomAccessFile _raf = new RandomAccessFile(_logFile, "r");
raf.seek(_filePtr);
while ((curLine = raf.readLine()) != null)
myTextPane.append(curLine);
_filePtr = raf.getFilePointer();
raf.close();
}
程序在 while ((curLine = raf.readLine()).... 运行 15 秒后阻塞!(注意:程序在前 15 秒内运行正确)。
raf.readLine() 似乎永远不会达到 NULL,因为我相信这个日志文件的写入速度非常快,以至于我们进入了“无休止的猫捉老鼠”循环。
模拟 Linux 尾巴的最佳方法是什么?