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:
Scanner
fonctionne aussi bien que BufferedReader
?Scanner
par rapport à BufferedReader
ou inversement?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.
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.
nextXxx()
dans la classe Scanner
.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.
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.
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.
BufferedReader
est synchrone alors que Scanner
ne l’est pas. Utilisez BufferedReader
si vous travaillez avec plusieurs threads.
Scanner
masque l'IOException alors que BufferedReader
le jette immédiatement.
Je suggère d'utiliser BufferedReader
pour lire du texte. Scanner
cache IOException
pendant que BufferedReader
le lance immédiatement.
La différence entre BufferedReader et Scanner est la suivante:
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();
Voici les différences entre BufferedReader et Scanner.
Merci
Les principales différences:
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(); `
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:
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 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.
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.