У меня есть задача (несколько эффективно) построчно читать очень большой, постоянно растущий файл.Вот в основном то, что я делаю сейчас:
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 вернет первый раздел строки, а следующий вызов вернет второй раздел.Но мне действительно нужны эти две части вместе, мне нужны целые строки.
Более конкретно, моя проблема возникает, когда происходит следующее чередование событий:
- Процесс записи записывает большую часть строки
- readLine () называется
- Процесс записи завершает эту строку и добавляет символ новой строки
- readLine () называется
Результатчто каждый readLine () выбирает часть всей строки, которую выводит процесс записи.При этом он ведет себя так, как и ожидалось, потому что каждый раз, когда он вызывается, он достигает конца файла, поэтому возвращает то, что он прочитал.
Так что, по сути, необходимая мне функциональность - это BufferedReader, который возвращает ноль на одну readLine ранее;тот, который не дает вам строку, пока после нее не будет разрыв строки, а не просто EOF после нее.Поэтому, если он находит EOF, он не возвращает строку до этой точки, он возвращает ноль и возвращает эту строку, как только файл был записан, и после него есть новая строка.
Я мог бы реализоватьгрубый способ сделать это, работая с FileReader более непосредственно и по существу переписывая BufferedReader, но я не знаю, как это сделать эффективно.Моя реализация, вероятно, будет не такой быстрой, как настоящий BufferedReader, и я бы хотел избежать замедления программы в те моменты, когда - это данные для чтения.