[Java] Scanner contre BufferedReader


Answers

Dans la dernière édition JDK6 / build (b27), le Scanner a un tampon plus petit ( 1024 caractères ) que le BufferedReader ( 8192 caractères ), mais c'est plus que suffisant.

Quant au choix, utilisez le Scanner si vous voulez analyser le fichier, utilisez le BufferedReader si vous voulez lire le fichier ligne par ligne. Voir aussi le texte d'introduction de leurs documentations API ci-dessus.

Question

Pour autant que je sache, les deux méthodes les plus courantes de lecture de données basées sur des caractères à partir d'un fichier Java utilisent Scanner ou BufferedReader . Je sais également que BufferedReader lit les fichiers efficacement en utilisant un tampon pour éviter les opérations sur disque physique. Mes questions sont:

  • Le Scanner fonctionne-t-il aussi bien que BufferedReader ?
  • Pourquoi choisiriez-vous Scanner over BufferedReader ou vice versa?



Il existe différentes façons de prendre des entrées dans Java comme:

1) BufferedReader 2) Scanner 3) Arguments de ligne de commande

BufferedReader Lit le texte à partir d'un flux d'entrée de caractères, en mettant en mémoire tampon les caractères afin de permettre une lecture efficace des caractères, des tableaux et des lignes.

Où Scanner est un simple scanner de texte qui peut analyser les types et les chaînes primitifs à l'aide d'expressions régulières.

si vous écrivez un lecteur de journal simple Le lecteur avec tampon est adéquat. Si vous écrivez un analyseur XML Le scanner est le choix le plus naturel.

Pour plus d'informations, veuillez consulter:

http://java.meritcampus.com/t/240/Bufferedreader?tc=mm69




  1. BufferedReader a une mémoire tampon considérablement plus grande que Scanner. Utilisez BufferedReader si vous souhaitez obtenir des chaînes longues à partir d'un flux et utilisez Scanner si vous souhaitez analyser le type spécifique de jeton d'un flux.

  2. Scanner peut utiliser tokenize en utilisant un délimiteur personnalisé et analyser le flux dans des types de données primitifs, tandis que BufferedReader peut uniquement lire et stocker des chaînes.

  3. BufferedReader est synchrone alors que Scanner ne l'est pas. Utilisez BufferedReader si vous travaillez avec plusieurs threads.

  4. Scanner masque IOException tandis que BufferedReader lance immédiatement.




La réponse ci-dessous est tirée de la lecture de la console: JAVA Scanner vs BufferedReader

Lors de la lecture d'une entrée depuis la console, deux options existent pour y parvenir. D'abord en utilisant Scanner , un autre en utilisant BufferedReader . Les deux ont des caractéristiques différentes. Cela signifie des différences comment l'utiliser.

Scanner traité comme entrée en tant que jeton. BufferedReader lit juste ligne par ligne donnée entrée comme chaîne. Le scanner lui-même fournit des capacités d'analyse comme nextInt (), nextFloat ().

Mais, quelles sont les différences entre les autres?

  • Scanner traité comme entrée en tant que jeton. BufferedReader en tant que ligne de flux / chaîne
  • Scanner entrée donnée token utilisant regex. L'utilisation de BufferedReader doit écrire du code supplémentaire
  • BufferedReader plus rapide que Scanner * point no. 2
  • Le scanner n'est pas synchronisé, BufferedReader synchronisé

Scanner venir avec JDK version 1.5 plus haut.

Quand doit-on utiliser Scanner, ou Buffered Reader?

Regardez les principales différences entre les deux, l'un en utilisant tokenized, d'autres en utilisant la ligne de flux. Lorsque vous avez besoin de capacités d'analyse, utilisez plutôt Scanner. Mais, je suis plus à l'aise avec BufferedReader. Lorsque vous avez besoin de lire depuis un fichier, utilisez BufferedReader, car il s'agit d'un tampon utilisé lors de la lecture d'un fichier. Ou vous pouvez utiliser BufferedReader comme entrée pour Scanner.




