unix/linux「tail-f」のJavaIO実装にも同様の問題があります。ただし、このソリューションは、1秒あたり約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のテールをエミュレートする最良の方法は何ですか?