Java 10 Streams

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