FileInputStream уже использует буферы?

Когда я использую FileInputStream для чтения объекта (скажем, нескольких байтов), включает ли базовая операция:

1) Чтение всего блока диска, чтобы, если я впоследствии выполняю другую операцию чтения, не требовалось чтение реального диска, поскольку эта часть файла уже была извлечена в последней операции чтения?

OR

2) Новый доступ к диску должен иметь место, потому что FileInputStream не выполняет никакой буферизации, а вместо этого следует использовать bufferedInputStream для достижения эффекта (1)?

Я думаю, что поскольку FileInputStream использует системный вызов чтения и читает только набор страниц с жесткого диска, должна иметь место некоторая буферизация.


person AnkurVj    schedule 14.09.2011    source источник
comment
Я недостаточно знаю базовый ввод-вывод ОС, чтобы ответить, но буферизация — не единственная причина избегать множественных вызовов. Каждая операция чтения также включает в себя вызов собственного метода, который имеет некоторые накладные расходы. Таким образом, также полезно уменьшить количество вызовов нативных методов.   -  person JB Nizet    schedule 14.09.2011
comment
Попробуйте простой тест. вы, вероятно, заметили улучшение.   -  person Lynch    schedule 14.09.2011


Ответы (3)


FileInputStream выполнит основной системный вызов. Большинство операционных систем для этого выполняют собственную буферизацию. Таким образом, для каждого байта не требуется настоящий поиск по диску. Но, тем не менее, у вас есть затраты на вызов собственной ОС, что дорого. Так что BufferedStream был бы предпочтительнее. Однако для чтения небольших объемов данных (как вы говорите, несколько байтов или даже килобайт) любой из них должен подойти, поскольку количество вызовов ОС не будет таким уж другим.

person Hari Menon    schedule 14.09.2011

Собственный код для FileInputStream находится здесь: не похоже, что там происходит какая-либо буферизация. Буферизация ОС может сработать, но явного индикатора так или иначе нет, если/когда это произойдет.

person Femi    schedule 14.09.2011
comment
Спасибо за ссылку на кодер. Вроде L65 и L70 актуальны. Знаете ли вы, где реализован метод readSingle(). Это не системный вызов. - person Heinrich Hartmann; 23.10.2014

Одна вещь, на которую следует обратить внимание, — это чтение с подключенного сетевого тома через медленное соединение. Я столкнулся с большой проблемой производительности, используя для этого небуферизованный FileInputStream. В разработке не поймал, т.к. файловая система локальная.

person Sam Barnum    schedule 14.09.2011