Différence spécifique entre bufferedreader et 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)? Merci.

De manière simple:

Une classe FileReader est un outil général permettant de lire les caractères d’un fichier. La classe BufferedReader peut contourner les lecteurs, comme FileReader, pour mettre en mémoire tampon l’entrée et améliorer l’efficacité. Donc, vous ne les utiliseriez pas l’un sur l’autre, mais les deux en même temps en passant l’object FileReader au constructeur BufferedReader.

Très détail

FileReader est utilisé pour saisir des données de caractères à partir d’un fichier disque. Le fichier d’entrée peut être un fichier ASCII ordinaire, un fichier texte d’un octet par caractère. Un stream Reader traduit automatiquement les caractères du format de fichier disque au format de caractère interne. Les caractères du fichier d’entrée peuvent provenir d’autres alphabets pris en charge par le format UTF, auquel cas il y aura jusqu’à trois octets par caractère. Dans ce cas également, les caractères du fichier sont traduits au format char.

entrer la description de l'image ici

Comme pour la sortie, il est recommandé d’utiliser un tampon pour améliorer l’efficacité. Utilisez BufferedReader pour cela. C’est la même classe que nous avons utilisée pour la saisie au clavier. Ces lignes doivent sembler familières:

 BufferedReader stdin = new BufferedReader(new InputStreamReader( System.in )); 

Ces lignes créent un BufferedReader, mais le connectent à un stream d’entrée du clavier et non à un fichier.

Source: http://www.oopweb.com/Java/Documents/JavaNotes/Volume/chap84/ch84_3.html

Tout d’abord, vous devez comprendre le streaming en Java car tous les “lecteurs” en Java sont construits sur ce concept.

Streaming de fichiers

La diffusion de fichiers est effectuée par l’object FileInputStream 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 object 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 binarys / données bruts, tels que les images ou les fichiers audio (utilisez AudioInputStream au lieu de FileInputStream pour les fichiers audio). Par contre, pour les fichiers texte, cela est très gênant et plus lent, car la mise en boucle sur un octet à la fois, puis le traitement et le stockage de l’octet sont fastidieux et fastidieux.

Vous devez également fournir le jeu de caractères (si les caractères sont en latin ou en chinois , etc.) du fichier texte que vous utilisez, pour un encodage et un décodage efficaces. Sinon, le programme décodera et encodera certains bavardages et vous. d voir tout un tas de symboles bizarres écrits dans votre fichier texte.

Lecture de fichier

Ceci est juste une façon élégante de dire “File streaming” avec la prise en charge des jeux de caractères.

La classe FileReader est spécifiquement conçue pour traiter les fichiers texte. Comme vous le voyez plus haut, le streaming de fichier est préférable pour traiter les données binarys brutes, mais pour des raisons de texte, il n’est pas efficace.

Donc, les gars de Java ont ajouté la classe FileReader , pour traiter spécifiquement les fichiers texte. Il lit 2 octets à la fois (une amélioration énorme par rapport à FileInputStream !! Je dirais encore mieux choisir de diffuser un octet.)

donc l’opération est comme,

 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 avantage est que, puisque cette classe traite les fichiers texte, vous n’avez pas besoin de spécifier le jeu de caractères du fichier texte et quelques autres propriétés. Il fournit essentiellement une solution prête à l’emploi pour la plupart des cas. Il prend également en charge l’internationalisation et la localisation.

Mais encore une fois, c’est encore plus lent (imagerie en lisant 2 octets par heure et en boucle!).

Flux tampon

Pour résoudre le problème de la mise en 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 ressemble beaucoup à celui d’un utilisateur qui diffuse une vidéo sur YouTube. Une vidéo met en mémoire tampon avant de jouer, de sorte que la personne obtient une expérience de visionnage vidéo parfaite. (et continue à mettre en mémoire tampon jusqu’à ce que toute la vidéo soit mise en mémoire tampon à l’avance, pendant que vous regardez.)

La même technique est utilisée par la classe BufferedReader , l’object BufferedReader prend l’object FileReader qui contient toutes les informations sur le fichier texte à lire.

L’object BufferReader utilise l’object Filereader pour lire le fichier texte donné. Chaque fois que le FileReader lit 2 octets du fichier texte, il renvoie les données à l’object BufferReader . Maintenant, l’object BufferReader crée également un emplacement mémoire spécial, appelé “Buffer”, et stocke toutes les données mises en mémoire tampon à cet endroit.

 BufferedReader br = new BufferedReader( new FileReader("example.txt") ); 

Le processus de lecture de 2 octets à la fois se répète jusqu’à ce que l’object FileReader frappe, “\ n”, “\ r \ n” (Un nouveau caractère de ligne) et BufferReader arrête la mise en mémoire tampon. Jusqu’à ce que l’instruction de lire la ligne suivante (précisément pour tamponner la ligne suivante) soit donnée.

 // this variable points to the buffered line Ssortingng line; // Keep buffering the lines and print it. while ((line = br.readLine()) != null) { printWriter.println(line); } 

Maintenant, ici, au lieu de lire 2 octets, faites de la magie puis stockez-la, une ligne entière est récupérée et stockée quelque part dans la RAM, et lorsque vous en avez fini avec la magie, vous pouvez stocker toute la ligne. Ainsi, le processus est beaucoup plus rapide que celui des 2 octets à la fois.

Mais encore une fois, pourquoi devons-nous passer un object FileReader au BufferReader? Ne pouvons-nous pas simplement dire “mettre ce fichier en mémoire tampon”?

La façon dont cela fonctionne est la suivante: la classe BufferReader est une classe stupide qui sait juste comment mettre en mémoire tampon, elle n’a aucune idée de ce qu’il faut mettre en mémoire tampon ou elle ne s’en soucie tout simplement pas. Donc, étant dit que, lorsque vous fournissez FileReader, il met en mémoire tampon un fichier, de la même manière si vous fournissez un object InputStreamReader tel que,

 // Object that reads console inputs InputStreamReader console = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(console); System.out.println(br.readLine()); 

Il parsingra les données d’entrée du terminal / de la console jusqu’à ce qu’il atteigne un nouveau symbole de ligne et stocke la ligne numérisée dans le tampon.

Donc, maintenant, vous savez que l’on peut lire (tamponner) plusieurs stream avec la classe BufferReader , tels que les fichiers texte, les consoles, les imprimantes, les données réseau, etc.

  bufferedReader.readLine(); 

pour imprimer ce que vous mettez en mémoire tampon.

BufferedReader nécessite un Reader, dont FileReader est un – il descend de InputStreamReader, qui descend de Reader.

FileReader – lit les fichiers de caractères

BufferedReader – “Lit le texte d’un stream de saisie de caractères, en mettant en mémoire tampon des caractères afin de permettre une lecture efficace 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 réalité, BufferedReader utilise des lecteurs comme FileReader.

La classe FileReader aide à écrire dans un fichier, mais son efficacité est faible car elle permet de retracer un caractère à la fois, mais BufferedReader prend des morceaux de données et les stocke dans un tampon. .

Bufferedreader – méthode que vous pouvez utiliser en tant que substitut de la méthode Scanner, obtient un fichier, obtient une entrée.

FileReader – comme son nom l’indique.