„Hallo Amigo! Ritschie hat dir gestern schon von FileInputStream und FileOutputStream erzählt. Heute werde ich dir die Klassen FileReader und FileWriter näherbringen.“

Wie du wahrscheinlich schon erraten hast, sind all diese Klassen Adapter zwischen dem File-Objekt und den „Interfaces“ von InputStream, OutputStream, Reader und Writer.

„Sie ähneln den Adaptern zwischen File und Reader/Writer, aber du musst nur ein String-Objekt an den Konstruktor übergeben, nicht ein File!“

„Tatsächlich haben sie sogar mehrere Konstruktoren. Es gibt Konstruktoren sowohl für File- als auch für String-Objekte. Wenn du ein String-Objekt an den Konstruktor übergibst, erstellt der Konstruktor im Stillen ein File-Objekt unter Verwendung des Dateipfads, der dem übergebenen String-Objekt entnommen wurde.“

Das ist praktisch. Die Entwickler von Java haben die häufigsten Anwendungsfälle für diese Klassen genommen und Konstruktoren für alle diese Klassen geschrieben. Das ist ziemlich praktisch, findest du nicht?

„Oh, ja. Praktisch. Du sagst es. Aber warum muss ich dann ständig schreiben:“
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
„Warum haben sie diesen Anwendungsfall nicht hinzugefügt?“

„Das Problem hier ist, dass ein  typisches Java-Programm nicht mit der Konsole arbeitet. Im echten Leben liest du eigentlich nie etwas von der Konsole. Sogar bei einem Webserver, Anwendungsserver oder einem anderen komplizierten System.“

Aber wir haben PrintStream für die Ausgabe von Daten und Text an die Konsole. Denn diese „Server-Anwendungen“ nutzen oft die Konsole, um ihren Status, Fehler und alle möglichen anderen Informationen anzuzeigen.

„Alles klar. Und mit FileReader und FileWriter kann man auch eine Datei kopieren?“

„Ja, wenn es sich um eine Textdatei handelt (sie also aus Zeichen besteht). Hier ist ein Beispiel:“

Eine Datei auf die Festplatte kopieren
public static void main(String[] args) throws Exception
{
 FileReader reader = new FileReader("c:/data.txt");
 FileWriter writer = new FileWriter("c:/result.txt");

 while (reader.ready()) //as long as there are unread bytes in the input stream
 {
  int data = reader.read(); //Read one character (the char will be widened to an int)
  writer.write(data); //Write one character (the int will be truncated/narrowed to a char)
 }

 //Close the streams after we done using them
 reader.close();
 writer.close();
}

„Fast keine Unterschiede.“

„Stimmt, die Unterschiede sind minimal.“