"Hallo, Amigo! Gisteren vertelde Rishi je over FileInputStream en FileOutputStream . En vandaag vertel ik je over de klassen FileReader en FileWriter ."

Zoals je waarschijnlijk al geraden hebt, zijn al deze klassen adapters tussen het File-object en de InputStream- , OutputStream- , Reader- en Writer -interfaces.

"Ze lijken op adapters tussen File en Reader/Writer, maar je hoeft alleen een String-object door te geven aan de constructor, geen File!"

"Eigenlijk hebben ze verschillende constructors. Er zijn constructors voor zowel File- als String-objecten. Als je een String-object doorgeeft aan de constructor, zal de constructor stilletjes een File-object maken met behulp van het bestandspad dat is overgenomen van het doorgegeven String-object."

Dit is voor het gemak. De makers van Java hebben de meest voorkomende use-cases voor deze klassen genomen en constructors voor al deze klassen geschreven. Dat is best handig, vind je niet?

"Oh, ja. Handig. Daar ben ik het mee eens. Maar waarom moet ik dan constant schrijven:"
BufferedReader bufferedReader = nieuwe BufferedReader (nieuwe InputStreamReader (System.in));
"Waarom hebben ze deze use case niet toegevoegd?"

"Het probleem hier is dat een   typisch Java-programma niet werkt met de console. Eigenlijk lees je er bijna nooit iets van. Zelfs niet met een webserver, applicatieserver of een ander ingewikkeld systeem."

Maar we hebben wel PrintStream voor het uitvoeren van gegevens en tekst naar de console. Omdat deze «server-applicaties» vaak de console gebruiken om hun status, fouten en allerlei andere informatie weer te geven.

"Begrepen. En je kunt ook een bestand kopiëren met FileReader en FileWriter?"

"Ja, als het een tekstbestand is (dwz het bestaat uit tekens). Hier is een voorbeeld:"

Kopieer een bestand op schijf
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();
}

"Bijna geen verschillen."

"Ja, de verschillen zijn minimaal."