09_ImportTextFiles

Code-Dateien

DateinameAktion
CODECode_Fenster.zipDownload
CODECode_Mitarbeiter_D.zipDownload
CODECode_Student.zipDownload

PDF-Dokumente

DateinameAktion
PDFFolie_ImportTextFiles.pdfÖffnen

Videos

DateinameAktion
VIDEOVideo_Fahrzeug_DAbspielen
VIDEOVideo_Fenster_DAbspielen
VIDEOVideo_Mitarbeiter_DAbspielen
VIDEOVideo_Student_DAbspielen

Lernmaterialien

Import

Textdatei

K;Alu;250;Y
K;Holz;239;Y
K;Kunststoff;299;N
K;Kunststoff;199;N
S;Alu;3500;Y;Y
T;Alu;1200;Y;Y

Objekt erstellen

Aus einer Zeile soll ein neues Fenster (Object) erstellt werden.

Fenster.java

    public Fenster(String zeile) throws FensterException {
        String[] teile;

        try {
            teile = zeile.split(";");
            setMaterial(teile[1]);
            setPreis(Double.parseDouble(teile[2]));
            if (teile[3].equals("Y") || teile[3].equals("y"))
                setKippbar(true);
            else
                setKippbar(false);
        }
        catch (IndexOutOfBoundsException e) {
            throw new FensterException("Fehler: ungültige Datenzeile!");
        }
        catch (NumberFormatException e) {
            throw new FensterException("Fehler: keine Zahl als Preis!");
        }
    }

Das ist die allgemeine Zerlegung. Egal ob Kellerfenster, Terassentur oder Schiebetur.

Überblick

public Fenster(String zeile) throws FensterException

👉 Das ist ein Konstruktor, der ein Fenster-Objekt aus einer Textzeile erzeugt.
👉 Die Eingabe zeile enthält mehrere Werte, getrennt durch ;.

Beispiel:

F1;Holz;199.99;Y

Zerlegen der Eingabe

teile = zeile.split(";");

👉 Die Methode split(";") teilt den String an jedem ;.

Ergebnis:

teile[0] = "F1"
teile[1] = "Holz"
teile[2] = "199.99"
teile[3] = "Y"

Material setzen

setMaterial(teile[1]);

👉 Das Material wird aus dem Array gelesen
👉 z. B. "Holz"


Preis setzen

setPreis(Double.parseDouble(teile[2]));

👉 String → Double umwandeln
👉 "199.99"199.99

⚠️ Fehler möglich:

  • Wenn z. B. "abc" statt Zahl → NumberFormatException

Kippbar setzen

if (teile[3].equals("Y") || teile[3].equals("y"))
    setKippbar(true);
else
    setKippbar(false);

👉 Prüft, ob das Fenster kippbar ist

Wert Ergebnis
"Y" oder "y" true
alles andere false

Fehlerbehandlung (try-catch)

Fehler 1: zu wenige Daten

catch (IndexOutOfBoundsException e)

👉 passiert, wenn:

"F1;Holz"

👉 dann existiert z. B. teile[2] nicht

➡️ Reaktion:

throw new FensterException("Fehler: ungültige Datenzeile!");

Fehler 2: falsches Zahlenformat

catch (NumberFormatException e)

👉 passiert bei:

F1;Holz;abc;Y

➡️ Reaktion:

throw new FensterException("Fehler: keine Zahl als Preis!");

Wichtig: throws FensterException

👉 Der Konstruktor gibt Fehler weiter
👉 Wer den Konstruktor benutzt, muss den Fehler behandeln

Beispiel:

try {
    Fenster f = new Fenster("F1;Holz;199.99;Y");
} catch (FensterException e) {
    System.out.println(e.getMessage());
}
    public SchiebeTur(String zeile) throws FensterException {
        String[] teile;
        super(zeile);

        try {
            teile = zeile.split(";");
            if (teile[4].equals("Y") || teile[4].equals("y"))
                setBeideZumAufmachen(true);
            else
                setBeideZumAufmachen(false);
        }
        catch (IndexOutOfBoundsException e) {
            throw new FensterException("Fehler: ungültige Zeile!");
        }
    }

File importieren

    public void importFenster(String filename) throws FensterException {
        FileReader fr;
        BufferedReader br;
        String zeile;

        try {
            fr = new FileReader(filename);
            br = new BufferedReader(fr);

            zeile = br.readLine();
            while (zeile != null) {
                if (zeile.startsWith("K"))
                    addFenster(new KellerFenster(zeile));
                if (zeile.startsWith("S"))
                    addFenster(new SchiebeTur(zeile));
                if (zeile.startsWith("T"))
                    addFenster(new TerassenTur(zeile));
                zeile = br.readLine();
            }

            br.close();
            fr.close();
        }
        catch (FileNotFoundException e) {
            throw new FensterException("Fehler: kann Datei oder Pfad nicht finden!");
        }
        catch (IOException e) {
            throw new FensterException("Fehler: kann die Datei nicht lesen!");
        }
    }

