Dans les sections précédentes, nous avons découvert les flux d'entrée et de sortie d'octets de fichier et les flux d'entrée et de sortie de caractères de fichier. Dans cette section, nous apprenons un nouveau concept : les flux mis en mémoire tampon . Alors, qu’est-ce qu’un flux tamponné ? Quel rôle les flux tampons peuvent-ils jouer ?
En Java, nous appelons les objets créés par les classes BufferedReader et BufferedWriter des flux d'entrée et de sortie tamponnés, ce qui améliore la capacité de lecture et d'écriture de fichiers. Par exemple, Student.txt est une liste d’étudiants, chaque nom occupant une ligne. Si nous voulons lire le nom, nous devons lire une ligne à la fois. Il est difficile d'accomplir une telle tâche en utilisant le flux FileReader, car nous ne savons pas combien de caractères il y a dans une ligne, et la classe FileReader ne le sait pas. fournir une méthode pour lire une ligne.
Java fournit des flux plus avancés : le flux BufferedReader et le flux BufferedWriter. La source et la destination des deux doivent être un flux d'entrée de caractères et un flux de sortie de caractères. Par conséquent, si le flux d'entrée de caractères de fichier est utilisé comme source du flux BufferedReader et que le flux de sortie de caractères de fichier est utilisé comme destination du flux BufferedWriter, alors les flux créés par les classes BufferedReader et BufferedWriter auront une lecture et une écriture plus fortes. capacités que la capacité du flux d’entrée de caractères et du flux de sortie de caractères. Par exemple, un flux BufferedReader peut lire des fichiers ligne par ligne.
Les constructeurs de la classe BufferedReader et BufferedWriter sont :
BufferedReader(Readerin);BufferedWriter(Writerout);
Les flux BufferedReader peuvent lire des lignes de texte à l'aide de readLine() . Créez un objet BufferedReader en passant un objet d'une sous-classe Reader, telle qu'une instance de FileReader, à BufferedReader, par exemple :
FileReaderinOne=newFileReader(Student.txt);BufferedReaderinTwo=BufferedReader(inOne);
Ensuite, inTwo stream appelle la méthode readLine() pour lire Student.txt, par exemple :
StringstrLine=inTwo.readLine();
De même, vous pouvez connecter un flux BufferedWriter et un flux FileWriter ensemble, puis utiliser le flux BufferedWriter pour écrire des données vers la destination, par exemple :
FileWritertofile=newFileWriter(hello.txt);BufferedWriterout=BufferedWriter(tofile);
Ensuite, out utilise la méthode write(String s, int off, int len) de la classe BufferedReader pour écrire la chaîne s dans hello.txt. Le paramètre off est le décalage depuis le début de s et len est le nombre de caractères écrits. .
De plus, le flux BufferedWriter dispose d'une méthode unique pour écrire un caractère de nouvelle ligne dans le fichier :
nouvelleLigne();
BufferedReader et BufferedWriter peuvent être appelés flux supérieur, et le flux de caractères vers lequel ils pointent est appelé flux sous-jacent. Java utilise la technologie de mise en cache pour connecter le flux supérieur et le flux sous-jacent. Le flux d'entrée de caractères sous-jacent lit d'abord les données dans le cache, le flux BufferedReader lit ensuite les données du cache ; le flux BufferedWriter écrit les données dans le cache et le flux de sortie de caractères sous-jacent écrit en continu les données dans le cache vers la destination. . Lorsque le flux BufferedWriter appelle flush() pour actualiser le cache ou appelle la méthode close() pour fermer, même si le cache ne déborde pas, le flux sous-jacent écrira immédiatement le contenu mis en cache vers la destination.
Remarque : Lors de la fermeture du flux de sortie, vous devez d'abord fermer le flux de sortie mis en mémoire tampon, puis fermer le flux pointé par le flux de sortie tamponné, c'est-à-dire fermer d'abord le flux supérieur, puis fermer le flux inférieur. Fermez simplement le flux supérieur lors de l'écriture du code, et le flux sous-jacent du flux supérieur sera automatiquement fermé.
Par exemple:
Le fichier english.txt composé de phrases anglaises est le suivant, chaque phrase occupe une ligne :
La flèche a raté la cible. Ils ont rejeté la demande syndicale. Où mène cette route ?
Il faut lire english.txt ligne par ligne, ajouter le nombre de mots contenus dans la phrase anglaise après la ligne, puis écrire la ligne dans un fichier nommé englishCount.txt. Le code est le suivant :
importjava.io.*;importjava.util.*;publicclassMain{publicstaticvoidmain(Stringargs[]){FilefRead=newFile(english.txt);FilefWrite=newFile(englishCount.txt);try{Writerout=newFileWriter(fWrite);BufferedWriterbufferWrite= newBufferedWriter(out);Readerin=newFileReader(fRead);BufferedReaderbufferRead=newBufferedReader(in);Stringstr=null;while((str=bufferRead.readLine())!=null){StringTokenizerfenxi=newStringTokenizer(str);intcount=fenxi. countTokens();str=str+nombre de mots dans la phrase :+count;bufferWrite.write(str);bufferWrite.newLine();}bufferWrite.close();out.close();in=newFileReader(fWrite) ;bufferRead =newBufferedReader(in);Strings=null;System.out.println(fWrite.getName()+content:);while((s=bufferRead.readLine())!=null){System.out.println( s) ;}bufferRead.close();in.close();}catch(IOExceptione){System.out.println(e.toString());}}}
Les résultats en cours d'exécution sont les suivants :
Contenu du fichier englishCount.txt : La flèche a raté la cible. Le nombre de mots dans la phrase : 5 Ils ont rejeté la demande syndicale. Le nombre de mots dans la phrase : 5 Où va cette route ? Le nombre de mots dans la phrase : 6