Может ли вызов available () для BufferedInputStream привести меня в заблуждение в этом случае? - PullRequest
0 голосов
/ 15 марта 2011

Я читаю в файле произвольного размера в блоках по 1021 байт, с размером блока <= 1021 байт для последнего блока файла. На данный момент я делаю это, используя <code>BufferedInputStream, который обернут вокруг FileInputStream и код, который выглядит (примерно) следующим образом (где reader - это BufferedInputStream, и это работает в цикле):

int availableData = reader.available();
int datalen = (availableData >= 1021) 
                ? 1021 
                : availableData;
reader.read(bufferArray, 0, datalen);

Однако, читая документы API, я отмечаю, что available() дает только «оценку» доступного размера, прежде чем вызов будет «блокирован». Вывод значения availableData каждая итерация дает ожидаемые значения - начиная с размера файла и постепенно уменьшая его до <= 1021. Учитывая, что это локальный файл, я ошибаюсь, ожидая, что это будет правильное значение - есть ли ситуация, когда <code>available() даст неправильный ответ?

РЕДАКТИРОВАТЬ: Извините, дополнительная информация. BufferedInputStream обернут вокруг FileInputStream. Исходя из исходного кода FIS, я думаю, что я могу с уверенностью полагаться на available () как меру того, сколько данных осталось в случае локального файла. Я прав?

Ответы [ 2 ]

2 голосов
/ 16 марта 2011

Вопрос бессмысленный. Эти четыре строки кода полностью эквивалентны этому:

reader.read(buffer, 0, 1021);

без проблем с временным окном, которые вы ввели между вызовом available () и чтением. Обратите внимание, что этот код по-прежнему неверен, поскольку вы игнорируете возвращаемое значение, которое может быть -1 в EOS или что-то между 1 и 1021 включительно.

1 голос
/ 15 марта 2011

Он не дает приблизительный размер, он дает оставшиеся байты, которые могут быть прочитаны. Это не оценка с BufferedInputStream.

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

Вы должны передать available() непосредственно в вызов read(), если хотите избежать блокировки, но не забудьте вернуть, если возвращаемое значение равно 0 или -1. available() может вызвать исключение для типов буфера, которые не поддерживают операцию.

...