Scanner vs. BufferedReader

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

  • Ne Scanner fonctionne aussi bien que les BufferedReader ?
  • Pourquoi choisir Scanner plutôt que BufferedReader ou vice versa?
245
demandé sur Vladimir Vagaytsev 2010-02-09 21:17:22

15 réponses

Scanner est utilisé pour séparer les jetons du contenu du flux tandis que BufferedReader lit simplement le flux et ne fait pas d'analyse spéciale.

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

181
répondu Chandra Sekar S 2016-10-22 15:41:54

dans le dernier JDK6 release/build (b27), le Scanner a un tampon plus petit ( 1024 chars ) par opposition au BufferedReader ( 8192 ), mais c'est plus que suffisant.

les choix, de l'utilisation de la Scanner si vous voulez analyser le fichier, utilisez le BufferedReader si vous voulez lire l' fichier ligne par ligne. Voir aussi le texte d'introduction de leurs documentations API susmentionnées.

  • Parsing = interprétation de l'entrée donnée en tant que tokens (parts). Il est capable de vous rendre des parties spécifiques directement comme int, string, décimal, etc. Voir aussi toutes les méthodes nextXxx() de la classe Scanner .
  • Reading = muet streaming. Il redonne-vous tous les personnages, qui vous devez à votre tour inspecter manuellement si vous souhaitez correspondre ou composer quelque chose d'utile. Mais si vous n'avez pas besoin de faire cela de toute façon, alors la lecture est suffisante.
157
répondu BalusC 2018-05-25 00:58:15

voir ce lien , suivant est cité de là:

un lecteur tampon est une classe simple destinée à lire efficacement à partir de la sous-fifre de flux. Généralement, chaque demande de lecture faite d'un Lecteur comme un FileReader fait en sorte qu'une requête de lecture correspondante soit envoyée à flux sous-jacent. Chaque invocation de read() ou readLine () pourrait faire lire les octets à partir du fichier, les convertir en caractères, et ensuite retourné, ce qui peut être très inefficace. Amélioration de l'efficacité de de façon appréciable si un lecteur est déformé dans un lecteur tampon.

BufferedReader est synchronisé, donc lire les opérations sur un BufferedReader peut être fait en toute sécurité à partir de plusieurs threads.

d'Un scanner, d'autre part, a beaucoup plus de fromage construit; c' peut faire tout ce qu'un BufferedReader peut faire et au même niveau de l'efficacité ainsi. Cependant, en plus D'un Scanner peut analyser flux sous-jacent pour les types primitifs et les chaînes en utilisant régulier expression. Il peut aussi marquer le flux sous-jacent avec le caractère de votre choix. Il peut également faire balayage vers l'avant de la flux sous-jacent négligeant le délimiteur!

un scanner cependant n'est pas sûr de fil, il doit être extérieurement synchronis.

le choix d'utiliser un lecteur tampon ou un Scanner dépend du code vous écrivez, si vous écrivez un simple lecteur de log tamponné lecteur adéquat. Cependant, si vous écrivez un Scanner XML parser est la plus naturelle.

même en lisant l'entrée, si vous voulez accepter la ligne d'entrée de l'utilisateur par ligne et de dire il suffit de l'ajouter à un fichier, un BufferedReader est assez bon. D'autre part, si vous voulez accepter la saisie de l'utilisateur comme une commande avec de multiples options, puis l'intention d'effectuer différentes opérations en fonction de la commande et des options spécifiées, un Le Scanner conviendra mieux.

75
répondu Jomoos 2012-07-25 11:02:08
  1. BufferedReader a une mémoire tampon beaucoup plus grande que le Scanner. Utiliser BufferedReader si vous voulez obtenir de longues chaînes à partir d'un flux, et l'utilisation Scanner si vous voulez analyser spécifiques type de jeton à partir d'un flux.

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

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

  4. Scanner cache une exception tandis que BufferedReader la lance immédiatement.

35
répondu Sujith PS 2016-10-01 08:18:11

je suggère d'utiliser BufferedReader pour lire le texte. Scanner cache IOException alors que BufferedReader le jette immédiatement.

