3

簡単なプログラムを使用してログ ファイルから読み取ろうとしています。使用したコードは次のとおりです。

RandomAccessFile in = new RandomAccessFile("/home/hduser/Documents/Sample.txt", "r");
String line;
while(true) {
if((line = in.readLine()) != null) {
System.out.println(line);
} else {
Thread.sleep(2000); 

このコードは、ログ ファイルに追加される新しい行に対しては適切に機能しますが、ロールオーバー プロセスを複製しません。つまり、ログ ファイルの内容がクリアされると、Java コンソールが、ログに新しく書き込まれた最初の行からテキストを読み続けることを期待しています。それは可能でしょうか?それを実現するには、既存のコードにどのような変更を加える必要がありますか?

4

3 に答える 3

2

私の仕事では、データを失うことなくロールオーバーできるログの処理に対処する必要がありました。私がしているのは、以下を含む小さなメモファイルを保存することです:

  • ログの最初の 1024 バイト (またはそれ以下) のハッシュ (簡単なので SHA-1 などを使用しました)
  • ハッシュの生成に使用されるバイト数
  • 現在のファイル位置

すべての行または最大行数を処理した後、ログ ファイルを閉じ、メモ ファイルを更新します。少しだけスリープしてから、ログ ファイルを再度開きます。これにより、ロールオーバーが発生したかどうかを確認できます。ロールオーバーは次の場合に検出されます。

  1. 現在のファイルは、最後のファイル位置よりも小さいです
  2. ハッシュは同じではありません

私の場合、ハッシュを使用して正しいログ ファイルを見つけ、逆方向に作業して最新の状態にすることができます。正しいファイルで中断したところから再開したことがわかったら、自分の位置を読み、メモし続けることができます。これがあなたのやりたいことに関連しているかどうかはわかりませんが、アイデアが得られるかもしれません。

永続化の要件がない場合は、おそらくメモ ファイルを保存する必要はありません。「ロールオーバー」によってログがクリアされるだけで移動されない場合は、おそらくファイル ハッシュを覚えておく必要はありません。

于 2013-05-15T06:26:32.477 に答える
1

I am sorry... My Bad.. I don't want it to go blank.. I just want the next new line written to the log to be read.

ファイルがクリアされたときに必要なものを最初から読み取ることができるため、ファイルの長さを監視し、ファイルの長さが短くなったときにカーソルポインターをリセットする必要があります。seek(..)メソッドを使用してカーソルをリセットできます。

以下のコードを参照してください -

RandomAccessFile in = new RandomAccessFile("/home/hduser/Documents/Sample.txt", "r");
String line;
long length = 0;//used to check the file length
while (true) {
    if(in.length()<length){//new condition to reset position if file length is reduced 
        in.seek(0);
    }
    if ((line = in.readLine()) != null) {
        System.out.println(line);
        length = in.length();
    } else {
        Thread.sleep(2000);
    }
}
于 2013-05-15T06:56:24.097 に答える