Я прочитал этот вопрос: Почему использование BufferedInputStream для чтения байта файла за байтом быстрее, чем с помощью FileInputStream? Согласно автору BufferedInputStream(BIS)
быстрее, чем FileInputStream(FIS)
, потому что когда метод read()
вызывается вFileInputStream
он всегда выполняет системный вызов с использованием собственного API для извлечения одного байта, в то время как BufferedInputStream
делает то же самое, но для этого требуется фрагмент байтов из ОС и сохраняет их в локальном поле с именем buf
, которое объявлено внутри класса BIS изатем, когда read()
вызывается BIS, возвращается байт из массива buf
.
Я просмотрел код BIS, в частности метод read()
, и мне не ясно, когда это произойдет, когда BIS требуеткусок байтов вместо одного. Метод read()
сначала проверяет if (pos >= count)
Если это так, он вызывает метод fill()
, который сначала проверяет, что buf не заполнен, если у buf есть место, тогда вызывается метод InputStream public int read(byte b[], int off, int len)
, где b [] - наш буфер, а внутриэтот метод мы можем видеть, что он делает системные вызовы внутри цикла, который равен len
param.
for (; i < len ; i++) {
c = read();
Я что-то пропустил, или оба класса BIS и FIS будут выполнять одинаковое количество системных вызовов для получения каждого байта отдельно?