22.01.2013 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 22.01.2013 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“); – File f = new File(“c:/windows“); • //Achtung: Doppelbackslash //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 • Pfadtrenner auf aktuellem System ist abfragbar – Besonders Laufwerke und Pfadtrenner sind problematisch – File.separatorChar (Typ char), File.separator (Typ String) – Alternativ: System.getProperty("file.separator“) • Beispiel • Ausgabe (Windows): 6 2 22.01.2013 Darstellung von Pfaden • String getName() • String getPath() – Gibt den Dateinamen zurück – 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 22.01.2013 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 22.01.2013 Beispiel: Rekursives Auflisten 13 Sonstige (wichtige) Methoden 14 Ein- und Ausgabe in Java 5 22.01.2013 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 Schreiben in Datei FileOutputStream Zeichen (oder Zeichen-Arrays, Strings) FileReader FileWriter 18 6 22.01.2013 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 22.01.2013 Ein- und Ausgabe in Java: InputStream 22 Ein- und Ausgabe in Java: OutputStream 23 Ein- und Ausgabe in Java: Reader 24 8 22.01.2013 Ein- und Ausgabe in Java: Writer 25 Klassen für die Eingabe Byte-Streams Zeichen-Streams InputStream Reader Beschreibung 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 ByteAusgabe BufferedOutputStream BufferedWriter Ausgabe des Puffers, nutzt passendes Zeilenendezeichen ByteArrayOutputStream CharArrayWriter Schreibt in Arrays 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 (keine Entsprechung) PipedWriter StringWriter Schreibt in eine Pipe Schreibt in einen String 27 9 22.01.2013 Beispiel: BufferedInputStream 28 Beispiel: BufferedReader 29 Beispiel: Internet-Streams • Aufgabe: Lesen einer Seite im Internet via http 30 10 22.01.2013 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