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 également que le BufferedReader
lit les fichiers efficacement en utilisant un tampon pour éviter les opérations sur le disque physique.
Mes questions sont:
- Fonctionne
Scanner
aussi bien queBufferedReader
? - Pourquoi choisiriez-vous
Scanner
plutôtBufferedReader
ou vice versa?
java
file-io
java.util.scanner
bufferedreader
Mads Mobæk
la source
la source
Réponses:
Scanner
est utilisé pour analyser les jetons du contenu du flux alorsBufferedReader
qu'il lit simplement le flux et n'effectue aucune analyse spéciale.En fait, vous pouvez passer de a
BufferedReader
à ascanner
comme source de caractères à analyser.la source
Scanner
dépend en fin de compte d'autre chose pour son entrée, qui pourrait bien être synchronisée.Dans la dernière version / build JDK6 (b27), le
Scanner
a un tampon plus petit ( 1024 caractères ) par opposition auBufferedReader
( 8192 caractères ), mais c'est plus que suffisant.Quant au choix, utilisez le
Scanner
si vous voulez analyser le fichier, utilisez leBufferedReader
si vous voulez lire le fichier ligne par ligne. Voir également le texte d'introduction de leurs documentations API précitées.nextXxx()
méthodes enScanner
classe.la source
readInt();
readFloat (); etc. Maintenant, quel est le moyen d'analyser. et BalusC pouvez-vous me donner peu de temps à seulement 10 minutes dans la salle de chat, je veux en savoir peu sur la mise en mémoire tampon, comment cela fonctionne.BufferedReader
dans le constructeur de Scanner? Est-ce une bonne idée?Scanner
Le tampon sera étendu au besoin pour la correspondance de motifs. Donc, si vous voulez un tampon plus grand, il vous suffit de l'invoquer, par exemplefindWithinHorizon("\\z", 8192)
, et ensuite, il utilisera un tampon avec une capacité de8192
caractères (ou le fichier entier s'il est plus petit que cela).Voir ce lien , ce qui suit est cité à partir de là:
la source
BufferedReader
a une mémoire tampon beaucoup plus grande que Scanner. À utiliserBufferedReader
si vous souhaitez obtenir de longues chaînes à partir d'un flux et à utiliserScanner
si vous souhaitez analyser un type spécifique de jeton à partir d'un flux.Scanner
peut utiliser tokenize à l'aide d'un délimiteur personnalisé et analyser le flux en types de données primitifs, tandisBufferedReader
qu'il ne peut lire et stocker que String.BufferedReader
est synchrone alors qu'ilScanner
ne l'est pas. À utiliserBufferedReader
si vous travaillez avec plusieurs threads.Scanner
masque IOException tout en leBufferedReader
lançant immédiatement.la source
Je suggère d'utiliser
BufferedReader
pour lire du texte.Scanner
se cacheIOException
tout en leBufferedReader
jetant immédiatement.la source
Les différences entre BufferedReader et Scanner sont les suivantes:
Code pour lire une ligne depuis la console:
BufferedReader :
Scanner :
la source
Voici les différences entre BufferedReader et Scanner
Merci
la source
Les principales différences:
Exemple
imprime la sortie suivante:
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:
BufferedReader:
Lit le texte à partir d'un flux d'entrée de caractères, en mettant les caractères en mémoire tampon afin de 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 suffisamment grande pour la plupart des applications.
En général, chaque demande de lecture faite à partir d'un lecteur entraîne une demande de lecture correspondante à partir du flux de caractères ou d'octets sous-jacent. Il est donc conseillé d'enrouler un BufferedReader autour de tout lecteur dont les opérations read () peuvent être coûteuses, telles que FileReaders et InputStreamReaders. Par exemple,
mettra en mémoire tampon l'entrée du fichier spécifié. Sans mise en mémoire tampon, chaque invocation de read () ou readLine () peut entraîner la lecture d'octets dans le fichier, leur conversion en caractères, puis leur renvoi, ce qui peut être 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 source
Il existe différentes façons de saisir des données en java comme:
1) BufferedReader 2) Scanner 3) Arguments de ligne de commande
BufferedReader Lire du texte à partir d'un flux d'entrée de caractères, en tamponnant les caractères de manière à permettre une lecture efficace des caractères, des tableaux et des lignes.
Où Scanner est un simple scanner de texte qui peut analyser des types et des chaînes primitifs à l'aide d'expressions régulières.
si vous écrivez un simple lecteur de journaux Le lecteur tamponné est adéquat. si vous écrivez un analyseur XML, c'est le choix le plus naturel.
Pour plus d'informations, veuillez consulter:
http://java.meritcampus.com/t/240/Bufferedreader?tc=mm69
la source
La réponse ci-dessous est tirée de la lecture à partir de la console: JAVA Scanner vs BufferedReader
Lors de la lecture d'une entrée depuis la console, il existe deux options pour y parvenir. Première utilisation
Scanner
, une autre utilisationBufferedReader
. Les deux ont des caractéristiques différentes. Cela signifie des différences sur la façon de l'utiliser.Le scanner a traité l'entrée donnée comme un jeton. BufferedReader vient de lire ligne par ligne l'entrée donnée sous forme de chaîne. Le scanner lui-même fournit des capacités d'analyse tout comme nextInt (), nextFloat ().
Mais, quelles sont les autres différences entre?
Le scanner est fourni depuis la version 1.5 du JDK.
Quand utiliser un scanner ou un lecteur tamponné?
Regardez les principales différences entre les deux, l'une utilisant des jetons, d'autres 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 devez lire à partir d'un fichier, utilisez BufferedReader, car il s'agit d'utiliser un tampon lors de la lecture d'un fichier. Ou vous pouvez utiliser BufferedReader comme entrée pour le scanner.
la source
BufferedReader vous donnera probablement de meilleures performances (car le scanner est basé sur InputStreamReader, regardez les sources).ups, pour la lecture 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 un peu meilleures.la source
Je préfère,
Scanner
car il ne lève pas d'exceptions vérifiées et, par conséquent, son utilisation entraîne un code plus rationalisé.la source