"Ich bin es wieder."

„Hallo, Ellie!“

„Heute möchte ich Ihnen alles über BufferedReader und BufferedWriter erzählen .“

„Du hast mir schon davon erzählt. Sie sind wirklich nicht so kompliziert.“

„OK. Dann erzähl mir, wie BufferedReader funktioniert.“

BufferedReader ist wie ein 110/220-V-Konverter.“

„Sie müssen dem BufferedReader- Konstruktor das Reader- Objekt übergeben, aus dem die Daten gelesen werden. Ein BufferedReader- Objekt liest große Datenblöcke vom Reader und speichert sie intern in einem Puffer. Aus diesem Grund ist die Verwendung eines BufferedReader zum Lesen von einem Reader schneller als direkt aus einem Reader zu lesen .

„Das stimmt. Und was ist mit BufferedWriter ?“

„Es ist ein Kinderspiel. Angenommen, wir schreiben in einen FileWriter . Die Daten werden sofort auf die Festplatte geschrieben. Wenn wir häufig kleine Datenbits schreiben, belasten wir die Festplatte häufig, was das Programm erheblich verlangsamt.“ Wenn wir jedoch einen BufferedWriter als „Konverter“ verwenden, ist der Schreibvorgang viel schneller. Wenn Sie in einen BufferedWriter schreiben , speichert dieser die Daten in einem internen Puffer. Wenn der Puffer voll ist, werden die Daten als in den Writer geschrieben ein einziger großer Brocken. Das geht viel schneller.“

„Hmm. Genau richtig. Aber was hast du vergessen?“

„Nachdem Sie mit dem Schreiben fertig sind, müssen Sie die Methode „flush()“ für das BufferedWriter- Objekt aufrufen, um es zu zwingen, alle noch im Puffer befindlichen Daten an den Writer zu senden .“

"Und was noch?"

„Was noch? Oh! Solange der Puffer nicht in den Writer geschrieben wurde , können die Daten gelöscht und/oder ersetzt werden.“

„Amigo! Ich bin beeindruckt! Du bist ein Experte! Nun, dann erzähle ich dir von einigen neuen Klassen:  ByteArrayStream und PrintStream .“

„Zum Beispiel ByteArrayInputStream und ByteArrayOutputStream .“

„Diese Klassen sind ein bisschen wie StringReader und StringWriter . Außer dass StringReader Zeichen ( char ) aus einer Zeichenfolge ( String ) liest, InputStream jedoch Bytes aus einem Byte-Array ( ByteArray ).“

StringWriter schreibt Zeichen ( char ) in einen String, während ByteArrayOutputStream Bytes in ein internes Byte-Array schreibt. Wenn Sie in einen StringWriter schreiben , wird seine interne Zeichenfolge länger, und wenn Sie in einen ByteArrayOutputStream schreiben , wird auch sein internes Byte-Array dynamisch erweitert.

„Erinnern Sie sich an das Beispiel, das Ihnen in der letzten Lektion gegeben wurde:“

Vom Reader-Objekt lesen und in das Writer-Objekt schreiben:
public static void main (String[] args) throws Exception
{
 String test = "Hi!\n My name is Richard\n I'm a photographer\n";
 StringReader reader = new StringReader(test);

 StringWriter writer = new StringWriter();

 executor(reader, writer);

 String result = writer.toString();

 System.out.println("Result: "+ result);
}

public static void executor(Reader reader, Writer writer) throws Exception
{
 BufferedReader br = new BufferedReader(reader);
 String line;
 while ((line = br.readLine()) != null) {
 StringBuilder sb = new StringBuilder(line);
 String newLine = sb.reverse().toString();

 writer.write(newLine);
 }
}

„So würde es aussehen, wenn es mit Bytes statt Zeichen funktionieren würde:“

Aus einem InputStream-Objekt lesen und in ein OutputStream-Objekt schreiben:
public static void main (String[] args) throws Exception
{
 String test = "Hi!\n My name is Richard\n I'm a photographer\n";
 InputStream inputStream = new ByteArrayInputStream(test.getBytes());

 ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

 executor(inputStream, outputStream);

 String result = new String(outputStream.toByteArray());
 System.out.println("Result: "+ result);
}

public static void executor(InputStream inputStream, OutputStream outputStream) throws Exception
{
 BufferedInputStream bis = new BufferedInputStream(inputStream);
 while (bis.available() > 0)
 {
  int data = bis.read();
  outputStream.write(data);
 }
}

„Alles ist das Gleiche wie im obigen Beispiel. Außer dass wir String durch ByteArray, Reader durch InputStream und Writer durch OutputStream ersetzt haben.“

„Die einzigen beiden weiteren Schritte sind die Konvertierung des Strings in ein ByteArray und wieder zurück. Wie Sie sehen, geht das ganz einfach:“

Konvertieren eines Strings in ein ByteArray und wieder zurück
public static void main (String[] args) throws Exception
{
 String test = "Hi!\n My name is Richard\n I'm a photographer\n";
 byte[] array = test.getBytes();

 String result = new String(array);
 System.out.println("Result: "+ result);
}

„Um die Bytes abzurufen, die bereits zu einem ByteArrayOutputStream hinzugefügt wurden, rufen Sie die Methode toByteArray () auf.“

„Ah. Die Ähnlichkeiten zu StringReader/StringWriter sind ziemlich stark, besonders nachdem du mich darauf hingewiesen hast. Danke, Ellie, für eine wirklich interessante Lektion.“

„Wo willst du so eilig hin? Ich habe noch ein kleines Geschenk für dich. Ich möchte dir etwas über den PrintStream-Kurs erzählen.“

„PrintStream? Das ist das erste Mal, dass ich von dieser Klasse gehört habe.“

„Ja. Vor allem, wenn man die Tatsache nicht berücksichtigt, dass man es seit dem ersten Tag Ihres Java-Studiums verwendet. Erinnern Sie sich an System.out ? Nun, System.out ist eine statische (Klassen-)Variable des Systems Klasse, und ihr Typ ist... PrintStream ! Hierher stammen alle diese print-, println- usw. Methoden.

„Wow. Wie interessant. Daran habe ich irgendwie nie gedacht. Erzähl mir mehr.“

„Gut. Okay, hören Sie zu. Die PrintStream-Klasse wurde für lesbare Ausgaben erfunden. Sie besteht fast ausschließlich aus den Methoden print und println. Sehen Sie sich diese Tabelle an:“

Methoden Methoden
void print(boolean b) void println(boolean b)
void print(char c) void println(char c)
void print(int c) void println(int c)
void print(long c) void println(long c)
void print(float c) void println(float c)
void print(double c) void println(double c)
void print(char[] c) void println(char[] c)
void print(String c) void println(String c)
void print(Object obj) void println(Object obj)
void println()
PrintStream format (String format, Object ... args)
PrintStream format (Locale l, String format, Object ... args)

„Es gibt auch mehrere Formatierungsmethoden, mit denen Sie Daten mithilfe einer Formatzeichenfolge ausgeben können. Zum Beispiel:“

Konvertieren eines Strings in ein ByteArray und wieder zurück
String name = "Kolan";
int age = 25;
System.out.format("My name is %s. My age is %d.", name, age);
Bildschirmausgabe:
My name is Kolan. My age is 25.

„Ja, ich erinnere mich. Wir haben uns bereits mit der Formatierungsmethode der String-Klasse beschäftigt.“

„Das ist alles für den Moment.“

„Danke, Ellie.“