Готовый метод BufferedReader в цикле while для определения EOF? - PullRequest
5 голосов
/ 28 декабря 2010

У меня большой файл (база данных статей из английской Википедии только в виде XML-файлов).Я читаю один символ за раз, используя BufferedReader.Псевдокод:

file = BufferedReader...

while (file.ready())
    character = file.read()

Действительно ли это действительно?Или ready просто вернет false, когда ожидает, когда жесткий диск вернет данные, а не фактически, когда будет достигнут EOF?Я пытался использовать if (file.read() == -1), но, похоже, натолкнулся на бесконечный цикл, который буквально не смог найти.

Мне просто интересно, читает ли он весь файл, поскольку моя статистика говорит, что 444,380 страниц Википедии были прочитаны, ноЯ думал, что было еще много статей.

Ответы [ 2 ]

9 голосов
/ 28 декабря 2010

Метод Reader.ready() не предназначен для проверки конца файла.Скорее, это способ проверить, будет ли блокировать вызов read().

Правильный способ определить, что вы достигли EOF - это проверить результат вызова read.

Например, если вы читаете символ за раз, метод read() возвращает int, который будет либо действительным символом, либо -1, если вы достигли конца файла.Таким образом, ваш код должен выглядеть так:

int character;
while ((character = file.read()) != -1) {
    ...
}
2 голосов
/ 28 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...