Чтобы ответить на ваш первый вопрос: Нет. Он считывает размер блока диска в память ядра. Java (и программы, написанные на любом языке) не имеют доступа к этой памяти. Когда вы выполняете необработанное чтение, нет никакой гарантии, что блок, прочитанный системой, останется в памяти или что он останется легко достижимым способом, который впоследствии не будет дорогостоящим. Вот возможный сценарий:
Программа: «Мне нужен байт из этого файла».
ОС: «Загрузка блока 4 КБ из файла. Вот байт из того блока, который вы запросили ».
Программа:« Спасибо. Этот блок мне больше не нужен ».
ОС:« Хорошо. Освободить (или отложить) блок 4 КБ, поскольку он больше никому не нужен ».
…
Программа:« Моему l oop нужен еще один байт из этого файла ».
ОС : «Загрузка блока 4KB из файла. Вот байт из того блока, который вы запросили ».
Программа:« Спасибо. Этот блок мне больше не нужен ».
ОС:« Хорошо. Освободить (или отложить) блок 4 КБ, поскольку он больше никому не нужен ».
et c.
Конечно, я сильно упростил ситуацию. ОС, скорее всего, кэширует прочитанный блок. Но вы не можете узнать, как долго. Может быть, миллисекунды, может быть, много минут, а может, совсем нет.
Это не просто соображение в Java. C долгое время имеет отдельные функции read (2) и fread (3) .
См. Также: Когда и зачем использовать буферизованные потоки ввода и вывода?