FileInputStream уже использует буферы? - PullRequest
6 голосов
/ 14 сентября 2011

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

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

ИЛИ

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

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

Ответы [ 3 ]

7 голосов
/ 14 сентября 2011

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

5 голосов
/ 14 сентября 2011

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

1 голос
/ 14 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...