Здравствуйте! Хотелось бы выяснить у опытных товарищей следующий момент:
Часто вижу, что для проверки достижения конца файла, используют метод available() класса
FileInputStream
.
Мой вопрос заключается в следующем: А может ли сложится такая ситуация, когда вызов метода available()
класса FileInputStream
возвратит значение 0
, до достижения конца файла?
Просто в описании метода available() абстрактного класса InputStream
, который является базовым классом для FileInputStream
, сказано следующее:
"Returns an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking, which may be 0, or 0 when end of stream is detected."
available()
, если в качестве файла-источника указать псевдоустройство/dev/random
? Проверил вjshell
- оказалось стабильно возвращает значение0
, хотя до "конца файла" ещё очень далеко ;). Тот же эффект наблюдается и в отношении других псевдоустройств, таких как/dev/urandom
и/dev/null
. Написал небольшой тест: Данный код, также стабильно выдаёт значение0
.FileInputStream
методavailable()
возвратить нуль, при отсутствии доступных без блокировки данных, но до достижения конца файла (или того, что скрывается за соответствующим файловым дескриптором).available()
, так же стабильно возвращает значение0
, при отсутствии каких-либо форс-мажоров.available()
вызывается до обращения к методуread()
. Не говоря уже о том, что методread()
синхронный, и в одном потоке, никак не возможно вызватьavailable()
до завершения работы ранее вызванногоread()
./dev/null
- да. Но, при чтении из/dev/random
или/dev/urandom
, в переменнуюvalue
каждый раз считывается значение случайного байта, которое, в одном из 256 случаев, может оказаться нулём. А вот вызов методаavailable()
при работе с этими файлами, всегда возвращает0
.jshell
, результаты следующие: Размер/dev/random
получаемый с помощью класса File, всегда равен нулю. Методready()
классаFileReader
, так же как и одноимённый метод его базового класса,InputStreamReader
, до первого чтения, возвращает значениеfalse
, а после первого чтения, всегда возвращаетtrue
, хотя методavailable()
нижележащего объекта классаFileInputStream
, продолжает возвращать значение0
. Вероятно это происходит потому, что иFileReader
, иInputStreamReader
буферезируют операции чтения. Неясно, возвратит ли снова методready()
, значениеfalse
, когда буфер будет опустошён. Так как до первого чтения, и соответственно заполнения буфера, возвращалось значениеfalse
, я пологаю это произойдёт и при опустошении буфера, до его следующего заполнения.