¿Por qué es más rápido usar BufferedInputStream para leer un byte a byte de un archivo que usar FileInputStream?

Estaba intentando leer un archivo en una matriz utilizando FileInputStream, y un archivo de ~ 800 KB tardó unos 3 segundos en leer en la memoria. Luego intenté el mismo código, excepto con el FileInputStream envuelto en un BufferedInputStream y tomó cerca de 76 milisegundos. ¿Por qué es mucho más rápido leer un byte a byte de archivo con un BufferedInputStream aunque todavía lo estoy leyendo byte por byte? Aquí está el código (el resto del código es totalmente irrelevante). Tenga en cuenta que este es el código "rápido". Solo puedes eliminar el BufferedInputStream si quieres el código "lento":

InputStream is = null;

    try {
        is = new BufferedInputStream(new FileInputStream(file));

        int[] fileArr = new int[(int) file.length()];

        for (int i = 0, temp = 0; (temp = is.read()) != -1; i++) {
            fileArr[i] = temp;
        }

BufferedInputStream es más de 30 veces más rápido. Mucho más que eso. Entonces, ¿por qué es esto y es posible hacer que este código sea más eficiente (sin usar bibliotecas externas)?

Respuestas a la pregunta(3)

Su respuesta a la pregunta