🔹 Überblick

public void importFenster(String filename) throws FensterException

👉 Die Methode liest eine Datei ein und erzeugt daraus Fenster-Objekte.
👉 Diese werden dann mit addFenster(...) gespeichert.

  1. Variablen
FileReader fr;
BufferedReader br;
String zeile;

👉 Bedeutung:

  • FileReader → öffnet die Datei

  • BufferedReader → liest effizient Zeile für Zeile

  • zeile → speichert jeweils eine gelesene Zeile

  1. Datei öffnen
fr = new FileReader(filename);
br = new BufferedReader(fr);

👉 Öffnet die Datei mit dem angegebenen Namen
👉 Beispiel:

fenster.txt
  1. Erste Zeile lesen
zeile = br.readLine();

👉 liest die erste Zeile der Datei
👉 Ergebnis ist ein String oder null (bei leerer Datei)

  1. Schleife: Datei durchgehen
while (zeile != null)

👉 läuft, solange noch Zeilen vorhanden sind


  1. Objekterzeugung je nach Typ

Jetzt kommt der wichtigste Teil 👇

if (zeile.startsWith("K"))
    addFenster(new KellerFenster(zeile));

👉 Wenn die Zeile mit "K" beginnt:

  • → Objekt vom Typ KellerFenster wird erzeugt
if (zeile.startsWith("S"))
    addFenster(new SchiebeTur(zeile));

👉 "S"SchiebeTur

if (zeile.startsWith("T"))
    addFenster(new TerassenTur(zeile));

👉 "T"TerassenTur

Beispiel-Datei

K;Holz;120.0;Y
S;Kunststoff;200.0;N
T;Alu;350.0;Y

👉 Ergebnis:

  • 1 KellerFenster

  • 1 SchiebeTur

  • 1 TerassenTur

  1. Nächste Zeile lesen
zeile = br.readLine();

👉 ganz wichtig: sonst Endlosschleife!

  1. Datei schließen
br.close();
fr.close();

👉 Ressourcen werden freigegeben

  1. Fehlerbehandlung

Datei nicht gefunden

catch (FileNotFoundException e)

👉 passiert wenn:

  • Datei nicht existiert

  • falscher Pfad

➡️ Weitergabe als eigene Exception:

throw new FensterException("Fehler: kann Datei oder Pfad nicht finden!");

Lesefehler

catch (IOException e)

👉 passiert bei:

  • Fehler beim Lesen

  • beschädigte Datei

➡️:

throw new FensterException("Fehler: kann die Datei nicht lesen!");

Wichtiges Konzept dahinter

👉 Das ist ein klassisches Beispiel für:

Factory-Pattern (vereinfacht)

  • anhand eines Kennzeichens (K, S, T)

  • wird das passende Objekt erzeugt

Test

    @Test
    public void testImportFensterWrongData() {
        try {
            Haus meines = new Haus();
            meines.importFenster("fenster_wrong.txt");
            System.out.println(meines);
            assertEquals(1,0);
        }
        catch (FensterException e) {
            System.out.println(e.getMessage());
            assertEquals(1,1);
        }
    }

    @Test
    public void testImportFensterNoFile() {
        try {
            Haus meines = new Haus();
            meines.importFenster("alkjfdölsafkj.txt");
            System.out.println(meines);
            assertEquals(1,0);
        }
        catch (FensterException e) {
            System.out.println(e.getMessage());
            assertEquals(1,1);
        }
    }

    @Test
    public void testImportFensterOK() {
        try {
            Haus meines = new Haus();
            meines.importFenster("fenster.txt");
            System.out.println(meines);
            assertEquals(6, meines.anzahl());
        }
        catch (FensterException e) {
            System.out.println(e.getMessage());
            assertEquals(1,0);
        }
    }

👉 Der Konstruktor:

  • zerlegt eine Eingabezeile mit split(";")

  • liest daraus Material, Preis und Kippbarkeit

  • wandelt den Preis in double um

  • behandelt Fehler:

    • zu wenige Werte → eigene Exception

    • falsches Zahlenformat → eigene Exception

👉 Ziel:
➡️ robustes Einlesen von Daten aus Textdateien


Wenn du willst, kann ich dir typische Prüfungsfragen dazu geben (z. B. „Was passiert bei …?“ 😄)