Por que usar BufferedInputStream para ler um byte de byte de arquivo mais rápido do que usando FileInputStream?

Eu estava tentando ler um arquivo em uma matriz usando FileInputStream e um arquivo ~ 800 KB levou cerca de 3 segundos para ler na memória. Eu tentei o mesmo código, exceto com o FileInputStream envolto em um BufferedInputStream e levou cerca de 76 milissegundos. Por que ler um byte de byte de arquivo é feito muito mais rápido com um BufferedInputStream, embora eu ainda esteja lendo byte por byte? Aqui está o código (o resto do código é totalmente irrelevante). Note que este é o código "rápido". Você pode simplesmente remover o BufferedInputStream se quiser o 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 é mais de 30 vezes mais rápido. Muito mais que isso. Então, por que isso é possível, e é possível tornar esse código mais eficiente (sem usar nenhuma biblioteca externa)?

questionAnswers(3)

yourAnswerToTheQuestion