Как BufferedInputStream запрашивает данные порциями из ОС - PullRequest
1 голос
/ 21 ноября 2019

Я прочитал этот вопрос: Почему использование 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 будут выполнять одинаковое количество системных вызовов для получения каждого байта отдельно?

...