java file - Scanner contre BufferedReader





file-io java.util.scanner (13)


Je préfère Scanner car il ne lance pas d'exceptions vérifiées et, par conséquent, son utilisation se traduit par un code plus simple.

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?



  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.



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.




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




  • BufferedReader est synchrone alors que Scanner ne l'est pas.
  • BufferedReader devrait être utilisé si nous travaillons avec plusieurs threads.
  • BufferedReader a une mémoire tampon considérablement plus grande que Scanner .
  • Le Scanner a un peu de tampon (1 Ko tampon de caractères) par opposition à BufferedReader (tampon de 8 Ko octets), mais c'est plus que suffisant.
  • BufferedReader est un peu plus rapide que Scanner parce que Scanner analyse les données d'entrée et que BufferedReader lit simplement la séquence de caractères.

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




  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.




Voir ce link , le link suivant est cité:

Un BufferedReader est une classe simple destinée à lire efficacement à partir du flux underling. Généralement, chaque requête de lecture faite d'un lecteur comme un FileReader provoque une requête de lecture correspondante au flux sous-jacent. Chaque invocation de read () ou 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. L'efficacité est sensiblement améliorée si un Reader est déformé dans un BufferedReader.

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

D'un autre côté, un scanner contient beaucoup plus de fromage. il peut faire tout ce qu'un BufferedReader peut faire et au même niveau d'efficacité. Cependant, un scanner peut analyser le flux sous-jacent pour les types et les chaînes primitifs en utilisant des expressions régulières. Il peut également marquer le flux sous-jacent avec le délimiteur de votre choix. Il peut également faire un balayage en avant du flux sous-jacent sans tenir compte du délimiteur!

Un scanner n'est cependant pas sécurisé, il doit être synchronisé de l'extérieur.

Le choix d'utiliser un BufferedReader ou un Scanner dépend du code que vous écrivez, si vous écrivez un simple lecteur de journal. Le lecteur avec tampon est adéquat. Cependant, 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 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 voulez accepter l'entrée de l'utilisateur comme une commande avec plusieurs options, et que vous avez l'intention d'effectuer différentes opérations en fonction de la commande et des options spécifiées, un scanner fonctionnera mieux.




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

  1. BufferedReader est synchronisé mais Scanner n'est pas synchronisé .
  2. BufferedReader est thread-safe, mais Scanner n'est pas thread-safe .
  3. BufferedReader a une plus grande mémoire tampon mais Scanner a une mémoire tampon plus petite .
  4. BufferedReader est plus rapide mais l' exécution du scanner est plus lente .
  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();
    



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




Liste de quelques ...

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

Java.io.BufferedReader classe Java.io.BufferedReader lit le texte à partir d'un flux d'entrée de caractères, Java.io.BufferedReader mémoire tampon les caractères afin de permettre une lecture efficace de la séquence de caractères

1) BufferedReader est synchrone alors que Scanner ne l'est pas. BufferedReader devrait être utilisé si nous travaillons avec plusieurs threads.

2) BufferedReader a une mémoire tampon considérablement plus grande que Scanner . Le Scanner a un peu de tampon (1 Ko tampon de caractères) par opposition à BufferedReader (tampon de 8 Ko octets), mais c'est plus que suffisant.

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




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.




Voici la création d'un ComboBox ajoutant un écouteur pour la modification de sélection d'élément:

    JComboBox comboBox = new JComboBox();

    comboBox.setBounds(84, 45, 150, 20);
    contentPane.add(comboBox);

    JComboBox comboBox_1 = new JComboBox();
    comboBox_1.setBounds(84, 97, 150, 20);
    contentPane.add(comboBox_1);
    comboBox.addItemListener(new ItemListener() {
        public void itemStateChanged(ItemEvent arg0) {
            //Do Something
        }
    });
}






java file-io java.util.scanner bufferedreader