Programme beinhalten sehr oft die Anforderung, Daten schnell in eine Datei oder anderswo zu schreiben. Und das wirft Fragen auf: Wie sollen wir das machen? Welche Klasse sollen wir wählen? Heute lernen wir einen geeigneten Kandidaten für diese Rolle kennen – die BufferedWriter- Klasse.

Warum brauchen wir BufferedWriter?

BufferedWriter ist eine Klasse, die gepufferte Zeichen in einen Stream schreibt. Dadurch können Sie die Anzahl der Zugriffe auf physische Medien reduzieren. Das heißt, anstatt jedes Mal ein einzelnes Zeichen zu schreiben, werden Daten in einen Puffer geschrieben und dann alle Zeichen auf einmal auf das Medium geschrieben.

Dies erhöht die Schreibgeschwindigkeit erheblich. Die Standardpuffergröße beträgt 8192 Zeichen. Dies kann jedoch geändert werden, indem im Konstruktor eine neue Größe angegeben wird:

BufferedWriter(Writer in, int sz)

Hier ist das erste Argument des Konstruktors ein Stream, der die von uns geschriebenen Daten empfängt. Und es stellt sich heraus, dass sz die Größe des neuen Puffers ist.

Java verfügt auch über eine BufferedReader- Klasse: Sie wird zum gepufferten Lesen von Daten verwendet.

Was genau ist ein Puffer? Nehmen wir ein Beispiel aus dem wirklichen Leben. Ein Puffer ist wie ein Korb oder Einkaufswagen im Supermarkt. Anstatt mit einem einzelnen Artikel zur Kasse zu gehen, ihn zu bezahlen, ihn in den Kofferraum Ihres Autos zu legen und dann wiederzukommen, um einen anderen Artikel zu holen, können wir einen Einkaufswagen nehmen, alles, was wir wollen, hineinlegen und dann bezahlen an der Kasse. Genau so funktioniert ein Puffer: Er sammelt Daten, nimmt dann alles und schreibt es, anstatt jedes Fragment einzeln zu schreiben.

Konstruktoren und Methoden der BufferedWriter-Klasse

Schauen wir uns nun die BufferedWriter- Klasse genauer an. Es gibt zwei Konstruktoren zum Erstellen eines Objekts:

public BufferedWriter(Writer out)
public BufferedWriter(Writer out, int sz)

Wobei out in beiden Konstruktoren der Stream ist, in den geschrieben werden soll, und sz , wie bereits erwähnt, die Größe des Puffers ist.

Die BufferedWriter- Klasse verfügt außerdem über mehrere Methoden. Einige davon schauen wir uns heute genauer an:

write(char[] array) Schreibt ein char- Array in den Puffer
write(String s, int off, int len) Schreibt einen Teil einer Zeichenfolge in den Puffer
anhängen(char c) Schreiben Sie ein Zeichen in den Puffer
append(CharSequence csq, int start, int end) Schreibt einen Teil eines Arrays in den Puffer
Neue Zeile() Schreibt einen Zeilentrenner
spülen() Spült den Stream

Schreiben wir ein Programm, das einen Wert in eine Datei schreibt. Für dieSchriftstellerParameter, wir übergeben aFileWriteran den Konstrukteur. Es wird zum Schreiben von Textdateien verwendet und verfügt über mehrere Konstruktoren zum Initialisieren von Objekten:

FileWriter(Dateidatei)
FileWriter(Dateidatei, boolesches Anhängen)
FileWriter(FileDescriptor fd)
FileWriter(String Dateiname)
FileWriter(String Dateiname, boolesches Anhängen)

Für unser Beispiel verwenden wir einen Konstruktor, der einen Dateinamen akzeptiert:

try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))){

	String message = "Hello, Amigo! This is a very important message!";
	bufferedWriter.write(message);
	bufferedWritter.flush();
}
catch(IOException ex){
System.out.println(ex.getMessage());
 }

Unser Code verwendet die Methode write(String str) , um str in die Datei file.txt zu schreiben .

Es gibt andere Methoden zum Schreiben:

  • write(char[] array ) – diese Variante akzeptiert und schreibt ein char- Array;

  • write(String s, int off, int len) – diese Variante benötigt einen String s ; ein Offset off , der der Index des Zeichens ist, ab dem mit dem Schreiben begonnen werden soll; und len , die Länge der zu schreibenden Zeichenfolge (Teilzeichenfolge).

try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))){
	String message = "Hello, Amigo! This is a very important message!";
	bufferedWriter.write(message, 0, 11);
 	bufferedWriter.flush();

} catch(IOException ex) {
System.out.println(ex.getMessage());
}

Dieser Code schreibt „Hello, Amig“ in die Datei, da wir der Methode gesagt haben, dass sie ab Index 0 11 Zeichen schreiben soll.

Unser Code verfügt auch über einen Try-with-Ressourcen- Block:

try(BufferedWriter bufferedWritter = new BufferedWriter(new FileWriter("file.txt")))

Dies bedeutet, dass die Methode close() automatisch auf my aufgerufen wirdbufferedWriterObjekt, da es die AutoCloseable- Schnittstelle implementiert.

Die Methode „flush()“ im Code wird verwendet, um den Ausgabestream zu leeren, wodurch das Schreiben aller gepufferten Bytes erzwungen wird. Der Schreibvorgang kann ohne diesen Aufruf nicht erfolgen, da er angibt, dass der Puffer geleert und die gepufferten Bytes geschrieben werden müssen.

Die BufferedWriter- Klasse verfügt außerdem über eine newLine()- Methode, die unserer Nachricht eine neue Zeile hinzufügt:

try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))) {
        String message = "Hello, Amigo! This is a very important message!";
        bufferedWriter.write(message, 0, 13);
        bufferedWriter.newLine();
        bufferedWriter.write(message, 15, 33);
    } catch (IOException ex) {
        System.out.println(ex.getMessage());
    }

In der Datei erhalten wir:

Hallo, Amigo!
Das ist eine sehr wichtige Botschaft!

Die Signatur der append() -Methode sieht folgendermaßen aus:

public Writer append(CharSequence csq, int start, int end)

Es wird verwendet, um csq hinzuzufügen . Hier ist start der Index des ersten Zeichens und end der Index des letzten Zeichens der einzufügenden Zeichenfolge (oder Teilzeichenfolge). Das Zeichen mit Indexende wird nicht eingefügt.

try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))) {
    String message = "Hello, Amigo! This is a very important message!";
    bufferedWriter.append(message, 0, 7);
    bufferedWriter.flush();
} catch (IOException ex) {
    System.out.println(ex.getMessage());
}

Dieser Code gibt Ihnen:

Hallo,

Das heißt, mit der Append- Methode geben Sie an, welcher Teil der Zeichenfolge zum Puffer hinzugefügt werden soll.

Wenn wir uns den Unterschied zwischen write() und append() genauer ansehen , sehen wir zunächst, dass beide im Prinzip dasselbe tun – sie schreiben Werte.

Der Unterschied besteht jedoch darin, dass die Append- Methode neuer ist und eine CharSequence als Argument verwendet. Da String CharSequence implementiert , können wir Strings und StringBuilders sowie StringBuffers an die Append- Methode übergeben . Die Methode write() akzeptiert jedoch nur einen String .

Das war es fürs Erste! Heute haben wir uns mit Puffern vertraut gemacht, wie man gepuffertes Schreiben in eine Datei durchführt und welche Methoden Sie dafür verwenden können.