In den vorherigen Abschnitten haben wir etwas über Dateibyte-Eingabe- und Ausgabeströme und Dateizeichen-Eingabe- und Ausgabeströme gelernt. In diesem Abschnitt lernen wir ein neues Konzept kennen – gepufferte Streams . Was ist also ein gepufferter Stream? Welche Rolle können Pufferströme spielen?
In Java nennen wir die von den Klassen BufferedReader und BufferedWriter erstellten Objekte gepufferte Eingabe- und Ausgabeströme, die die Fähigkeit zum Lesen und Schreiben von Dateien verbessern. Student.txt ist beispielsweise eine Liste von Studenten, wobei jeder Name eine Zeile einnimmt. Wenn wir den Namen lesen möchten, müssen wir jeweils eine Zeile lesen. Es ist schwierig, eine solche Aufgabe mit dem FileReader-Stream abzuschließen, da wir nicht wissen, wie viele Zeichen eine Zeile enthält, und die FileReader-Klasse nicht Stellen Sie eine Methode zum Lesen einer Zeile bereit.
Java bietet erweiterte Streams: BufferedReader-Stream und BufferedWriter-Stream. Die Quelle und das Ziel beider müssen ein Zeicheneingabestream und ein Zeichenausgabestream sein. Wenn daher der Dateizeichen-Eingabestream als Quelle des BufferedReader-Streams und der Dateizeichen-Ausgabestream als Ziel des BufferedWriter-Streams verwendet wird, verfügen die von den Klassen BufferedReader und BufferedWriter erstellten Streams über eine stärkere Lese- und Schreibgeschwindigkeit Funktionen als der Zeicheneingabestream und der Zeichenausgabestream. Beispielsweise kann ein BufferedReader-Stream Dateien Zeile für Zeile lesen.
Die Konstruktoren der BufferedReader-Klasse und des BufferedWriter sind:
BufferedReader(Readerin);BufferedWriter(Writerout);
BufferedReader-Streams können Textzeilen mit readLine() lesen. Erstellen Sie ein BufferedReader-Objekt, indem Sie ein Objekt einer Reader-Unterklasse, beispielsweise eine Instanz von FileReader, an BufferedReader übergeben, zum Beispiel:
FileReaderinOne=newFileReader(Student.txt);BufferedReaderinTwo=BufferedReader(inOne);
Dann ruft der inTwo-Stream die Methode readLine() auf, um Student.txt zu lesen, zum Beispiel:
StringstrLine=inTwo.readLine();
Ebenso können Sie einen BufferedWriter-Stream und einen FileWriter-Stream miteinander verbinden und dann den BufferedWriter-Stream verwenden, um Daten an das Ziel zu schreiben, zum Beispiel:
FileWritertofile=newFileWriter(hello.txt);BufferedWriterout=BufferedWriter(tofile);
Dann verwendet out die Methode write(String s, int off, int len) der BufferedReader-Klasse, um die Zeichenfolge s in hello.txt zu schreiben. Der Parameter off ist der Offset vom Anfang von s und len ist die Anzahl der geschriebenen Zeichen .
Darüber hinaus verfügt der BufferedWriter-Stream über eine einzigartige Methode zum Schreiben eines Newline-Zeichens in die Datei:
newLine();
BufferedReader und BufferedWriter können als oberer Stream bezeichnet werden, und der Zeichenstrom, auf den sie verweisen, wird als zugrunde liegender Stream bezeichnet. Java verwendet Caching-Technologie, um den oberen Stream und den zugrunde liegenden Stream zu verbinden. Der zugrunde liegende Zeicheneingabestream liest die Daten zuerst in den Cache, der BufferedReader-Stream liest dann die Daten aus dem Cache, der BufferedWriter-Stream schreibt die Daten in den Cache und der zugrunde liegende Zeichenausgabestream schreibt die Daten kontinuierlich im Cache an das Ziel . Wenn der BufferedWriter-Stream Flush() aufruft, um den Cache zu aktualisieren, oder die Methode close() zum Schließen aufruft, schreibt der zugrunde liegende Stream den zwischengespeicherten Inhalt sofort an das Ziel, auch wenn der Cache nicht überläuft.
Hinweis : Wenn Sie den Ausgabestream schließen, müssen Sie zuerst den gepufferten Ausgabestream schließen und dann den Stream, auf den der gepufferte Ausgabestream zeigt, schließen, dh zuerst den oberen Stream und dann den unteren Stream schließen. Schließen Sie beim Schreiben von Code einfach den oberen Stream, und der darunter liegende Stream des oberen Streams wird automatisch geschlossen.
Zum Beispiel:
Die aus englischen Sätzen bestehende Datei english.txt sieht wie folgt aus, wobei jeder Satz eine Zeile einnimmt:
Der Pfeil verfehlte das Ziel. Sie lehnten die Gewerkschaftsforderung ab. Wohin führt dieser Weg?
Es ist erforderlich, english.txt Zeile für Zeile zu lesen, die Anzahl der im englischen Satz enthaltenen Wörter nach der Zeile hinzuzufügen und die Zeile dann in eine Datei mit dem Namen englishCount.txt zu schreiben. Der Code lautet wie folgt:
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+Anzahl der Wörter im Satz:+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());}}}
Die Laufergebnisse sind wie folgt:
englishCount.txt-Inhalt: Der Pfeil hat das Ziel verfehlt. Die Anzahl der Wörter im Satz: 5 Sie haben die Gewerkschaftsforderung abgelehnt. Die Anzahl der Wörter im Satz: 5 Wohin führt dieser Weg? Die Anzahl der Wörter im Satz: 6