Scanner vs BufferedReader
-
19-09-2019 - |
Question
En ce que je sais, les deux méthodes les plus courantes de la lecture des données basées sur des caractères d'un fichier en Java en utilisant Scanner
ou BufferedReader
. Je sais aussi que les fichiers lire BufferedReader
efficacement en utilisant un tampon pour éviter les opérations de disque physique. Mes questions sont les suivantes:
- Est-ce que
Scanner
fonctionne aussi bien queBufferedReader
? - Pourquoi choisir
Scanner
surBufferedReader
ou vice versa?
La solution
Scanner
est utilisé pour l'analyse des jetons à partir du contenu du flux en BufferedReader
lit juste le cours d'eau et ne fait aucune analyse particulière.
En fait, vous pouvez passer un BufferedReader
à un scanner
comme source de caractères pour analyser.
Autres conseils
Dans le moment dernière version / build JDK6 (B27), le Scanner
a un plus petit tampon ( 1024 caractères ) par opposition à la BufferedReader
( 8192 caractères ), mais il est plus que suffisant.
En ce qui concerne le choix, utilisez le Scanner
si vous voulez parse le fichier, utilisez le BufferedReader
si vous voulez lire la ligne de fichiers en ligne. Voir aussi le texte d'introduction de leurs API aforelinked documentation.
- analyse syntaxique = interpréter l'entrée donné que les jetons (pièces). Il est capable de vous redonner des parties spécifiques directement int, string, décimal, etc. Voir aussi toutes ces méthodes de
nextXxx()
en classeScanner
. - Lecture = le streaming muet. Il ne cesse de vous redonner tous les personnages qui vous doivent à leur tour inspecter manuellement si vous souhaitez correspondre ou composer quelque chose d'utile. Mais si vous n'avez pas besoin de le faire de toute façon, alors la lecture est suffisante.
Voir ce lien , suivant est cité à partir de là:
A BufferedReader est une classe simple destiné à lire efficacement de la flux sous-fifre. En général, chaque demande de lecture faite d'un lecteur comme un FileReader fait une demande de lecture correspondant à apporter à flux sous-jacent. Chaque appel de lecture () ou readLine () pourrait la cause octets à lire à partir du fichier, converti en caractères, et puis de retour, qui peut être très inefficace. L'efficacité est améliorée sensiblement si un lecteur est déformé dans un BufferedReader.
BufferedReader est synchronisée, de sorte que les opérations de lecture sur un BufferedReader peut être fait en toute sécurité à partir de plusieurs threads.
Un scanner d'autre part a beaucoup plus de fromage construit en elle; il peut faire tout ce qu'un BufferedReader peut faire et au même niveau de efficacité aussi bien. Cependant, en plus d'un scanner peut analyser la flux sous-jacent pour les types primitifs et les chaînes en utilisant régulière expressions. Il peut également tokenizer le flux sous-jacent à la delimiter de votre choix. Il peut également faire l'analyse avant de la flux sous-jacent sans tenir compte du delimiter!
Un scanner est cependant pas thread-safe, il doit être à l'extérieur synchronisée.
Le choix d'utiliser un BufferedReader ou un scanner dépend du code vous écrivez, si vous écrivez d'un simple lecteur de journal Buffered lecteur est adéquat. Toutefois, si vous écrivez un analyseur XML Scanner est le choix le plus naturel.
Même en lisant l'entrée, si vous voulez accepter la ligne d'entrée utilisateur par ligne et dire simplement ajouter à un fichier, un BufferedReader est assez bon. D'autre part, si vous voulez accepter l'entrée de l'utilisateur comme une commande avec plusieurs options, et ensuite l'intention d'effectuer différentes opérations en fonction de la commande et les options spécifiées, un scanner conviendra mieux.
-
BufferedReader
a significativement plus grand que la mémoire tampon du scanner. UtilisezBufferedReader
si vous voulez obtenir des chaînes longues d'un cours d'eau, et utiliserScanner
si vous voulez analyser type de jeton à partir d'un flux. -
Scanner
peut utiliser tokenize à l'aide délimiteur personnalisé et analyser le flux dans les types primitifs de données, alors queBufferedReader
ne peut lire et chaîne de magasin. -
BufferedReader
est synchrone alors queScanner
n'est pas. UtilisezBufferedReader
si vous travaillez avec plusieurs threads. -
Scanner
cache IOException enBufferedReader
jette immédiatement.
Je suggère d'utiliser BufferedReader
pour la lecture du texte. Scanner
cache IOException
tout BufferedReader
jette immédiatement.
Différence entre BufferedReader et Scanner sont suivants:
- BufferedReader est synchronisé , mais Scanner est non synchronisé .
- BufferedReader est thread-safe mais Scanner est pas thread-safe .
- BufferedReader a une plus grande mémoire tampon mais Scanner a plus petite mémoire tampon .
- BufferedReader est plus rapide mais Scanner est plus lent dans l'exécution .
-
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();
Voici les différences entre BufferedReader et Scanner
- BufferedReader lecture seule des données, mais également des données scanner analyser.
- vous ne pouvez lire String à l'aide BufferedReader, mais vous pouvez lire int, long ou flotter à l'aide du scanner.
- BufferedReader est plus à partir du scanner, il existe de JDK 1.1 tout Scanner a été ajouté à la version 5 JDK.
- La taille du tampon de BufferedReader est grand (8 Ko) par rapport à 1KB du scanner.
- BufferedReader est plus approprié pour la lecture du fichier avec une longue chaîne tandis Scanner est plus approprié pour la lecture de petite entrée de l'utilisateur à partir de invite de commande.
- BufferedReader est synchronisé mais Scanner est pas, ce qui signifie que vous Scanner ne peut pas partager entre plusieurs threads.
- BufferedReader est plus rapide que Scanner parce qu'il n'a pas passé beaucoup de temps sur l'analyse syntaxique
- BufferedReader est un peu plus rapide par rapport à scanner
- BufferedReader est du package java.io et Scanner est du package java.util sur la base des points que nous pouvons choisir notre choix.
Merci
Les principales différences:
- Scanner
- Un scanner de texte simple qui peut analyser les types primitifs et les chaînes en utilisant des expressions régulières.
- Un casse Scanner son entrée en jetons en utilisant un modèle de séparation, qui, par défaut correspond à un espace. Les jetons obtenus peuvent alors être converties 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();
affiche la sortie suivante:
1
2
red
blue
La même sortie peut être généré 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(); `
-
BufferedReader:
-
Le texte lit à partir d'un flux d'entrée de caractères, des caractères en mémoire tampon de manière à assurer la lecture efficace des caractères, des tableaux et des lignes.
-
La taille de la mémoire tampon peut être spécifié, ou peut être utilisé de la taille par défaut. La valeur par défaut est assez grand pour la plupart des cas.
-
En général, chaque demande de lecture faite d'un lecteur provoque une demande de lecture correspondant à apporter du caractère sous-jacent ou d'un flux octet. Il est donc conseillé d'envelopper un BufferedReader autour de tout lecteur dont les opérations de lecture () peut être coûteux, tels que FileReaders et InputStreamReaders. Par exemple,
BufferedReader in
= new BufferedReader(new FileReader("foo.in"));
en mémoire tampon l'entrée à partir du fichier spécifié. Sans mémoire tampon, chaque appel de lecture () ou readLine () pourrait provoquer octets à lire à partir du fichier, convertis en caractères, puis retournés, ce qui peut être très inefficace. Les programmes qui utilisent DataInputStreams pour la saisie de texte peuvent être localisées en remplaçant chaque DataInputStream avec un BufferedReader approprié.
Source: lien
Il existe différentes façons de prendre l'entrée en Java comme:
1) BufferedReader 2) Scanner 3) Arguments de ligne de commande
BufferedReader Lire le texte à partir d'un flux d'entrée de caractères, des caractères en mémoire tampon de manière à assurer la lecture efficace des caractères, des tableaux et des lignes.
Si Scanner est un scanner simple texte qui peut analyser les types primitifs et les chaînes en utilisant des expressions régulières.
si vous écrivez un simple lecteur de journal BufferedReader est adéquat. si vous écrivez un analyseur XML Scanner est le choix le plus naturel.
Pour plus d'informations s'il vous plaît se référer:
La réponse ci-dessous est tirée de lecture de la console: Scanner JAVA vs BufferedReader
Lors de la lecture d'une entrée de la console, il y a deux options existent pour y parvenir. Tout d'abord en utilisant Scanner
, un autre en utilisant BufferedReader
. Les deux ont des caractéristiques différentes. Cela signifie différences comment l'utiliser.
Scanner traité entrée donnée comme jeton. BufferedReader juste lu ligne par l'entrée de la ligne donnée sous forme de chaîne. Scanner elle-même fournir des fonctions d'analyse syntaxique tout comme nextInt (), nextFloat ().
Mais, ce qui est des différences entre autres?
- Scanner traité entrée donné comme jeton. BufferedReader comme ligne de courant / String
- Scanner entrée donné tokenized utilisant l'expression rationnelle. L'utilisation BufferedReader doit écrire du code supplémentaire
- BufferedReader plus vite que Scanner * Point non. 2
- Scanner n'est pas synchronisé, BufferedReader synchronisé
Scanner venir avec depuis la version 1.5 JDK supérieur.
Quand faut-il utiliser le scanner ou Buffered Reader?
Regardez les principales différences entre les deux, en utilisant un tokenizés, d'autres en utilisant la ligne de flux. Lorsque vous avez besoin de l'analyse des capacités, utiliser à la place du scanner. Mais, je suis plus à l'aise avec BufferedReader. Lorsque vous avez besoin de lire à partir d'un fichier, utilisez BufferedReader, car il est tampon d'utilisation lors de lecture d'un fichier. Ou vous pouvez utiliser BufferedReader comme entrée au scanner.
-
BufferedReader va probablement vous donner de meilleures performances (car Scanner est basé sur InputStreamReader regarder, sources).ups, pour la lecture de fichiers qu'il utilise nio. Quand je l'ai testé les performances par rapport aux performances nio BufferedReader pour les grands fichiers nio montre un peu meilleures performances. - Pour la lecture du fichier essayer Apache Commons IO.
Je préfère Scanner
parce qu'il ne jette pas d'exceptions vérifiées et donc il est des résultats d'utilisation dans un code plus simple.