3

私はJavaでcod4サーバーコントローラーを書いています(完全に優れたサーバーコントローラーがあることは知っていますが、そこから学びたいです)。ここで、ログファイルのエントリに従って特定のアクションを実行したいと考えています。このファイルは cod によって頻繁に更新され、ファイルが非常に大きくなる可能性があります。では、ファイルの変更された部分だけを 1 秒ごとに効率的に読み取るにはどうすればよいでしょうか。

または、ログファイルで変更されたものをすべて Java にライブで送信する方法はありますか? (パイプについて何かを読みました)。サーバーは Linux で動作します。ログファイルを同じ場所に保存する必要はありません。すべてが Java を経由する必要があるため、そのまま保存できます。

約 1 ~ 2 秒の遅延は許容されますが、それ以上は許容されません。

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 に答える