web-dev-qa-db-fra.com

Scanner vs BufferedReader

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 dans Java consiste à utiliser Scanner ou BufferedReader. Je sais aussi que le BufferedReader lit efficacement les fichiers en utilisant un tampon pour éviter les opérations de disque physique. Mes questions sont:

  • Est-ce que Scanner fonctionne aussi bien que BufferedReader?
  • Pourquoi choisiriez-vous Scanner par rapport à BufferedReader ou inversement?
262
Mads Mobæk

Scanner est utilisé pour analyser des jetons à partir du contenu du flux, tandis que BufferedReader ne fait que lire le flux et ne procède à aucune analyse particulière.

En fait, vous pouvez passer un BufferedReader à un scanner en tant que source de caractères à analyser.

191
Chandra Sekar

Dans la dernière version/compilation de JDK6 (b27), la Scanner a un tampon plus petit ( 1024 caractères ) par opposition à BufferedReader ( 8192 caractères ), mais c'est plus que suffisant.

Pour le choix, utilisez Scanner si vous voulez analyser le fichier, utilisez BufferedReader si vous voulez lisez le fichier ligne par ligne. Voir également le texte d'introduction de leurs documentations API susmentionnées.

  • Analyse = interprétation de l'entrée donnée en tant que jetons (parties). Il est capable de vous restituer des parties spécifiques directement en tant que int, chaîne, décimal, etc. Voir aussi toutes ces méthodes nextXxx() dans la classe Scanner.
  • Lecture = diffusion en continu. Il continue à vous rendre tous les caractères, que vous devez à leur tour vérifier manuellement si vous souhaitez faire correspondre ou composer quelque chose d'utile. Mais si vous n’avez pas besoin de le faire de toute façon, la lecture suffit.
171
BalusC

Voir ceci lien , voici ce qui est cité:

BufferedReader est une classe simple destinée à lire efficacement à partir du flux sous-jacent. Généralement, chaque demande de lecture faite par un Lecteur comme un FileReader entraîne l'envoi d'une demande de lecture correspondante au flux sous-jacent. Chaque appel de read () ou de readLine () peut provoquer la lecture d'octets dans le fichier, la conversion en caractères, puis la restitution, ce qui peut s'avérer très inefficace. L'efficacité est sensiblement améliorée si un lecteur est déformé dans un lecteur BufferedReader.

BufferedReader étant synchronisé, les opérations de lecture sur BufferedReader peuvent être effectuées en toute sécurité à partir de plusieurs threads.

Un scanner, par contre, contient beaucoup plus de fromage; il peut faire tout ce qu'un BufferedReader peut faire et avec le même niveau d'efficacité. Cependant, un scanner peut également analyser le flux sous-jacent pour les types primitifs et les chaînes à l'aide d'expressions régulières. Il peut également segmenter le flux sous-jacent avec le délimiteur de votre choix. Il peut également effectuer une analyse en aval du flux sous-jacent en ignorant le délimiteur!

Cependant, un scanner n’est pas thread-safe, il doit être synchronisé en externe.

Le choix d'utiliser 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. Toutefois, si vous écrivez un analyseur XML, le scanner est le choix le plus naturel.

Même en lisant l'entrée, si vous voulez accepter une entrée utilisateur ligne par ligne et dire simplement de l'ajouter à un fichier, un BufferedReader est suffisant. D'autre part, si vous souhaitez accepter les entrées utilisateur en tant que commande avec plusieurs options, puis envisagez d'effectuer différentes opérations en fonction de la commande et des options spécifiées, un scanner conviendra mieux.

77
Jomoos
  1. BufferedReader dispose d'une mémoire tampon beaucoup plus grande que Scanner. Utilisez BufferedReader si vous souhaitez obtenir de longues chaînes d'un flux et utilisez Scanner si vous souhaitez analyser un type spécifique de jeton à partir d'un flux.

  2. Scanner peut utiliser tokenize à l'aide d'un délimiteur personnalisé et analyser le flux en types de données primitifs, tandis que BufferedReader ne peut lire et stocker que String.

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

  4. Scanner masque l'IOException alors que BufferedReader le jette immédiatement.

38
Sujith PS

Je suggère d'utiliser BufferedReader pour lire du texte. Scanner cache IOException pendant que BufferedReader le lance immédiatement.

17
Evgeniy

La différence entre BufferedReader et Scanner est la suivante:

  1. BufferedReader est synchronized mais le scanner est non synchronisé.
  2. BufferedReader est thread-safe mais le scanner est pas thread-safe.
  3. BufferedReader a une mémoire tampon plus grande mais Scanner a une mémoire tampon plus petite.
  4. BufferedReader est plus rapide mais le scanner est plus lent dans l'exécution.
  5. Code pour lire une ligne depuis la console:

    BufferedReader:

     InputStreamReader isr=new InputStreamReader(System.in);
     BufferedReader br= new BufferedReader(isr);
     String st= br.readLine();
    

    Scanner:

    Scanner sc= new Scanner(System.in);
    String st= sc.nextLine();
    