Les principales différences

  1. Scanner
  • Un scanner de texte simple qui peut analyser les types et les chaînes primitifs en utilisant des expressions régulières.
  • Un scanner interrompt son entrée en jetons à l'aide d'un modèle de délimiteur, qui correspond par défaut aux espaces. Les jetons résultants peuvent ensuite être convertis en valeurs de différents types en utilisant les diverses méthodes suivantes.

Exemple

 String input = "1 fish 2 fish red fish blue fish";
 Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
 System.out.println(s.nextInt());
 System.out.println(s.nextInt());
 System.out.println(s.next());
 System.out.println(s.next());
 s.close(); 

imprime la sortie suivante:

 1
 2
 red
 blue 

La même sortie peut être générée avec ce code, qui utilise une expression régulière pour analyser les quatre jetons à la fois:

 String input = "1 fish 2 fish red fish blue fish";

 Scanner s = new Scanner(input);
 s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)");
 MatchResult result = s.match();
 for (int i=1; i<=result.groupCount(); i++)
     System.out.println(result.group(i));
 s.close(); `
  1. BufferedReader:

    • Lit le texte à partir d'un flux d'entrée de caractères, en mettant en mémoire tampon les caractères afin de permettre une lecture efficace des caractères, des tableaux et des lignes.

    • La taille de la mémoire tampon peut être spécifiée ou la taille par défaut peut être utilisée. La valeur par défaut est suffisamment grande pour la plupart des cas.

En général, chaque requête de lecture faite d'un lecteur provoque une demande de lecture correspondante du flux de caractères ou de multiplets sous-jacent. Il est donc conseillé d'enrouler un BufferedReader autour de n'importe quel Reader dont les opérations read () peuvent être coûteuses, comme FileReaders et InputStreamReaders. Par exemple,

BufferedReader in
   = new BufferedReader(new FileReader("foo.in"));

mettra en mémoire tampon l'entrée du fichier spécifié. Sans mise en mémoire tampon, chaque invocation de read () ou de readLine () peut entraîner la lecture des octets du fichier, leur conversion en caractères, puis leur renvoi, ce qui peut s'avérer très inefficace. Les programmes qui utilisent DataInputStreams pour la saisie textuelle peuvent être localisés en remplaçant chaque DataInputStream par un BufferedReader approprié.

Source: Lien




La classe Scanner est le complément de la classe Formater (utilisée pour convertir les données binaires en texte formaté). Le scanner lit l'entrée formatée et la convertit en sa forme binaire. Bien qu'il ait toujours été possible de lire des entrées formatées, il a fallu plus d'efforts que la plupart des programmeurs préfèrent. En raison de l'ajout de Scanner, il est maintenant facile de lire tous les types de valeurs numériques, de chaînes et d'autres types de données, qu'ils proviennent d'un fichier disque, du clavier ou d'une autre source. Le scanner peut être utilisé pour lire les entrées de la console, un fichier, une chaîne ou toute autre source qui implémente l'interface Readable ou ReadableByteChannel. Par exemple, vous pouvez utiliser Scanner pour lire un nombre à partir du clavier et affecter sa valeur à une variable.

BufferedReader , d'autre part, est une classe d'E / S de flux de caractères. Les flux de caractères fournissent un moyen pratique d'entrée et de sortie en termes de caractères (Unicode). BufferedReader est principalement utilisé pour prendre des entrées de la console, System.in . Il prend un objet InputStreamReader en argument.




  1. BufferedReader vous donnera probablement de meilleures performances (parce que Scanner est basé sur InputStreamReader, regardez les sources). ups, pour lire des fichiers, il utilise nio. Lorsque j'ai testé les performances de nio par rapport aux performances de BufferedReader pour les gros fichiers, nio affiche une performance un peu meilleure.
  2. Pour lire à partir du fichier, essayez Apache Commons IO.





Links