17
répondu Evgeniy 2017-09-12 07:18:30
  • BufferedReader est synchrone tandis que Scanner ne l'est pas.
  • BufferedReader devrait être utilisé si nous travaillons avec plusieurs threads.
  • BufferedReader a une mémoire tampon beaucoup plus grande que Scanner .
  • le Scanner a un petit tampon (1KB tampon char) par opposition au BufferedReader (8KB byte buffer), mais c'est plus qu'assez.
  • BufferedReader est un peu plus rapide que Scanner parce que Scanner est-ce que l'analyse des données d'entrée et BufferedReader lit simplement la séquence des personnages.

========================================================================

10
répondu jsroyal 2017-09-12 07:10:15

la classe Scanner est le complément de la classe Formater (utilisé pour convertir des données binaires en texte formaté). Le Scanner lit l'entrée formatée et la convertit dans sa forme binaire. Bien qu'il ait toujours été possible de lire des entrées formatées, cela a exigé plus d'effort que la plupart des programmeurs préféreraient. En raison de l'ajout de Scanner, il est maintenant facile de lire tous les types de valeurs numériques, des chaînes et d'autres types de données, si elle vient à partir d'un fichier du disque, du clavier ou d'une autre source. Scanner peut être utilisé pour lire l'entrée de la console, un fichier, une chaîne de caractères, ou toute autre source qui met en œuvre l'interface lisible ou ReadableByteChannel. Par exemple, vous pouvez utiliser le Scanner pour lire un nombre du clavier et assigner sa valeur à une variable.

BufferedReader , d'autre part, est un jeu de caractères classe I/O. Flux de caractères constituent un moyen pratique pour l'entrée et la sortie termes de caractères (Unicode). BufferedReader est principalement utilisé pour la prise d'entrée de la console, System.in . Il prend comme argument un objet InputStreamReader .

7
répondu UrsinusTheStrong 2015-05-14 03:37:27

Les Principales Différences:

  1. Scanner

  • un scanner de texte simple qui peut analyser les types primitifs et les chaînes en utilisant des expressions régulières.
  • un Scanner brise ses entrées en jetons en utilisant un motif de délimiteur, qui par défaut correspond à des espaces. Les tokens résultants peuvent alors être convertis en valeurs de différents types 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 du texte à partir d'un flux de caractères, en tamponnant les caractères de manière à permettre une lecture efficace des caractères, des tableaux et des lignes.

    • la taille du tampon peut être spécifiée, ou la taille par défaut peut être utilisée. La valeur par défaut est assez grand pour la plupart des besoins.

en général, chaque lire la demande faite d'un lecteur causes une requête de lecture correspondante doit être faite du caractère sous-jacent ou du flux d'octets. Il est donc conseillé d'entourer un lecteur BufferedReader de N'importe quel lecteur dont les opérations read() peuvent être coûteuses, telles que FileReaders et InputStreamReaders. Par exemple,

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

va amortir l'entrée à partir du fichier spécifié. Sans buffering, chaque invocation de read () ou readLine () pourrait faire lire des octets à partir du fichier, converti en caractères, puis retourné, ce qui peut être très inefficace. Les programmes qui utilisent Dataainputstream pour des entrées textuelles peuvent être localisés en remplaçant chaque Dataainputstream par un BufferedReader approprié.

Source: Lien

6
répondu Shivanandam Sirmarigari 2017-01-22 03:28:50

ci-dessous les différences entre le BufferedReader et le Scanner

  1. BufferedReader ne lit que les données, mais le scanner analyse aussi les données.
  2. vous ne pouvez lire la chaîne qu'en utilisant BufferedReader, mais vous pouvez lire int, long ou flottant à L'aide D'un Scanner.
  3. BufferedReader est plus ancien de Scanner,il existe de JDK 1.1 tandis que Le Scanner a été ajouté sur la version JDK 5.
  4. la taille de tampon de BufferedReader est grande (8KB) par rapport à 1KB de Scanner.
  5. BufferedReader est plus approprié pour la lecture de fichier avec une longue chaîne de caractères tandis que le Scanner est plus approprié pour lire la petite entrée d'utilisateur de l'invite de commande.
  6. BufferedReader est synchronisé mais pas le Scanner, ce qui signifie que vous ne peut pas partager le Scanner entre plusieurs threads.
  7. BufferedReader est plus rapide que le Scanner parce qu'il ne passe pas de temps sur l'analyse
  8. BufferedReader est un peu plus rapide que le Scanner
  9. BufferedReader est de java.le paquet io et le Scanner sont de java.package util sur la base des points, nous pouvons choisir notre choix.

Merci

