Читать файл во время его записи - PullRequest
1 голос
/ 16 декабря 2010

Мне нужно прочитать файл журнала tomcat, и через некоторое время (например, через час) я снова прочитаю файл (только для нового добавленного содержимого), поэтому я создаю файл 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();

Но это не работает ..

ЛЮБАЯ идея?

Ответы [ 2 ]

0 голосов
/ 16 декабря 2010

readLine() удаляет символы EOL, чтобы вы их не видели. Между EOF и EOL нет разницы с точки зрения, которая беспокоит вас. В дополнение к решению Питера, вы можете попытаться найти один байт назад после того, как прочитали строку и проверили, было ли это EOL или нет. Будьте осторожны, используя стиль окончания строки.

0 голосов
/ 16 декабря 2010

readLine использует символ новой строки. Вы не можете использовать его, чтобы определить, есть ли у вас полная строка или нет. Вам нужно читать по одному байту за раз и разбирать строку самостоятельно.

Также вы не двигаетесь на позиции, когда получаете правильную линию.

...