170 likes | 274 Views
E/A - Ströme (Streams) in Java. 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.*;
E N D
E/A - Ströme (Streams) in Java HS Merseburg WS 05/06
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 Netzwerk-Kommunikationskanäle). HS Merseburg WS 05/06
Eingabestream Ausgabestream HS Merseburg WS 05/06
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). HS Merseburg WS 05/06
Öffnen des Stream while (mehr Daten) Lesen Schreiben read (Daten) Schließen des Stream Öffnen des Streams while (mehr Daten) write (Daten) Schließen des Stream HS Merseburg WS 05/06
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). HS Merseburg WS 05/06
Byte Streams InputStream undOutputStream 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: HS Merseburg WS 05/06
public abstract class java.io.InputStream { public InputStream(); // Konstruktor public int available();// liefert Anzahl der Zeichen, die noch gelesen werden kann 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(); // liest das nächste Byte aus dem Eingabestrom und liefert // 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 public void reset(); // Setzt Lesezeiger an markierte Stelle zurück public void skip(long n); // überspringt n Zeichen im Eingabestrom HS Merseburg WS 05/06
Wahl des Eingabegerätes • ... bestimmt die Art des Datenlieferanten • abgeleitete Klassen: • 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
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; HS Merseburg WS 05/06
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);} HS Merseburg WS 05/06
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. HS Merseburg WS 05/06
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 • Differenziertere Fehlerbehandlung ist möglich. HS Merseburg WS 05/06
Readerund 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) HS Merseburg WS 05/06