3

我正在用 Java 编写一个 cod4 服务器控制器(我知道那里有非常好的服务器控制器,但我想从中学习)。现在我想根据日志文件中的条目采取具体的行动,这个文件经常被 cod 更新,文件可能会变得很大。现在我如何有效地读取文件中已更改的部分,每秒左右?

或者有没有办法将日志文件中更改的所有内容实时发送到 Java?(我读过一些关于管道的东西)。服务器在 linux 上运行。不需要将日志文件仍然保存在同一位置,因为一切都应该通过 Java,我可以用它来保存它。

大约一到两秒的延迟是可以接受的,但不再是这样了。

4

3 回答 3

2

也许您可以执行“tail -f logfile.txt”子进程并监控输出流?

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Process.html

于 2011-05-04T15:56:10.750 回答
2

在阅读日志文件时,您可以在没有更多条目时暂停,稍后继续处理。该进程将在文件被写入时继续运行,并且只会读取附加到末尾的附加行。

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
  }
}

注意:如果文件被关闭并翻转,这可能不起作用,您必须做一些更复杂的事情来处理它。

于 2011-05-04T16:09:23.003 回答
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;
}

... whereprocessChunk是一种处理来自文件的新输入的方法。

这远非卓越,但我想你明白了。

于 2011-05-04T16:14:55.483 回答