09_ImportTextFiles
Code-Dateien
| Dateiname | Aktion |
|---|---|
| CODECode_Fenster.zip | Download |
| CODECode_Mitarbeiter_D.zip | Download |
| CODECode_Student.zip | Download |
PDF-Dokumente
| Dateiname | Aktion |
|---|---|
| PDFFolie_ImportTextFiles.pdf | Öffnen |
Videos
| Dateiname | Aktion |
|---|---|
| VIDEOVideo_Fahrzeug_D | Abspielen |
| VIDEOVideo_Fenster_D | Abspielen |
| VIDEOVideo_Mitarbeiter_D | Abspielen |
| VIDEOVideo_Student_D | Abspielen |
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.
- Variablen
FileReader fr;
BufferedReader br;
String zeile;👉 Bedeutung:
FileReader→ öffnet die DateiBufferedReader→ liest effizient Zeile für Zeilezeile→ speichert jeweils eine gelesene Zeile
- Datei öffnen
fr = new FileReader(filename);
br = new BufferedReader(fr);👉 Öffnet die Datei mit dem angegebenen Namen
👉 Beispiel:
fenster.txt
- Erste Zeile lesen
zeile = br.readLine();👉 liest die erste Zeile der Datei
👉 Ergebnis ist ein String oder null (bei
leerer Datei)
- Schleife: Datei durchgehen
while (zeile != null)👉 läuft, solange noch Zeilen vorhanden sind
- 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
KellerFensterwird 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
- Nächste Zeile lesen
zeile = br.readLine();👉 ganz wichtig: sonst Endlosschleife!
- Datei schließen
br.close();
fr.close();👉 Ressourcen werden freigegeben
- 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
doubleumbehandelt 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 …?“ 😄)