Чтение из большого, непрерывно рост файла с BufferedReader

Задача, которую я имею, к (несколько эффективно) чтение линию за линией через очень большое, непрерывно выращивая файл. Вот в основном, что я делаю теперь:

BufferedReader rd = //initialize BufferedReader
String line;
while(true){
    while((line=rd.readLine())==null){
        try{
            Thread.sleep(1000);
        }catch(InterruptedException e){
            //handle exception
        }
    }
    //process line
}

Таким образом, мой BufferedReader просто зависает в конце файла, пока нет больше материала, который будет считан. Это работает вполне прилично, но существует одна проблема - Если readLine называют, в то время как процесс, который пишет в файл, посреди записи строки. Затем первый вызов к readLine возвратит первый раздел строки, и следующий вызов возвратит второй раздел. Но мне действительно нужны те две части вместе, я должен завершить строки.

Строго говоря, моя проблема происходит, когда следующее чередование событий происходит:

  1. Запись пишет большую часть строки
  2. readLine () называют
  3. Концы записи, что строка и добавляет символ новой строки
  4. readLine () называют

Результат состоит в том, что каждый readLine () берет раздел всей строки, которую производит запись. Это ведет себя как ожидалось при этом, потому что каждый раз это называют, это достигает конца файла так возвраты, что это считало.

Таким образом, по существу функциональностью, в которой я нуждаюсь, является BufferedReader, который возвращает пустой указатель один readLine ранее; тот, который не дает Вам строку до, существует разрыв строки после нее, не просто EOF после него. Таким образом, если это находит EOF, это не возвращает строку до той точки, это возвращает пустой указатель, и возвраты, что строка однажды файл была записана в и существуют новая строка после него.

Я мог, вероятно, реализовать сырой способ сделать это путем контакта с FileReader более непосредственно и по существу перезаписи BufferedReader, но я не знаю много о том, как сделать это эффективно. Моя реализация, вероятно, не будет с такой скоростью, как реальный BufferedReader, и я хотел бы постараться не замедлять программу в течение времен, когда существуют данные, которые будут считаны.

9
задан Joe K 8 July 2010 в 17:54
поделиться

4 ответа

Вы можете начать с источника BufferedReader и переписать String readLine (boolean ignoreLF) метод, который вызывает проблемы, если находит EOF до конца строки. (К сожалению, он не может быть унаследован из-за области действия пакета)

2
ответ дан 5 December 2019 в 01:42
поделиться

Вы можете попробовать http://www.gnu.org/software/kawa/api/gnu/text/LineBufferedReader.html
Это дает вам возможность вернуться к начало строки

0
ответ дан 5 December 2019 в 01:42
поделиться

BufferedReader не предназначен для возврата null, пока не достигнет окончательного конца потока. Другими словами, я бы не ожидал, что он когда-либо вернет ненулевое значение после того, как оно вернет null.

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

1
ответ дан 5 December 2019 в 01:42
поделиться

Старайтесь всегда возвращать последнюю строку назад, используя считыватель возврата .

0
ответ дан 5 December 2019 в 01:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: