我正在用Java编写cod4服务器控制器(我知道那里有完美的服务器控制器,但我想从中学习)。现在我想根据日志文件中的条目采取特定的操作,这个文件经常被cod更新,文件可能会变得非常大。现在,我如何每隔一秒左右有效地只读取文件已更改的部分?
或者有没有办法将日志文件中的所有内容发送到Java?(我读了一些关于管道的东西)。服务器在linux上运行。不需要将日志文件保存在同一位置,因为所有内容都应该通过Java我可以保存它。
延迟大约一秒钟或2秒是可以接受的,但不能再延迟。
答案 0 :(得分:1)
也许你可以执行'tail -f logfile.txt'子流程并监控输出流?
http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Process.html
答案 1 :(得分:1)
在读取日志文件时,可以在没有其他条目时暂停,并在以后继续处理。在写入文件时,该过程将继续运行,并且只会读取附加到末尾的其他行。
BufferedReader br = ...;
String line = null;
while (true) {
line = br.readLine();
if (line == null) // nothing more to read, wait...
{
Thread.sleep(delay);
} else {
process(line); // take action
}
}
注意:如果文件被关闭并翻转,这可能不起作用,你将不得不做一些更复杂的事情来处理它。
答案 2 :(得分:0)
您可以使用RandomAccessFile。您可以将指针存储到您有红色的最后一个字节,如下所示:
String pathToYourFile = "/path/to/your/logfile";
long lastBytePosition = 0;
boolean shouldStop = false;
while (! shouldStop) {
Thread.sleep(2000);
File f = new File(pathToYourFile);
long length = f.length();
RandomAccessFile raf = new RandomAccessFile(f, "r");
byte[] buff = new byte[(int) (length - lastBytePosition)];
raf.readFully(buff, (int) lastBytePosition, (int) (length - lastBytePosition));
shouldStop = processChunk(buff);
lastBytePosition = (int) length;
}
...其中processChunk
是一种处理文件新输入的方法。
这与卓越相去甚远,但我认为你有了这个想法。