9
Raman Gupta

Voici les différences entre BufferedReader et Scanner.

  1. BufferedReader ne lit que les données mais analyse également les données.
  2. vous pouvez uniquement lire String à l'aide de BufferedReader, mais vous pouvez lire int, long ou float à l'aide de Scanner.
  3. BufferedReader est plus ancien que Scanner, il existe depuis jdk 1.1 alors que Scanner a été ajouté à la version JDK 5.
  4. La taille de la mémoire tampon de BufferedReader est importante (8 Ko) par rapport à 1 Ko de scanner.
  5. BufferedReader est plus approprié pour lire un fichier avec une longue chaîne, tandis que Scanner est plus approprié pour lire une petite entrée utilisateur à partir de la commande Invite.
  6. BufferedReader est synchronisé, contrairement à Scanner, ce qui signifie que vous ne pouvez pas partager Scanner entre plusieurs threads.
  7. BufferedReader est plus rapide que Scanner car il ne prend pas de temps à analyser
  8. BufferedReader est un peu plus rapide que Scanner
  9. BufferedReader provient du package Java.io et Scanner du package Java.util en fonction des points que nous pouvons sélectionner.

Merci

7
dhS

Les principales différences:

  1. Scanner

  • Un scanner de texte simple capable d'analyser des types primitifs et des chaînes à l'aide d'expressions régulières.
  • Un scanneur coupe son entrée en jetons à l'aide d'un motif de délimiteur, qui correspond par défaut aux espaces. Les jetons résultants peuvent ensuite être convertis en valeurs de types différents en utilisant les différentes 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 d'un flux de saisie de caractères, en mettant en mémoire tampon les caractères de manière à 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 suffisante pour la plupart des cas.

En général, chaque demande de lecture faite par un Lecteur provoque la demande de lecture correspondante du flux de caractères ou d'octets sous-jacent. Il est donc conseillé d’enrouler un BufferedReader autour de tout Reader dont les opérations read () peuvent être coûteuses, telles que 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 appel de read () ou de readLine () peut provoquer la lecture d'octets dans le fichier, la conversion en caractères, puis le renvoi, ce qui peut s'avérer très inefficace. Les programmes qui utilisent DataInputStreams pour la saisie de texte peuvent être localisés en remplaçant chaque DataInputStream par un BufferedReader approprié.

Source: Lien

Il y a différentes manières de prendre une entrée dans Java comme:

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

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

Where Scanner est un scanner de texte simple capable d'analyser des types primitifs et des chaînes à l'aide d'expressions régulières.

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

Pour plus d'informations s'il vous plaît se référer:

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

3

La réponse ci-dessous provient de Lecture à partir de la console: Java Scanner vs BufferedReader

Lorsque vous lisez une entrée de la console, il existe deux options pour y parvenir. D'abord en utilisant Scanner, une autre en utilisant BufferedReader. Les deux ont des caractéristiques différentes. Cela signifie des différences comment l'utiliser.

Le scanner a traité l’entrée donnée comme un jeton. BufferedReader lit simplement ligne par ligne les données saisies sous forme de chaîne. Scanner il auto-fournir des capacités d'analyse tout comme nextInt (), nextFloat ().

Mais, quelles sont les autres différences entre?

  • Le scanner a traité l’entrée donnée comme un jeton. BufferedReader en tant que ligne de flux/String
  • Scanner numérisé avec entrée en utilisant regex. Utiliser BufferedReader doit écrire du code supplémentaire
  • BufferedReader plus rapide que Scanner * point no. 2
  • Le scanner n'est pas synchronisé, BufferedReader est synchronisé

Le scanner est livré avec JDK version 1.5 supérieure.

Quand faut-il utiliser un scanner ou un lecteur à mémoire tampon?

Examinez les principales différences entre les deux, l’une utilisant l’utilisation de jetons, l’autre utilisant la ligne de flux. Lorsque vous avez besoin de fonctionnalités d'analyse, utilisez plutôt Scanner. Mais, je suis plus à l'aise avec BufferedReader. Lorsque vous avez besoin de lire à partir d’un fichier, utilisez BufferedReader, car il utilise le tampon lors de la lecture d’un fichier. Ou vous pouvez utiliser BufferedReader comme entrée dans Scanner.

1
KNU

Je préfère Scanner car il ne jette pas les exceptions vérifiées et, par conséquent, son utilisation a pour résultat un code plus simple.

0
thisismydesign
  1. BufferedReader vous donnera probablement de meilleures performances (car Scanner est basé sur InputStreamReader, sources de recherche). ups, pour lire à partir de fichiers, il utilise nio. Lorsque j'ai testé les performances de nio par rapport aux performances de BufferedReader pour les gros fichiers, nio affiche des performances légèrement meilleures.
  2. Pour lire un fichier, essayez Apache Commons IO.
0
Roman