6
répondu dhS 2017-03-14 07:44:24

différence entre BufferedReader et Scanner sont les suivants:

  1. BufferedReader est synchronisé mais le Scanner est "151930920 non synchronisé .
  2. BufferedReader est thread-safe mais le Scanner est "151930920 pas" thread-safe .
  3. BufferedReader a un plus grand tampon mémoire mais le Scanner a une mémoire tampon plus petite .
  4. BufferedReader est plus vite mais le Scanner est plus lent dans l'exécution .
  5. Code pour lire une ligne de 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();
    
5
répondu Raman Gupta 2017-10-01 08:52:02

il y a différentes façons de prendre des entrées en java comme:

1) BufferedReader 2) Scanner 3) Arguments En Ligne De Commande

BufferedReader Lire le texte de caractère-flux d'entrée, de mise en mémoire tampon de caractères de manière à fournir pour l'efficacité de la lecture des caractères, des tableaux, et des lignes.

où Scanner est un scanner de texte simple qui peut analyser les types primitifs et les chaînes en utilisant des expressions régulières.

si vous écrivez un lecteur de journal simple tampon lecteur est adéquat. si vous écrivez un Scanner Parser XML est le choix le plus naturel.

pour de plus amples renseignements, veuillez consulter:

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

3
répondu manisha mulchandani 2015-06-18 16:12:34

la réponse ci-dessous est tirée de lecture de la Console: Java Scanner vs BufferedReader

lorsqu'on lit une entrée depuis la console, il existe deux options pour y arriver. D'abord en utilisant Scanner , un autre en utilisant BufferedReader . Deux d'entre eux ont des caractéristiques différentes. Cela signifie différences comment l'utiliser.

Scanner traité donnée entrée comme token. BufferedReader vient de lire ligne par ligne donnée en 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é entrée donnée comme token. BufferedReader stream line/Chaîne
  • Scanner tokenized entrée donnée en utilisant regex. Utilisation de BufferedReader doit écrire le code supplémentaire
  • BufferedReader plus rapide qu'un Scanner *pas de point. 2
  • Scanner n'est pas synchronisé, BufferedReader synchronisé

Scanner disponible depuis la version 1.5 supérieure de JDK.

quand utiliser un Scanner ou un lecteur tamponné?

regardez les principales différences entre les deux, Une utilisant tokenized, d'autres utilisant stream line. Lorsque vous avez besoin de capacités d'analyse, utilisez le Scanner à la place. Mais je suis plus à l'aise avec BufferedReader. Quand vous avez besoin de lire un fichier, utilisez BufferedReader, parce que c'est utiliser buffer quand lire un fichier. Ou vous pouvez utiliser BufferedReader comme entrée au Scanner.

1
répondu KNU 2014-03-01 09:34:26

Liste de quelques-uns...

java.util.Scanner class est un scanner de texte simple qui peut analyser les types primitifs et les chaînes. Il utilise en interne des expressions régulières pour lire différents types.

Java.io.BufferedReader de la classe lit le texte à partir d'un personnage-flux d'entrée, de mise en mémoire tampon de caractères de manière à fournir pour l'efficacité de la lecture de la séquence de caractères

1) BufferedReader est synchrone Scanner n'est pas. BufferedReader doit être utilisé si nous travaillons avec plusieurs threads.

2) BufferedReader a une mémoire tampon beaucoup plus grande que Scanner . Le Scanner a un petit buffer (1KB char buffer) par opposition au BufferedReader (8KB byte buffer), mais il est plus que suffisant.

3) BufferedReader est un peu plus rapide par rapport à Scanner parce que Scanner fait l'analyse des données d'entrée et BufferedReader lit simplement la séquence de caractères.

1
répondu roottraveller 2016-10-06 13:07:10
  1. BufferedReader vous donnera probablement de meilleures performances (parce que le Scanner est basé sur InputStreamReader, regarder des sources). ups, pour la lecture de fichiers il utilise nio. Quand j'ai testé les performances nio par rapport aux performances BufferedReader pour les gros fichiers, nio montre une meilleure performance.
  2. Pour de la lecture du fichier d'essayer d'Apache Commons IO.
0
répondu Roman 2010-02-09 18:22:09

je préfère Scanner parce qu'il ne jette pas les exceptions vérifiées et donc son utilisation résulte en un code plus rationalisé.

0
répondu thisismydesign 2016-11-28 12:40:03