2010-12-16 52 views
1

Tomcatのログファイルを読み込む必要があります。しばらくして(たとえば1時間)、ファイルをもう一度読み込みます(新しい追加されたコンテンツのみ)ので、RandomAccessFileを作成します完了した最後の位置を記録し、BufferedReader.readLine()メソッドを使用します。書き込み中にファイルを読む

ただし、ファイルの行全体を読み取ることができないことがあります。例えば

は、Tomcatは、以下の内容を記述するためにトリングれる(単なる例):

192.168.0.0のローカルホスト/index.htmlが.....

そして、この瞬間に

192.168.0 0ローカルホスト/index.htmlが.....

01:、私は読んだとき、私は結果を得ることができます

または

言うことだ192.168.0.0のローカルホスト/index.htmlが.....

この行が書かれている場合は、私の読者はuncompleteラインをお読みください。

私は読んでいる行が完成したかどうかを決める考えがあるのだろうか?

raf = new RandomAccessFile(file, "r"); 
raf.seek(pos); 
while ((line = raf.readLine()) != null) { 
    System.out.println(line); 
} 
pos = raf.getFilePointer(); 
raf.close(); 

私が試してみました。この(追加contidtion):

raf = new RandomAccessFile(file, "r"); 
raf.seek(pos); 
while ((line = raf.readLine()) != null) { 
    if(line.chartAt(line.length()-1)=='\n'){ 
     System.out.println(line); 
    } else 
     raf.seek(pos); //roll back to the last position 

} 
pos = raf.getFilePointer(); 
raf.close(); 

しかし、それは動作しません。..

任意のアイデア

これは、コアコードのですか?

+0

いつも最後の行をスキップしますか? – dagge

答えて

0

readLineは改行文字を消費します。あなたは完全な行を持っているかどうかを判断するためにそれを使用することはできません。あなたは一度に1バイトを読んで、あなた自身の行を解析する必要があります。あなたは、有効な行を取得するとき

また、あなたは、あなたがそれを見ることはありませんので、

+0

バイトb; while((b = raf.readByte())!= -1){ //このバイトがEOLかどうかをチェックする方法は? } – hguser

+0

また、私はreadByte()からバイトを取得しましたが、行区切り文字は文字列です:system.getProperty( "line.separator");それらを比較する方法? – hguser

+0

@hguserの場合は、入力した改行がシステムのデフォルトと一致すると仮定しないでください。代わりに\ r、\ nまたは\ r \ nを許可する必要があります –

0

readLine()はEOL文字を取り除き..位置に移動されていません。 EOFとEOLの違いは、あなたのケースでは問題になっています。ピーターのソリューションに加えて、あなたがラインを読んだ後にそれがEOLであるかどうかをチェックした後、1バイトのバックを探すことができます。しかし、使用されている行末のスタイルには注意してください。

関連する問題