Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| programmierung:eingabe [2024/08/30 14:35] – created swe | programmierung:eingabe [2025/12/20 14:53] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | Das Problem, beliebig lange Eingaben mit einem Scanner und einer while-Schleife zu verarbeiten, | + | < |
| - | ### Allgemeine Überlegungen | + | # Dateien und Datenströme |
| + | |||
| + | ## Dateien | ||
| + | - Speicherstrukturen für Daten | ||
| + | - Herkunft des Wortes _file_ | ||
| + | - aus dem Altfranzösischen Wort " | ||
| + | - Im Mittelalter wurden Dokumente oft an einem Faden oder Draht befestigt, um sie zusammenzuhalten. | ||
| + | - So entstand die Bedeutung des Wortes " | ||
| + | - Im Deutschen: Datei = Daten + Kartei | ||
| + | --- | ||
| + | ## Datenströme | ||
| - | 1. **Benutzereingaben verarbeiten**: | + | - kontinuierliche Datenflüsse von Quelle |
| - | - In vielen Anwendungen ist es notwendig, Benutzereingaben | + | - Input / Output |
| - | | + | - Dateien " |
| - | 2. **Endlos-Schleifen vermeiden**: | + | --- |
| - | | + | ## Typen von Datenströmen |
| - | | + | ### Byte-Streams |
| + | - Folge von Bytes | ||
| + | - Für Menschen nicht lesbar | ||
| + | - Arbeiten mit `InputStream` und `OutputStream` und sind für Binärdaten wie Bilder oder Videos geeignet. | ||
| + | ### Text (Binär)-Streams | ||
| + | - Folge von Zeichen (Unicode) | ||
| + | - Arbeiten mit `Reader` und `Writer`, speziell für Textdaten in Unicode. | ||
| - | 3. **Eingaben validieren**: | + | --- |
| - | - Die Validierung der Eingaben ist entscheidend, | + | |
| - | - Dies kann durch einfache Überprüfungen (z.B. ob die Eingabe leer ist) oder komplexere Validierungen (z.B. ob die Eingabe einem bestimmten Format entspricht) erfolgen. | + | |
| - | 4. **Ressourcenmanagement**: | + | ## Java I/O-Grundlagen |
| - | - Es ist wichtig, Ressourcen wie den Scanner ordnungsgemäß zu verwalten und zu schließen, um Speicherlecks zu vermeiden. | + | ```java |
| - | - In Java wird dies durch das Schließen des Scanner-Objekts mit `scanner.close()` erreicht. | + | import java.io.* |
| + | ``` | ||
| - | ### Beispielanwendung | + | Die java.io-Bibliothek |
| + | - für Ein- und Ausgabefunktionen verwendet werden | ||
| + | - Daten lesen/ | ||
| + | - Dateien | ||
| + | - Konsole | ||
| + | - Streams | ||
| + | |||
| + | --- | ||
| - | Stell dir vor, du schreibst ein Programm, das Benutzereingaben liest und diese verarbeitet, | ||
| - | ### Fazit | + | |
| - | Die Verwendung eines Scanners | + | ## Wichtigste Klassen |
| + | ### Byte-Streams | ||
| + | - Verschiede InputStreams/ | ||
| + | - Arbeiten byteweise | ||
| + | - Beispiele: `FileInputStream`, | ||
| + | --- | ||
| + | ```java | ||
| + | import java.io.FileInputStream; | ||
| + | import java.io.FileOutputStream; | ||
| + | import java.io.IOException; | ||
| + | |||
| + | public class StreamExample { | ||
| + | public static void main(String[] args) { | ||
| + | try (FileOutputStream fos = new FileOutputStream(" | ||
| + | fos.write(new byte[]{65, 66, 67}); // A, B, C | ||
| + | } catch (IOException e) { | ||
| + | e.printStackTrace(); | ||
| + | } | ||
| + | |||
| + | try (FileInputStream fis = new FileInputStream(" | ||
| + | int b; | ||
| + | while ((b = fis.read()) != -1) { | ||
| + | System.out.print((char) b); | ||
| + | } | ||
| + | } catch (IOException e) { | ||
| + | e.printStackTrace(); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | ``` | ||
| + | |||
| + | ### Text-Streams | ||
| + | - Verschiedene Reader/ | ||
| + | - Arbeiten | ||
| + | - `FileReader`/ | ||
| + | |||
| + | - Lesen und Schreiben von Textdateien | ||
| + | - Zeichen für Zeichen | ||
| + | - `BufferedReader`/ | ||
| + | - Puffern Daten | ||
| + | - Effizientere Verarbeitung von Textdateien | ||
| + | --- | ||
| + | #### FileReader/ FileWriter | ||
| + | ```java | ||
| + | import java.io.FileReader; | ||
| + | import java.io.IOException; | ||
| + | |||
| + | public class FileReaderExample { | ||
| + | public static void main(String[] args) { | ||
| + | try (FileReader reader = new FileReader(" | ||
| + | int ch; | ||
| + | | ||
| + | System.out.print((char) ch); | ||
| + | } | ||
| + | } catch (IOException e) { | ||
| + | e.printStackTrace(); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | ``` | ||
| + | |||
| + | #### FileReader/ FileWriter | ||
| + | ```java | ||
| + | import java.io.FileWriter; | ||
| + | import java.io.FileReader; | ||
| + | import java.io.IOException; | ||
| + | |||
| + | public class FileReaderWriterExample { | ||
| + | public static void main(String[] args) { | ||
| + | try (FileWriter writer = new FileWriter(" | ||
| + | writer.write(" | ||
| + | } catch (IOException e) { | ||
| + | e.printStackTrace(); | ||
| + | } | ||
| + | |||
| + | try (FileReader reader = new FileReader(" | ||
| + | int ch; | ||
| + | while ((ch = reader.read()) != -1) { | ||
| + | System.out.print((char) ch); | ||
| + | } | ||
| + | } catch (IOException e) { | ||
| + | e.printStackTrace(); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | ``` | ||
| + | --- | ||
| + | #### BufferedReader/ | ||
| + | ```java | ||
| + | import java.io.BufferedReader; | ||
| + | import java.io.FileReader; | ||
| + | import java.io.IOException; | ||
| + | |||
| + | public class BufferedReaderExample { | ||
| + | public static void main(String[] args) { | ||
| + | try (BufferedReader reader = new BufferedReader(new FileReader(" | ||
| + | String line; | ||
| + | while ((line = reader.readLine()) != null) { // Zeilenweise lesen | ||
| + | System.out.println(line); | ||
| + | } | ||
| + | } catch (IOException e) { | ||
| + | e.printStackTrace(); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | ``` | ||
| + | |||
| + | |||
| + | #### BufferedReader/ | ||
| + | |||
| + | ```java | ||
| + | import java.io.*; | ||
| + | |||
| + | public class BufferedReaderWriterExample { | ||
| + | public static void main(String[] args) { | ||
| + | try (BufferedWriter writer = new BufferedWriter(new FileWriter(" | ||
| + | writer.write(" | ||
| + | } catch (IOException e) { | ||
| + | e.printStackTrace(); | ||
| + | } | ||
| + | |||
| + | try (BufferedReader reader = new BufferedReader(new FileReader(" | ||
| + | String line; | ||
| + | while ((line = reader.readLine()) != null) { | ||
| + | System.out.println(line); | ||
| + | } | ||
| + | } catch (IOException e) { | ||
| + | e.printStackTrace(); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | ``` | ||
| + | --- | ||
| + | ### Wann verwende ich was | ||
| + | - `FileReader` | ||
| + | - kleinere Dateien | ||
| + | - Bei Notwendigkeit von zeichenweisem Einlesen | ||
| + | - `BufferedReader` | ||
| + | - effizientes Lesen von Textdaten. | ||
| + | - **Best Practices**: | ||
| + | - **try-with-resources**: | ||
| + | zu vermeiden. | ||
| + | - **Fehlerbehandlung**: | ||
| + | |||
| + | --- | ||
| + | ### Datei neu erstellen vs. Daten an bestehende Datei anhängen | ||
| + | |||
| + | ```java | ||
| + | ... | ||
| + | public static void main(String[] args) { | ||
| + | String filePath = " | ||
| + | |||
| + | // Schreiben in die Datei (überschreibt den bestehenden Inhalt) | ||
| + | try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) { | ||
| + | writer.write(" | ||
| + | writer.newLine(); | ||
| + | writer.write(" | ||
| + | System.out.println(" | ||
| + | } catch (IOException e) { | ||
| + | System.out.println(" | ||
| + | } | ||
| + | |||
| + | // Anhängen an die Datei | ||
| + | try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath, true))) { | ||
| + | writer.newLine(); | ||
| + | writer.write(" | ||
| + | writer.newLine(); | ||
| + | writer.write(" | ||
| + | System.out.println(" | ||
| + | } catch (IOException e) { | ||
| + | System.out.println(" | ||
| + | } | ||
| + | } | ||
| + | ... | ||
| + | ``` | ||
| + | --- | ||
| + | ## What about Scanner? | ||
| + | - Hauptsächliche Verwendung | ||
| + | - Nicht nur Dateien lesen kann, sondern auch | ||
| + | - Parsen von Eingaben bietet | ||
| + | - flexibler, aber oft weniger performant bei großen Datenmengen geht | ||
| + | |||
| + | --- | ||
| + | |||
| + | ### Vergleich: Scanner vs BufferedReader vs FileReader | ||
| + | |||
| + | | **Kriterium** | ||
| + | |-----------------------------|-----------------------------------------------|-----------------------------------------------|------------------------------------------------| | ||
| + | | **Hauptzweck** | ||
| + | | **Lesemethoden** | ||
| + | | **Performance** | ||
| + | |||
| + | --- | ||
| + | |||
| + | |||
| + | ### Wann sollte man welchen verwenden? | ||
| + | |||
| + | - `Scanner` | ||
| + | - Parsing | ||
| + | - Anwendungen, bei denen unterschiedliche Datentypen aus der Eingabe verarbeitet werden sollen. | ||
| + | - `BufferedReader` | ||
| + | - schneller | ||
| + | - Zeilenweise Textverarbeitung | ||
| + | - ohne Dateninterpretation | ||
| + | - `FileReader` | ||
| + | - einfachste Variante | ||
| + | - wird wegen fehlender Effizienz und Flexibilität seltener verwendet | ||