Здравствуйте! Хотелось бы выяснить у опытных товарищей следующий момент:
Часто вижу, что для проверки достижения конца файла, используют метод 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, я пологаю это произойдёт и при опустошении буфера, до его следующего заполнения.