Pourquoi les performances de BufferedReader sont-elles si pires que BufferedInputStream?

Je comprends que l'utilisation d'un BufferedReader (emballage d'un FileReader) va être beaucoup plus lent que d'utiliser un BufferedInputStream (emballage d'un FileInputStream), parce que les premières octets doivent être converties en caractères. Mais je ne comprends pas pourquoi il est beaucoup plus lent! Voici les deux exemples de code que j'utilise:

BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(filename));
try {
  byte[] byteBuffer = new byte[bufferSize];
  int numberOfBytes;
  do {
    numberOfBytes = inputStream.read(byteBuffer, 0, bufferSize);
  } while (numberOfBytes >= 0);
}
finally {
  inputStream.close();
}

et:

BufferedReader reader = new BufferedReader(new FileReader(filename), bufferSize);
try {
  char[] charBuffer = new char[bufferSize];
  int numberOfChars;
  do {
    numberOfChars = reader.read(charBuffer, 0, bufferSize);
  } while (numberOfChars >= 0);
}
finally {
  reader.close();
}

J'ai essayé de tests à l'aide de différentes tailles de mémoire tampon, le tout avec un 150 mégaoctets de fichiers. Voici les résultats (taille de la mémoire tampon est en octets; les horaires sont en millisecondes):

Buffer   Input
  Size  Stream  Reader
 4,096    145     497
 8,192    125     465
16,384     95     515
32,768     74     506
65,536     64     531

Comme peut être vu, le temps le plus rapide pour la BufferedInputStream (64 ms) est sept fois plus vite que le temps le plus rapide pour le BufferedReader (465 ms). Comme je l'ai dit ci-dessus, je n'ai pas de problème avec une différence significative; mais cette différence semble tout à fait déraisonnable.

Ma question est: quelqu'un aurait-il une suggestion pour améliorer les performances de la BufferedReader, ou un autre mécanisme?

source d'informationauteur Andy King