Un BufferedReader est une classe simple destinée à lire efficacement à partir du flux sous-jacent. Généralement, chaque demande de lecture faite d'un Reader comme un FileReader provoque une demande de lecture correspondante à effectuer au flux sous-jacent. Chaque appel de read () ou readLine () peut entraîner la lecture d'octets dans le fichier, leur conversion en caractères, puis leur renvoi, ce qui peut être très inefficace. L'efficacité est sensiblement améliorée si un Reader est déformé dans un BufferedReader.
BufferedReader est synchronisé, donc les opérations de lecture sur un BufferedReader peuvent être effectuées en toute sécurité à partir de plusieurs threads.
Un scanner, d'autre part, contient beaucoup plus de fromage; il peut faire tout ce qu'un BufferedReader peut faire et au même niveau d'efficacité. Cependant, en plus, un scanner peut analyser le flux sous-jacent pour les types et chaînes primitifs à l'aide d'expressions régulières. Il peut également symboliser le flux sous-jacent avec le délimiteur de votre choix. Il peut également effectuer un balayage direct du flux sous-jacent sans tenir compte du délimiteur!
Un scanner n'est cependant pas sûr pour les threads, il doit être synchronisé en externe.
Le choix d'utiliser un BufferedReader ou un Scanner dépend du code que vous écrivez, si vous écrivez un simple lecteur de journaux Le lecteur tamponné est adéquat. Cependant, si vous écrivez un analyseur XML, c'est le choix le plus naturel.
Même en lisant l'entrée, si vous voulez accepter l'entrée utilisateur ligne par ligne et dire simplement l'ajouter à un fichier, un BufferedReader est assez bon. D'un autre côté, si vous souhaitez accepter une entrée utilisateur en tant que commande avec plusieurs options, et que vous souhaitez ensuite effectuer différentes opérations en fonction de la commande et des options spécifiées, un scanner conviendra mieux.