Einführung in Reader- und Writerklassen

Einführung in Reader- und Writerklassen

Die Reader- und Writer-Klassen in Java ermöglichen die Verwaltung von Zeichenströmen. Mit den spezialisierten Klassen FileReader und FileWriter können Dateien als Quelle bzw. Ziel angegeben werden:

  • FileReader(File f)
  • FileWriter(File f)

Ihre Oberklassen InputStreamReader und OutputStreamWriter ermöglichen die Konvertierung von Streams:

  • InputStreamReader(InputStream in)
  • OutputStreamWriter(OutputStream out)

Damit kann ein Byte-Stream (inputStream) in einen Zeichen-Stream (Reader) umgewandelt werden. Dies ist nützlich, wenn Sie eine Binärdatei (Byte-Stream) in eine Datei (Zeichen-Stream) schreiben möchten.

Einführung in Reader- und Writerklassen

Im folgenden Beispiel wird gezeigt, wie Sie einen Zeichen-Stream von der Konsole lesen und in eine Datei schreiben können. Die Java-Klasse System bietet über das Attribut System.in Zugriff auf einen InputStream mit Konsoleneingaben und auf Konsolenausgaben (System.out).

/* Ein Beispielprogramm, das von der Konsole liest und in eine Datei schreibt */
package s2.io;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.Writer;

public class SchreibInDatei {

    public static void main(String[] args) {
        try {
            String f = "scalingbits.txt";
            File datei = new File(f);
            Reader rein = new InputStreamReader(System.in);
            Writer raus = new FileWriter(datei);
            System.out.println("Der Text der jetzt eingegeben wird, wird in der Datei " + f + " gespeichert");
            System.out.println("Abschliessen mit Strg-Z oder Ctrl-Z");
            System.out.println("Abschliessen auf Unix/Linux mit Ctrl-D");
            System.out.println("Abschliessen auf Mac mit IntelliJ mit Cmd-D");
            umkopieren(rein,raus);
        } catch (IOException ex) {
            System.out.println("Probleme im IO Subsystem. Scotty beam me up");
        }
    }

    public static void umkopieren(Reader r, Writer w) throws IOException{
        int c;
        while ((c= r.read()) != -1 ) {
            w.write(c);
        }
        r.close();
        w.close();
    }
}

Übung: Datei auslesen und auf der Konsole drucken

Erweitern Sie die Anwendung so, dass sie die geschriebene Datei wieder ausliest und auf der Konsole ausgibt. Sie können die Methode umkopieren() wiederverwenden.

LESEN  Saxophonunterricht Bergstrasse: Welches Saxophon ist das richtige für dich?

Frage: Welche Klassen benötigen Sie dafür?

Sie werden doch nicht auf diesen Hyperlink klicken: github s2.io.SchreibInDateiLoesung.java

Das Lesen bzw. Schreiben einzelner Bytes oder Zeichen vom Netzwerk oder von Dateien ist oft sehr ineffizient. Zum effizienteren Umgang mit größeren Datenmengen stellt Java die Klassen BufferedReader und BufferedWriter zur Verfügung. Diese Klassen speichern die Daten zwischenzeitlich in einem Puffer und lesen bzw. schreiben die Daten in größeren Blöcken. Diese gepufferten Klassen müssen mit den elementaren Klassen verkettet werden. Deshalb haben sie folgende Konstruktoren:

  • public BufferedReader(Reader in): zur Erzeugung eines gepufferten Stroms zum Lesen
  • public BufferedWriter(Writer out): zur Erzeugung eines gepufferten Stroms zum Schreiben

Sie verfügen über zusätzliche Methoden zum gepufferten Lesen und Schreiben:

  • BufferedReader.readLine(): Liest eine Textzeile bis zum nächsten Zeilenumbruch (‘n’ oder ‘r’)
  • BufferedWriter.newLine(): Schreibt einen Zeilenwechsel in den Puffer

Wenn Sie diese Klassen im Beispiel verwenden, gibt es eine Reihe von Veränderungen:

  • mit BufferedReader.readLine() erhalten Sie eine Zeichenkette als Ergebnis (oder einen Nullzeiger!)
  • beim Schreiben müssen Sie den Zeilenumbruch selbst hinzufügen

Die Klasse SchreibInDateiGepuffered

/* Eins Beispielprogramm, das von der Konsole liest und in eine Datei schreibt */
package s2.io;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class SchreibInDateiGepuffered {
    public static void main(String[] args) {
        try {
            String f = "scalingbits.txt";
            File datei = new File(f);
            BufferedReader rein = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter raus = new BufferedWriter(new FileWriter(datei));
            System.out.println("Der Text der jetzt eingegeben wird, wird in der Datei " + f + " gespeichert");
            System.out.println("Abschliessen mit Strg-Z oder Ctrl-Z");
            System.out.println("Abschliessen auf Unix/Linux mit Ctrl-D");
            System.out.println("Abschliessen auf Mac mit IntelliJ mit Cmd-D");
            umkopieren(rein,raus);
            rein = new BufferedReader(new FileReader(f));
            raus = new BufferedWriter(new OutputStreamWriter(System.out));
            System.out.println("Ausgabe des in Datei " + f + " gespeichertem Texts");
            umkopieren(rein,raus);
        } catch (IOException ex) {
            System.out.println("Probleme im IO Subsystem. Scotty beam me up");
        }
    }

    public static void umkopieren(BufferedReader r, BufferedWriter w) throws IOException{
        String z;
        while ((z = r.readLine()) != null) {
            w.write(z);
            w.newLine();
        }
        r.close();
        w.close();
    }
}

Die Datei SchreibInDateiGepuffered finden Sie in diesem Github-Repository.

LESEN  LED oder Energiesparlampe? – Die beste Wahl für die Zukunft des Lichts