Différence spécifique entre le bufferedreader et le filereader
je voudrais connaître la différence spécifique entre BufferedReader
et FileReader
.
je sais que BufferedReader
est beaucoup plus efficace que FileReader
, mais quelqu'un peut-il expliquer pourquoi (spécifiquement et en détail)? Grâce.
6 réponses
d'une manière simple:
une classe FileReader est un outil général à lire dans les caractères d'un fichier. La classe BufferedReader peut s'enrouler autour de lecteurs, comme FileReader, pour amortir l'entrée et améliorer l'efficacité. Ainsi, vous n'utiliserez pas l'un par rapport à l'autre, mais les deux en même temps en passant L'objet FileReader au constructeur BufferedReader.
Détail
FileReader est utilisé pour l'entrée de données de caractères à partir d'un disque fichier. Le fichier d'entrée peut être un ascii ordinaire, un byte par fichier de texte de caractère. Un flux de lecture traduit automatiquement les caractères du format de fichier disque dans le format char interne. Les caractères dans le fichier d'entrée peut être d'autres alphabets pris en charge par le format UTF, auquel cas il y aura jusqu'à trois octets par caractère. Dans ce cas, aussi, les caractères du fichier sont traduits dans le format de char.
Comme avec la sortie, il une bonne pratique consiste à utiliser un tampon pour améliorer l'efficacité. Utilisez BufferedReader pour cela. C'est la même classe que nous utilisons pour les entrées clavier. Ces lignes devraient sembler familières:
BufferedReader stdin =
new BufferedReader(new InputStreamReader( System.in ));
ces lignes créent un lecteur BufferedReader, mais le connectent à un flux d'entrée à partir du clavier, pas à un fichier.
Source:http://www.oopweb.com/Java/Documents/JavaNotes/Volume/chap84/ch84_3.html
tout d'abord, vous devez comprendre la diffusion en continu en Java parce que tous les "lecteurs" en Java sont construits sur ce concept.
Fichier Streaming
le streaming de fichier est effectué par le FileInputStream objet en Java.
// it reads one byte at a time and stores into the 'byt' variable
int byt;
while((byt = fileInputStream.read()) != -1) {
fileOutputStream.write(byt);
}
cet objet lit effectivement un octet (8 bits) à la fois et l'écrit dans le fichier donné.
une application pratique serait, lorsque vous travaillez avec les fichiers binaires/de données brutes, tels que les images ou des fichiers audio (utilisez AudioInputStream au lieu de FileInputStream pour les fichiers audio). D'un autre côté pour les fichiers texte, c'est très gênant et plus lent, parce que boucler un octet à la fois, puis faire un peu de traitement et stocker le octet en arrière est fastidieux et fastidieux.
Vous devez également fournir le jeu de caractères (si les personnages sont Latin ou Chinois, etc) du fichier texte, que vous traitez avec, pour encodage efficace et décodage, sinon, le programme décoderait et encoderait un peu de jibberish et vous verriez tout le tas de symboles bizarres écrits dans votre fichier texte.
Lecture De Fichiers
C'est juste une façon élégante de dire "file streaming" avec un support de jeu de caractères.
FileReader class est spécialement conçu pour traiter les fichiers texte. Comme vous le voyez plus tôt, la diffusion en continu de fichiers est préférable de traiter avec les données binaires brutes, mais pour l'amour du texte, il n'est pas efficace.
alors les gars de Java ont ajouté le FileReader classe, pour traiter spécifiquement les fichiers texte. Il lit 2 octets à la fois (une énorme amélioration par rapport au FileInputStream!! Je dirais qu'il vaut mieux choisir que de diffuser un byte.)
donc l'opération est,
int c;
while ( (c = fileReader.read()) != -1) { // some logic }
veuillez noter que les deux instances utilisent une variable entière pour stocker la valeur extraite du fichier d'entrée.
le seul l'avantage est que puisque cette classe traite des fichiers texte, de sorte que vous n'avez pas à spécifier le caractère du fichier texte et quelques autres propriétés. Il fournit essentiellement une solution "out-of-the-box", pour la plupart des cas. Il soutient également l'internationalisation et la localisation.
mais encore une fois, c'est toujours beaucoup plus lent (lecture D'image 2 bytes par temps et en boucle à travers elle!).
mise en mémoire Tampon des ruisseaux
pour s'attaquer au problème de la boucle continue sur un octet ou 2. Les gars de Java ont ajouté une fonctionnalité remarquable. "pour créer un tampon, avant de le traiter."
le concept est à peu près comme quand un utilisateur diffuse une vidéo sur YouTube. Un tampon vidéo avant qu'il ne joue, de sorte que la personne obtient l'expérience vidéo parfaite de regarder. (et il continue à tamponner jusqu'à ce que toute la vidéo soit tamponnée à l'avance, pendant que vous regardez.)
La même technique est utilisée par les BufferedReader de la classe, le BufferedReader objet FileReader objet qui contient toutes les informations sur le fichier texte qui doit être lu.
BufferReader objet Filereader objet pour lire le fichier texte. Chaque fois que le FileReader lit 2 octets du fichier texte, il renvoie les données à BufferReader objet. Maintenant, le BufferReader l'objet crée aussi un endroit spécial de mémoire, appelé "tampon", et stocke toutes les données tamponnées là.
BufferedReader br = new BufferedReader( new FileReader("example.txt") );
le processus de lecture de 2 Octets par temps, continue à répéter jusqu'à ce que le FileReader objet frappe, '\n', '\r\n' (Un caractère de nouvelle ligne), et BufferReader arrête de tamponner. Jusqu'à ce que l'instruction de lire la ligne suivante (précisément pour le tampon de la ligne suivante).
// this variable points to the buffered line
String line;
// Keep buffering the lines and print it.
while ((line = br.readLine()) != null) {
printWriter.println(line);
}
maintenant ici, au lieu de lire 2 octets, puis faire un peu de magie et ensuite le stocker de retour, une ligne entière est récupérée et stockée en RAM quelque part, et quand vous avez terminé avec la magie, vous pouvez stocker toute la ligne en arrière. Ainsi, le processus tourne beaucoup plus vite que les 2 octets à la fois.
mais encore une fois, Pourquoi avons-nous besoin de passer L'objet FileReader au BufferReader? Est-ce qu'on ne peut pas juste dire "tamponner ce fichier" et il le fait, ne serait-ce pas mignon et court?
La façon dont il fonctionne, c'est cela, La BufferReader classe est un muet classe qui il sait juste comment tamponner, il n'a aucune idée de ce qu'il faut tamponner ou il s'en fiche tout simplement. Ceci étant dit, Lorsque vous fournissez FileReader, il tamponne un fichier, de la même manière si vous fournissez un objet de InputStreamReader comme,
// Object that reads console inputs
InputStreamReader console = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(console);
System.out.println(br.readLine());
il numérisera les données D'entrée du Terminal/Console jusqu'à ce qu'il atteigne un nouveau symbole de ligne, et stockera la ligne scannée dans le tampon.
Donc, maintenant vous savez que l'on peut lire (tampon) plusieurs flux avec l' BufferReader classe, tels que des fichiers texte, des consoles, des imprimantes, des réseaux de données, etc, et tout ce qu'il/elle a à retenir est,
bufferedReader.readLine();
pour imprimer ce que vous tamponnez.
BufferedReader nécessite un lecteur, dont FileReader est un-il descend de InputStreamReader, qui descend de Reader.
FileReader - lire des fichiers de personnage
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."
http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html
http://docs.oracle.com/javase/7/docs/api/java/io/FileReader.html
en fait BufferedReader utilise des lecteurs comme FileReader.
FileReader Classe aide à écrire sur le dossier mais son efficacité est faible car il a vous récupérez un caractère à la fois à partir du dossier mais BufferedReader prend des morceaux de données et le stockent dans la mémoire tampon ainsi au lieu de récupérer un caractère à la fois à partir de la récupération de dossier devient facile en utilisant la mémoire tampon.
Bufferedreader-méthode que vous pouvez utiliser réellement comme un substitut à la méthode de Scanner, obtient le dossier, obtient l'entrée.
FileReader-comme son nom l'indique.