Vorlesung Programmieren Java I/O Dr. Dennis Pfisterer Institut für Telematik, Universität zu Lübeck http://www.itm.uni-luebeck.de/people/pfisterer Java I/O: Input und Output mit Java Heute Ein-/Ausgabe von Daten Grundlage fast aller Programme Auch: E/A (Eingabe/Ausgabe), I/O oder IO (Input/Output) Quelle und Ziel von Daten Dateien auf der Festplatte Ressourcen auf entfernten Rechnern (Webseite, Bild,...) Geräte (Drucker, Bildschirm, Serielle Schnittstelle, USB,...) Andere Programme Speicherbereiche 3 1
Dateien und Verzeichnisse Java stellt im package java.io Klassen für I/O bereit Dateien und Verzeichnisse: java.io.file Plattformübergreifende Abstraktion Problem der Darstellung von Pfaden Windows: c:\windows\system32\defrag.exe Unix: /usr/share/bug/tetex-bin/script Problem mit Laufwerksbuchstaben Unix kennt keine Laufwerke, nur / als Wurzelverzeichnis Windows nutzt Laufwerke statt Mountpoints 4 Die Klasse File Instanzen der Klasse File repräsentieren einen Speicherort Muss nicht physikalisch existieren Beispiele File f = new File( datei.txt ); //Datei datei.txt im aktuellen Verzeichnis File f = new File(../dir2 ); //Relative Pfadangaben Beispiele unter Windows File f = new File( c:\\windows ); //Achtung: Doppelbackslash File f = new File( c:/windows ); //Alternative: Forwardslash Beispiele unter Unix File f = new File( datei.txt ); //Datei datei.txt im aktuellen Verzeichnis File f = new File( /home/pfisterer/datei.txt ); //Absolute Angabe File f = new File( /dev/sda1 ); //Inhalt der Festplatte 5 Plattformabhängigkeit der Pfadangabe Angabe von Pfaden ist plattformabhängig Besonders Laufwerke und Pfadtrenner sind problematisch Pfadtrenner auf aktuellem System ist abfragbar File.separatorChar (Typ char), File.separator (Typ String) Alternativ: System.getProperty("file.separator ) Beispiel Ausgabe (Windows): 6 2
Darstellung von Pfaden String getname() Gibt den Dateinamen zurück String getpath() Gibt den Pfadnamen zurück String getabsolutepath(), File getabsolutefile() Liefert absoluten Pfad Besteht aus aktuellem Verzeichnis, Separator-Zeichen und Dateinamen String getcanonicalpath (), File getcanonicalfile() throws IOException Liefert eindeutigen, absoluten Pfad zurück (z.b. Entfernung von.. und.) Kann IOException werfen, da mitunter verbotene Dateizugriffe erfolgen boolean isabsolute() true, wenn der Pfad in der systemabhängigen Notation absolut ist 7 Laufwerke 8 Zugriff auf Laufwerke in Java Statische Methode java.io.file.listroots() listet Laufwerke Windows: alle Laufwerke, Unix: nur Rootverzeichnis / Nicht alle Roots müssen verfügbar sein (z.b. CD-Laufwerke) 9 3
Ermittlung des Speicherplatzes 10 Durchwandern von Verzeichnissen Ausgehend von einem Pfad Zum übergeordneten Verzeichnis wechseln Den Inhalt des Pfades ausgeben 11 Ermitteln des Typs einer File-Instanz Kann Verzeichnis oder Datei repräsentieren isdirectory prüft, ob es ein Verzeichnis ist isfile prüft, ob es eine Datei ist ishidden prüft, ob die Datei versteckt ist 12 4
Beispiel: Rekursives Auflisten 13 Sonstige (wichtige) Methoden 14 Ein- und Ausgabe in Java 5
I/O-Abstraktion in Java Sogenannte Streams (Ströme) von Daten Trennung von Input und Output Streams Sammlung von Klassen zum IO in java.io.* 16 Inhalt von Streams Streams unterstützen Bytes, primitive Datentypen, (lokalisierte) Zeichen, Objekte Für Programm ist ein Strom ein simples Konzept Sequenz von Daten Lesen und Schreiben immer Stück für Stück 17 Ein- und Ausgabe in Java Java abstrahiert von der eigentlichen Datenquelle Zwei grundlegende Konzepte Lesen von Bytes oder lesen von Zeichen Für byte-orientiertes I/O: *Stream Für zeichen-orientiertes I/O: *Reader / *Writer Beispiel für Dateien Bytes (oder Byte-Arrays) Lesen aus Datei FileInputStream FileReader Schreiben in Datei FileOutputStream FileWriter Zeichen (oder Zeichen-Arrays, Strings) 18 6
Beispiel: Lesen einer Datei Aufgabe: Ausgeben des Inhaltes einer Datei Spezielle Klasse zum Lesen einer Datei: FileInputStream read() liest jeweils ein Zeichen Liefert je ein Zeichen (-1 wenn die Datei fertig gelesen ist) 19 Beispiel: Lesen einer Datei in byte-array Lese Datei in byte[] Erstelle Histogramm der Buchstabenh äufigkeit 20 Beispiel: Schreiben in (Text-)Datei 21 7
Ein- und Ausgabe in Java: InputStream 22 Ein- und Ausgabe in Java: OutputStream 23 Ein- und Ausgabe in Java: Reader 24 8
Ein- und Ausgabe in Java: Writer 25 Klassen für die Eingabe Byte-Streams Zeichen-Streams Beschreibung InputStream Reader Abstrakte Klasse für Zeicheneingabe und Byte-Arrays BufferedInputStream BufferedReader Puffert die Eingabe LineNumberInputStream LineNumberReader Merkt sich Zeilennummern beim Lesen ByteArrayInputStream CharArrayReader Liest Zeichen-Arrays oder Byte-Arrays (keine Entsprechung) InputStreamReader Wandelt einen Byte-Stream in einen Zeichen-Stream um. Bindeglied zwischen Byte und Zeichen. DataInputStream (keine Entsprechung) Liest Primitive und auch UTF-8 FilterInputStream FilterReader Abstrakte Klasse für gefilterte Eingabe 26 Klassen für die Ausgabe Byte-Streams Zeichen-Streams Beschreibung OutputStream Writer Abstrakte Klasse für Zeichenausgabe oder Byte- Ausgabe BufferedOutputStream BufferedWriter ByteArrayOutputStream CharArrayWriter Schreibt in Arrays Ausgabe des Puffers, nutzt passendes Zeilenendezeichen DataOutputStream (keine Entsprechung) Schreibt Primitive und auch UTF-8 (keine Entsprechung) OutputStreamWriter Übersetzt Zeichen-Streams in Byte-Streams FileOutputStream FileWriter Schreibt in eine Datei PrintStream PrintWriter Konvertiert primitive Datentypen in Strings und schreibt sie in einen Ausgabestrom PipedOutputStream PipedWriter Schreibt in eine Pipe (keine Entsprechung) StringWriter Schreibt in einen String 27 9
Beispiel: BufferedInputStream 28 Beispiel: BufferedReader 29 Beispiel: Internet-Streams Aufgabe: Lesen einer Seite im Internet via http 30 10
Guter Stil Methoden sollten immer das generischste Interface akzeptieren z.b. InputStream, OutputStream, Writer, Reader Damit können sie maximal flexibel genutzt werden Security - 04 Cryptology #31 Verbesserte Variante Security - 04 Cryptology #32 Weitere Informationen http://java.sun.com/javase/7/docs/api/ http://openbook.galileocomputing.de/javainsel8/ http://java.sun.com/docs/books/tutorial/essential/io/ 33 11