10 Streams E/A - Ströme (Streams) in Java Java HS Merseburg WS 05/06 10 Streams Java bietet eine umfangreiche Bibliothek • zum sequentiellen Zugriff auf Dateien, • für wahlfreie Dateioperationen und • zur Verwaltung von Verzeichnissen. Alle Klassen zur (Datei-)Ein- und Ausgabe befinden sich im Paket java.io import java.io.*; Sequentieller Zugriff auf Dateien erfolgt über das Konzept der Streams. Streams: ... abstraktes Konstrukt, dessen Fähigkeit darin besteht, Zeichen auf ein imaginäres Ausgabegerät zu schreiben oder von diesem zu lesen. Erst konkrete Unterklassen binden die Zugriffsroutinen an echte Ein- und Ausgabegeräte (Dateien, Strings oder NetzwerkKommunikationskanäle). Java HS Merseburg WS 05/06 10 Streams Eingabestream Ausgabestream Java HS Merseburg WS 05/06 10 Streams Streams können verkettet und verschachtelt werden. Verkettung: Dateien werden zusammengefasst und für den Aufrufer als ein einziger Stream dargestellt. Verschachtelung: ... erlaubt die Konstruktion von Filtern, die bei der E/A bestimmte Zusatzfunktionen (Puffern von Zeichen, Zählen von Zeilen, Interpretation binärer Daten) übernehmen Beide Konzepte sind mit normalen Sprachmitteln realisiert und können selbst erweitert werden (eigene Filter zur Analyse des Eingabestroms). Java HS Merseburg WS 05/06 10 Streams Lesen Schreiben Öffnen des Stream Öffnen des Streams while (mehr Daten) while (mehr Daten) read (Daten) write (Daten) Schließen des Stream Java Schließen des Stream HS Merseburg WS 05/06 10 Streams Character Streams Reader und Writer sind die abstrakten Superklassen für Character Streams. Reader bieten ein API und eine teilweise Implementation für das Lesen von 16-bit character Werten. Writer bieten entsprechend ein API für das Schreiben von 16-bit character Werten. Die Unterklassen von Reader und Writer implementieren spezialisierte Streams und können in zwei Kategorien unterteilt werden: • Klassen die von/in Datenquellen lesen/schreiben (grau) • Klassen die (Stream-) Daten verarbeiten (weiss). Java HS Merseburg WS 05/06 10 Java Streams HS Merseburg WS 05/06 10 Java Streams HS Merseburg WS 05/06 10 Streams Byte Streams InputStream und OutputStream sind die abstrakten Superklassen für Byte Streams. InputStream und OutputStream bieten ein API und eine partielle Implementation für Streams die 8-bit Werte (Bytes) lesen und schreiben. Diese Streams werden insbesondere für das Lesen und Schreiben von Binärdateien verwendet. Zwei dieser Bytestreamklassen, ObjectInputStream und ObjectOutputStream, werden für die Objekt-Serialisierung verwendet. Wie bei den Reader und Writer Klassen, bieten auch die Unterklassen von InputStream und OutputStream spezielle I/O Klassen an: Java HS Merseburg WS 05/06 10 Java Streams HS Merseburg WS 05/06 10 Streams public abstract class java.io.InputStream { public InputStream(); // Konstruktor public int available(); kann // liefert Anzahl der Zeichen, die noch gelesen werden public void close(); // schließt den Eingabestrom public void mark(int readlimit); // markiert eine Position im Eingabestrom (vorher prüfen, // sonst Ausnahme) public boolean marksupported(); // Prüfen, ob Markieren unterstützt wird public abstract int read(); liefert // liest das nächste Byte aus dem Eingabestrom und // es als int (-1 = Ende des Eingabestroms) public int read(byte b[]); public int read(byte b[], int off, int len); // überträgt eine Reihe von Zeichen in das als P // übergebene Array und liefert Anzahl der gelesenen Zeichen als Rückgabewert Java public void reset(); HS Merseburg WS 05/06an markierte Stelle zurück // Setzt Lesezeiger 10 Streams Wahl des Eingabegerätes ... bestimmt die Art des Datenlieferanten abgeleitete Klassen: Java • FileInputStream Eingabe aus Datei • StringBufferInputStream Eingabe aus einem String • SequenceInputStream Verkettung von Eingabe Streams • PipedInputStream Eingabe aus Netzwerk-Pipe • FilterInputStream Filterung von Eingabe Streams HS Merseburg WS 05/06 10 Streams FileInputStream ... lesen aus einer Datei Konstruktoren public FileInputStream(String name) throws FileNotFoundException; // öffnet Datei name zum Lesen public FileInputStream(FileDescriptor fdObj) throws FileNotFoundException; // spezifiziert eine bereits geöffnete Datei public FileInputStream(File file) throws FileNotFoundException; Java HS Merseburg WS 05/06 10 Streams public abstract class java.io.OutputStream { public OutputStream(); // Konstruktor public void close(); public void flush(); public abstract void write(int b); public void write(byte b[]); public void write(byte b[], int off, int len);} Java HS Merseburg WS 05/06 10 Streams Die Wahl des Ausgabegerätes Als abstrakte Klasse kann OutputStream/InputStream nicht instanziert werden, daher wurden verschiedene konkrete Klassen abgeleitet, deren Aufgabe es ist, die Verbindung zu einem konkreten Ausgabegerät herzustellen: FileOutputStream Ausgabe in eine Datei ByteArrayOutputStream Ausgabe in ein dynamisches Array von Byte PipedOutputStream Ausgabe in eine Netzwerk-Pipe FilterOutputStream Filterung von Ausgabe-Streams FileOutputStream ... ermöglicht schreibenden Zugriff auf sequentielle Dateien und implementiert die abstrakten Eigenschaften von OutputStream. Java HS Merseburg WS 05/06 10 Streams zusätzliche Konstruktoren: public FileOutputStream(String name) throws IOException; // Öffnen (Inhalt löschen) bzw. Anlegen einer Datei durch Übergabe des Dateinamens public FileOutputStream(FileDescriptor fdObj) throws IOException; // Öffnen (Inhalt löschen) bzw. Anlegen einer Datei durch Übergabe des Dateidescriptors public FileOutputStream(File file) throws IOException; // File-Objekt: Repräsentation einer Datei im Kontext ihres Verzeichnisses Alle Methoden der Klasse deklarieren als Ausnahme IOException als allgemeine Fehleranzeige • Konstruktor: Datei kann nicht angelegt werden • write: Schreibfehler • close: nicht näher spezifizierter I/O-Fehler Java HS Merseburg 05/06 Differenziertere Fehlerbehandlung istWS möglich. 10 Streams Reader und InputStream definieren ähnliche APIs für unterschiedliche Datentypen. Beispiel: Reader- Methoden zum lesen von Zeichen und Z.-Arrays • int read() • int read(char cbuf[]) • int read(char cbuf[], int offset, int length) InputStream Methoden zum Lesen von Bytes • int read() • int read(byte cbuf[]) • int read(byte cbuf[], int offset, int length) Writer und OutputStream verhalten sich ähnlich int write(char c) , int write(char cbuf[]) int write(char cbuf[],int offset, int length) int write(int c) int write(byte cbuf[]) int write(byte cbuf[], int offset, int length) Java HS Merseburg WS 05/06