java .io и размер блока файловой системы - PullRequest
2 голосов
/ 26 мая 2020

Предположим, что размер блока файловой системы составляет 4 КБ. Насколько я понимаю, это означает, что все операции ввода-вывода будут иметь размер 4 КБ. У меня 2 вопроса:

  1. При использовании java .io API, скажем, FileReader, он не читает каждый раз по одному символу, вместо этого он каждый раз считывает 4 КБ в память. Это правильно?
  2. Если вышесказанное верно, то нет смысла устанавливать размер буфера меньше 4 КБ при использовании чего-то вроде BufferedReader, верно? Потому что, как минимум, мы каждый раз будем извлекать 4 КБ в память.

Спасибо.

1 Ответ

2 голосов
/ 26 мая 2020

Чтобы ответить на ваш первый вопрос: Нет. Он считывает размер блока диска в память ядра. Java (и программы, написанные на любом языке) не имеют доступа к этой памяти. Когда вы выполняете необработанное чтение, нет никакой гарантии, что блок, прочитанный системой, останется в памяти или что он останется легко достижимым способом, который впоследствии не будет дорогостоящим. Вот возможный сценарий:

Программа: «Мне нужен байт из этого файла».
ОС: «Загрузка блока 4 КБ из файла. Вот байт из того блока, который вы запросили ».
Программа:« Спасибо. Этот блок мне больше не нужен ».
ОС:« Хорошо. Освободить (или отложить) блок 4 КБ, поскольку он больше никому не нужен ».

Программа:« Моему l oop нужен еще один байт из этого файла ».
ОС : «Загрузка блока 4KB из файла. Вот байт из того блока, который вы запросили ».
Программа:« Спасибо. Этот блок мне больше не нужен ».
ОС:« Хорошо. Освободить (или отложить) блок 4 КБ, поскольку он больше никому не нужен ».

et c.

Конечно, я сильно упростил ситуацию. ОС, скорее всего, кэширует прочитанный блок. Но вы не можете узнать, как долго. Может быть, миллисекунды, может быть, много минут, а может, совсем нет.

Это не просто соображение в Java. C долгое время имеет отдельные функции read (2) и fread (3) .

См. Также: Когда и зачем использовать буферизованные потоки ввода и вывода?

...