Java Scanner не будет следовать за файлом - PullRequest
6 голосов
/ 03 мая 2010

Попытка привязать / проанализировать некоторые файлы журнала. Записи начинаются с даты, затем могут занимать много строк.

Это работает, но никогда не видит новых записей в файле.

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() + " ]");
    }
}

Не похоже, что сканер next () или hasNext () обнаруживает новые записи в файле.

Любая идея, как еще я могу реализовать, в основном, хвост -f с пользовательским разделителем.

<Ч />

хорошо - используя совет Келли, я проверяю и обновляю сканер, это работает. Спасибо !!

если у кого есть предложения по улучшению, пожалуйста, сделайте!

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 ");
    }
}

1 Ответ

1 голос
/ 03 мая 2010

Я бы предположил, что сканер анализирует bis, который буферизуется, но буфер никогда не обновляется. Возможно, вы полагаетесь на BufferedInputStream или Scanner для продолжения чтения байтов из потока, но я думаю, что вы должны сделать это самостоятельно.

Из Javadocs:

BufferedInputStream добавляет функциональность для другого входа поток, а именно, возможность буферизации вход и для поддержки знака и методы сброса. Когда BufferedInputStream создан, создан внутренний буферный массив Как байты из потока читаются или пропущен, внутренний буфер пополнить по мере необходимости от входящий поток, много байтов в время. Операция метки запоминает указать во входном потоке и операция сброса вызывает все байты читать с самого последнего знака операция будет перечитана перед новым байты взяты из содержимого входной поток.

...