6

いくつかのログファイルをテール/解析しようとしています。エントリは日付で始まり、その後、多くの行にまたがることができます。

これは機能しますが、ファイルへの新しいエントリは表示されません。

File inputFile = new File("C:/test.txt");
InputStream is = new FileInputStream(inputFile);
InputStream bis = new BufferedInputStream(is);
//bis.skip(inputFile.length());
Scanner src = new Scanner(bis);
src.useDelimiter("\n2010-05-01 ");

while (true) {
    while(src.hasNext()){
    System.out.println("[ " + src.next() + " ]");
    }
}

Scannerのnext()またはhasNext()がファイルへの新しいエントリを検出していないようです。

基本的に、カスタム区切り文字を使用したtail-fを他にどのように実装できるかについてのアイデア。


わかりました-ケリーのアドバイスを使用して、スキャナーをチェックして更新しています。これは機能します。ありがとうございました !!

誰かが改善の提案を持っているなら、plzはそうします!

File inputFile = new File("C:/test.txt");
InputStream is = new FileInputStream(inputFile);
InputStream bis = new BufferedInputStream(is);
//bis.skip(inputFile.length());
Scanner src = new Scanner(bis);
src.useDelimiter("\n2010-05-01 ");

while (true) {
    while(src.hasNext()){
    System.out.println("[ " + src.next() + " ]");
    }

    Thread.sleep(50);
    if(bis.available() > 0){
    src = new Scanner(bis);
    src.useDelimiter("\n2010-05-01 ");
    }
}
4

1 に答える 1

1

スキャナーはバッファリングされている解析を行っていると思いますbisが、バッファが更新されることはありません。ストリームからバイトを読み取り続けるためにBufferedInputStreamまたはScannerに依存している可能性がありますが、それは自分で行う必要があると思います。

Javadocから:

BufferedInputStreamは、別の入力ストリームに機能を追加します。つまり、入力をバッファリングし、マークメソッドとリセットメソッドをサポートする機能を追加します。BufferedInputStreamが作成されると、内部バッファー配列が作成されます。ストリームからのバイトが読み取られるかスキップされると、内部バッファは、含まれている入力ストリームから必要に応じて、一度に何バイトも補充されます。マーク操作は入力ストリーム内のポイントを記憶し、リセット操作により、含まれている入力ストリームから新しいバイトが取得される前に、最新のマーク操作以降に読み取られたすべてのバイトが再読み取りされます。

于 2010-05-03T16:19:22.893 に答える