1

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

しかし、ファイルの行全体を読み取れない場合があります。

たとえば、Tomcatは次のコンテンツを書き込もうとしています(単なる例)。

192.168.0.0 localhost/index.html....。

そしてこの瞬間、私が読んだときに私は結果を得るかもしれません:

192.168.0 0 localhost/index.html....。

また

192.168.0.0 localhost/index.html....。

つまり、この行が書き込まれている場合、私の読者は不完全な行を読みます。

それで、読んでいる行が完了したかどうかを判断するためのアイデアはありますか?

これはコアコードです:

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

私はこれを試しました(条件を追加してください):

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();

しかし、それは機能しません。

何か案が?

4

2 に答える 2

0

readLineは改行文字を消費します。完全な行があるかどうかを判断するために使用することはできません。一度に1バイトを読み取り、自分で行を解析する必要があります。

また、有効なラインを取得したときに、その位置に移動していません。

于 2010-12-16T11:33:45.830 に答える
0

readLine()EOL文字を削除して、表示されないようにします。あなたの場合に厄介な観点から、EOFとEOLの間に違いはありません。Peterの解決策に加えて、行を読んだ後、1​​バイト戻ってシークし、それがEOLであるかどうかを確認することができます。ただし、使用されている行末スタイルには注意してください。

于 2010-12-16T11:37:30.003 に答える