Java I/O - Universität zu Lübeck

Werbung
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
Herunterladen