2010-10-13 2 views
1

Я хочу использовать что-то вроде BufferedReader для чтения строк из файла, но если последняя строка в файле не заканчивается символом новой строки, я бы хотел, чтобы его игнорировали. Стандартный BufferedReader вернет последнюю строку до EOF, чего я не хочу. Пока что самое лучшее, что я придумал, это скопировать источник BufferedReader, изменить одну строку об обработке EOF и называть его чем-то вроде BufferedCompleteLineReader. Однако это не очень хорошо. Кто-нибудь имеет лучшую идею?изменен BufferedReader игнорировать последнюю строку

В фоновом режиме есть несколько читателей, которые делают запросы на чтение файла, который периодически добавляется с новой строкой текста (т. Е. Файл журнала), но каждая новая строка действительна только в том случае, если она заканчивается символом новой строки. Если я прочитаю последнюю строку во время ее изменения, я получу плохие данные. Но я не хочу навязывать файловую блокировку, потому что производительность важнее для меня, чем полнота (для читателя).

ответ

2

Подкласс и переопределите метод readLine(), чтобы сделать то, что вам нужно.

+0

Я думал об этом изначально, но BufferedReader.readLine() достаточно сложный, так что я бы в конечном итоге полностью копировал большую часть класса, потому что мне нужна буферизация. Кроме того, я думаю, что добавление ограничения на подкласс нарушает принцип замены Лискова ... это не будет самозахватом, но это добавляет проблемы. – David

+0

Вы знаете, что можете вызвать super.readLine() и просто пропустить последнюю строку? –

+0

Я думаю, что это будет так же, как использование BufferedReader напрямую и игнорирование последней строки, не так ли? Я действительно хочу последнюю строку большую часть времени, просто нет, если она не заканчивается символом EOL (извините за двойное отрицание, я надеюсь, что имеет смысл) – David

2

Не можете ли вы просто сделать это на вызывающей стороне, где вы читаете и обрабатываете данные?

String nextLine = reader.readLine(); 
String currentLine = nextLine; 
while ((nextLine = reader.readLine()) != null) 
{ 
    // Use currentLine here 

    // Now we'll make sure we process the line we've just read on the 
    // next iteration - so long as it wasn't the last line 
    currentLine = nextLine; 
} 
+0

с тем, что я никогда не обработаю последнюю строку. В большинстве случаев мне нужна последняя строка в файле (только игнорируя ее, если она не была полностью записана, т. Е. Не имеет символа EOL) – David

+0

@David: будет ли файл не заканчиваться символом новой строки, когда все были обработаны? И в этот момент вы не получите пустую строку (которую вы проигнорируете) из BufferedReader? Я не могу вспомнить, что такое его поведение, если последняя строка пустая. –

+0

это очень похоже на файл журнала, поэтому он не заканчивается на самом деле. Новые строки просто продолжают прикладываться к нему. Таким образом BufferedReader идеально подходит для чтения всего до последней строки, и большую часть времени он хорош для чтения последней строки, просто если последняя строка не написана и читает частичную линию. – David

1

Создать пользовательский подкласс FilterReader и поместить его между BufferedReader и фактическим чтения файла/InputStream. В вашем читателе фильтров запишите копию последних нескольких символов на каждый вызов read (char []) (я говорю последние несколько символов, если вам нужно обрабатывать символы новой строки, которые содержат более 1 символа, например, окна). после того, как вы прочтете последнюю строку, проверьте последние символы, помеченные в FilterReader, чтобы увидеть, представляют ли они новую строку.

Смежные вопросы