dvg2 - 06 - datenströme1 datenströme. dvg2 - 06 - datenströme2 filter und pipes in unix...
Post on 05-Apr-2015
105 Views
Preview:
TRANSCRIPT
DVG2 - 06 - Datenströme 1
Datenströme
DVG2 - 06 - Datenströme 2
Filter und PipesIn UNIX eingeführte Abstraktion beim Datenaustausch Programme arbeiten als Erzeuger und/oder als Verbraucher von
Datenströmen ==> Filter Die Erzeuger- und Verbraucherschnittstelle ist standardisiert. Ausgabestrom eines Programms kann als Eingabestrom eines
anderen Programms verwendet werden. ==> Pipe Standard:
Eingabestrom = TastaturAusgabestrom = Bildschirm
DVG2 - 06 - Datenströme 3
Umleitung von Datenströmen
Umleitung von Datenströmen wird vom System unterstützt: ">" bzw. ">>" Umleitung des Ausgabedatenstroms
z.B.: programm > ausgabe.datleitet die Ausgabe des Programms in eine Datei um ">" erzeugt neue Datei, ">>" hängt an vorhandene Datei an
"<" Umleitung des Eingabedatenstromsz.B.: programm < eingabe.datprogramm liest die Eingaben von einer Datei statt von der Tastatur
"|" Verbindet die Ausgabe eines Programms mit der Eingabe eines anderen Programmsz.B.: programm1 | programm2der von programm1 erzeugte Ausgabestrom wird von programm2 als Eingabestrom benutzt
Kombinationen sind möglich:z.B.: p1 < i.dat | p2 | p3 > o.dat
DVG2 - 06 - Datenströme 4
Filter
ProgrammFilter
Eingabestrom Ausgabestrom
System.in System.out
DVG2 - 06 - Datenströme 5
Pipes
ProgrammFilter
Eingabestrom Ausgabestrom
ProgrammFilter
Eingabestrom Ausgabestrom
Pipe
DVG2 - 06 - Datenströme 6
Schichtenmodell Zwischen dem Programm und den konkreten Datenströmen existiert
eine standardisierte Schnittstelle. Dadurch kann der größte Teil eines Programms unabhängig von dem konkreten Medium entwickelt werden auf dem die Daten strömen.
Ein- und Ausgabeströme beschreiben nur den einfachsten Transport von Bytes, d.h. es sind weder Datentypen noch Strukturen bekannt.
Der Transport komplexer Daten wird durch aufgesetzte Schichten beschrieben.
DVG2 - 06 - Datenströme 7
Datenerzeuger Datenverbraucher
Schichtenmodell
Bytetransport
Datenstrom
gepufferter Transport
Bytetransport
gepufferter Transport
Datenstrom
RAM Pipe Pipe RAMFileNetz
Internet
File
Internet
Netz
DVG2 - 06 - Datenströme 8
Realisierungen in JAVA Eingabestrom: System.in Ausgabestrom: System.out Klasse für Eingabeströme: InputStream Klasse für Ausgabeströme: OutputStream Problem: Darstellung der Zeichen in JAVA als Unicode und im
Betriebssystem als ASCII Konvertierung erforderlich Klasse für Eingabeströme als Zeichen: Reader Klasse für Ausgabeströme als Zeichen: Writer Die Klassen InputStream, OutputStream, Reader und
Writer sind abstrakte Klassen. Es fehlt die Realisierung der Methoden read bzw. write. Diese Klassen realisieren die standardisierte Schnittstelle zwischen Programm und konkreten Datenströmen.
DVG2 - 06 - Datenströme 9
Die Klassen InputStream und Reader Die Klassen InputStream und Reader stellen Basismethoden zum
Lesen von Eingabeströmen zur Verfügung oder definieren sie als abstrakte Methoden. Sie dienen als Basis zur Definition verschiedenster Zugriffsverfahren.
InputStream liest Bytes. Reader liest ASCI-Zeichen und wandelt sie in Unicode-Zeichen um. Beide Klassen definieren ähnliche Methoden wobei InputStream
mit byte-Größen arbeitet und Reader mit char-Größen.
DVG2 - 06 - Datenströme 10
Methoden von InputStream und Reader int available()
gibt die Anzahl der Bytes bzw. Zeichen aus, die noch gelesen werden können
abstract void close()schließt den Eingabedatenstrom
void mark(int readlimit)markiert die gerade gelesene Position für reset(), nach lesen von readlimit Bytes bzw. Zeichen wird die gemerkte Position ungültig
boolean markSupported()testet ob die mark-reset-Funktion unterstützt wird
abstract int read()liest ein Byte bzw. Zeichen ein und gibt dieses als int aus, wenn das Ende des Datenstroms erreicht wird, wird -1 ausgegeben
int read (byte[] b)int read (char[] b)es werden maximal b.length Bytes bzw. Zeichen in das Feld b gelesen
DVG2 - 06 - Datenströme 11
int read (byte[] b, int off, int len)abstract int read (char[] b, int off, int len)es werden maximal len Bytes bzw. Zeichen in das Feld b ab Position off gelesen
void reset()setzt den Eingabestrom auf die mit mark() gemerkte Position zurück
long skip(long n)überspringt im Eingabestrom n Bytes bzw. Zeichen und gibt die Anzahl der übersprungenen Zeichen zurück
DVG2 - 06 - Datenströme 12
Die Klassen OutputStream und Writer Die Klassen OututStream und Writer stellen Basismethoden zum
Schreiben von Ausgabeströmen zur Verfügung oder definieren sie als abstrakte Methoden. Sie dienen als Basis zur Definition verschiedenster Zugriffsverfahren.
OutputStream schreibt Bytes. Writer wandelt Unicode-Zeichen um und schreibt sie als ASCI-
Zeichen. Beide Klassen definieren ähnliche Methoden wobei OutputStream
mit byte-Größen arbeitet und Writer mit char-Größen.
DVG2 - 06 - Datenströme 13
Methoden von OutputStream und Writer
abstract void close()schließt den Ausgabedatenstrom
abstract void flush()bei gepufferter Ausgabe werden die Daten im Puffer geschrieben und der Puffer geleert
abstract void write(int b)schreibt ein Byte bzw. Zeichen
void write (byte[] b)void write (char[] b)es werden b.length Bytes bzw. Zeichen geschrieben
void write(byte[] b, int off, int len)abstract void write(char[] b, int off, int len)es werden len Bytes bzw. Zeichen in des Feldes b ab Position off geschrieben
DVG2 - 06 - Datenströme 14
Methoden der Klasse Writer
void write (String str)es werden str.length() Zeichen geschrieben
void write(String str, int off, int len)es werden len Zeichen in der Zeichenkette str ab Position off geschrieben
DVG2 - 06 - Datenströme 15
InputStream, Reader, OutputStream und Writer sind die allgemeinen Basisklassen aller Klassen für die Ein- und Ausgabe von Daten. Alle I/O-Klassen des Packeges java.io werden von diesen Klassen abgeleitet.
Objekte dieser Klassen können verwendet werden, wenn ein Programm möglichst unabhängig von der Quelle bzw. dem Ziel der Daten sein sollen.Z.B.:
InputStream in;
if ( Quelle == File) in = new FileInputStream("datei");
if ( Quelle == RAM ) in =new ByteArrayInputStream(buffer);
if ( Quelle == thread ) in = new PipedInputStream();
....
int z = in.read();
DVG2 - 06 - Datenströme 16
OutputStream/Writer InputStream/Reader
Bytetransport
Datenstrom
gepufferter Transport
Bytetransport
gepufferter Transport
Datenstrom
RAM Pipe Pipe RAMFileNetz
Internet
File
Internet
Netz
DVG2 - 06 - Datenströme 17
Verknüpfung von Datenströmen Datenströme können mit verschiedenen Quellen und Senken
verbunden werden: Hauptspeicherbereiche Dateien Internetdateien Pipes
Datenströme können verschieden interpretiert werden Bytes Zeichen primitive Datentypen Objekte Tokens
DVG2 - 06 - Datenströme 18
Datenströme können verschieden organisiert sein gepuffert ungepuffert
Es kann unterschiedliche Zugriffsarten für Datenströme geben sequentiell direkt
Alle diese Eigenschaften können kombiniert werden.
DVG2 - 06 - Datenströme 19
FileInputStream und FileReader
Dienen dem Lesen von Dateien. Realisieren alle Methoden der Klasse InputStream bzw. Reader.
Konstruktoren von FileInputStream FileInputStream(File file) FileInputStream(FileDescriptor fdObj)FileDescriptor realisiert eine eindeutige Kennung für einen Datenstrom.
FileInputStream(String name)name ist der Name der zu lesenden Datei
Konstruktoren von FileReader FileReader(File file) FileReader(FileDescriptor fdObj) FileReader(String name)name ist der Name der zu lesenden Datei
DVG2 - 06 - Datenströme 20
Beispiel: Lesen einer Datei
File inFile = new File(args[0]);Reader inReader = new FileReader(inFile);int z;while ( (z=inReader.read()) >=0 ) System.out.print((char)z);inReader.close();
DVG2 - 06 - Datenströme 21
FileOutputStream und FileWriter
Dienen dem Schreiben von Dateien. Realisieren alle Methoden der Klasse OutputStream bzw. Writer.
Konstruktoren von FileOutputStream FileOutputStream(File file) FileOutputStream(FileDescriptor fdObj) FileOutputStream(String name)name ist der Name der zu schreibenden Datei
FileOutputStream(String name, boolean append)append == true : Daten werden an die Datei angehängt
Konstruktoren von FileWriter FileWriter(File file) FileWriter(FileDescriptor fdObj) FileWriter(String name)name ist der Name der zu schreibenden Datei
FileWriter(String name, boolean append)
DVG2 - 06 - Datenströme 22
Beispiel: Kopieren einer Datei
File inFile = new File(args[0]);File outFile = new File(args[1]);InputStream inStream = new FileInputStream(inFile);OutputStream outStream = new FileOutputStream(outFile);while ( (z=inStream.read()) >=0 ){ outStream.write(z);}inStream.close();outStream.close();
DVG2 - 06 - Datenströme 23
OutputStream/Writer InputStream/Reader
Bytetransport
Datenstrom
gepufferter Transport
Bytetransport
gepufferter Transport
Datenstrom
RAM Pipe Pipe RAMFOS/FWNetz
Internet
FIS/FR
Internet
Netz
FileOutputStreamFileWriter
FileInputStreamFileReader
DVG2 - 06 - Datenströme 24
BufferedInputStream BufferedReader
Dienen dem gepufferten Lesen von Datenströmen. Realisieren alle Methoden der Klasse InputStream bzw. Reader.
Es wird mark-reset unterstützt. Konstruktoren von BufferedInputStream
BufferedInputStream(InputStream in) BufferedInputStream(InputStream in, int size)size ist die Größe des Puffers
Konstruktoren von BufferedReader BufferedReader(Reader in) BufferedReader(Reader in , int size)
Methode in BufferedReader String readLine()
liest eine Zeile ein (bis '\n‘) und gibt diese als String zurück; gibt null zurück, wenn Strom zu Ende
DVG2 - 06 - Datenströme 25
Beispiel: Lesen einer Datei
File inFile = new File(args[0]);BufferedReader inReader = new BufferedReader(new FileReader(inFile));String z;while ( (z=inReader.readLine()) != null ) System.out.println(z);inReader.close();
DVG2 - 06 - Datenströme 26
BufferedOutputStream BufferedWriter
Dienen dem gepufferten Schreiben von Datenströmen. Realisieren alle Methoden der Klasse OutputStream bzw. Writer.
Konstruktoren von BufferedOutputStream BufferedOutputStream(OutputStream out) BufferedOutputStream(OutputStream out, int size)size ist die Größe des Puffers
Konstruktoren von BufferedWriter BufferedWriter(Writer out) BufferedWriter(Writer out, int size)
Methode in BufferedWriter void newLine()
schreibt ein (ggf. systemabhängiges) Zeilenende-Zeichen
DVG2 - 06 - Datenströme 27
Beispiel: Kopieren einer Datei
File inFile = new File(args[0]);File outFile = new File(args[1]);InputStream inStream = new BufferedInputStream( new FileInputStream(inFile));OutputStream outStream = new BufferedOutputStream( new FileOutputStream(outFile));while ( (z=inStream.read()) >=0 ){ outStream.write(z);}inStream.close();outStream.close();
DVG2 - 06 - Datenströme 28
OutputStream/Writer InputStream/Reader
Bytetransport
Datenstrom
BufferedOutputStreamBufferedWriter
Bytetransport
BufferedInputStreamBufferedReader
Datenstrom
RAM Pipe Pipe RAMFOS/FWNetz
Internet
FIS/FR
Internet
Netz
FileOutputStreamFileWriter
FileInputStreamFileReader
DVG2 - 06 - Datenströme 29
Die Klasse DataInputStream Dient dem Lesen von Daten in interner Darstellung von
Datenströmen. Es werden Methoden zum Lesen primitiver Datentypen realisiert.
Konstruktor DataInputStream (InputStream in)
Methoden zum Lesen primitiver Datentypen boolean readBoolean() char readChar() byte readByte() short readShort() int readInt() long readLong() float readFloat() double readDouble()
DVG2 - 06 - Datenströme 30
int readUnsignedByte() int readUnsignedShort() String readLine()
liest Zeile im ASCII-Code String readUTF()
liest Zeile im UTF-8-Code
DVG2 - 06 - Datenströme 31
Beispiel: Lesen einer Matrix
File inFile = new File("Matrix.dat");DataInputStream inStream = new DataInputStream( new BufferedInputStream( new FileInputStream(inFile)));double [][] matrix;int zeilen = inStream.readInt();matrix = new double[zeilen][];int spalten;for (int i=0; i<matrix.length; i++){ spalten=inStream.readInt(); matrix [i] = new double[spalten]; for (int j=0;j<matrix[i].length;j++) matrix[i][j]=inStream.readDouble();}inStream.close();
DVG2 - 06 - Datenströme 32
Die Klasse DataOutputStream Dient dem Schreiben von Daten in interner Darstellung auf
Datenströmen. Es werden Methoden zum Schreiben primitiver Datentypen realisiert.
Konstruktor DataOutputStream (OutputStream out)
Methoden zum Schreiben primitiver Datentypen void writeBoolean(boolean v) void writeChar(char v) void writeByte(byte v) void writeShort(short v) void writeInt(int v) void writeLong(long v) void writeFloat(float v) void writeDouble(double v)
DVG2 - 06 - Datenströme 33
void writeBytes(String s)schreibt die Zeichen im ASCII-Code
void writeChars(String s)schreibt die Zeichen im Unicode
void writeUTF(String s) schreibt die Zeichen im UTF-8-Format
DVG2 - 06 - Datenströme 34
Beispiel: Schreiben einer Matrix
File outFile = new File("Matrix.dat");DataOutputStream outStream = new DataOutputStream( new BufferedOutputStream( new FileOutputStream(outFile)));double [][] matrix = ...;outStream.writeInt(matrix.length);for (int i=0; i<matrix.length; i++){ outStream.writeInt(matrix[i].length); for (int j=0;j<matrix[i].length;j++) outStream.writeDouble(matrix[i][j]);}outStream.close();
DVG2 - 06 - Datenströme 35
OutputStream/Writer InputStream/Reader
Bytetransport
DataOutputStream
BuferedOutputStreamBufferedWriter
Bytetransport
BuferedInputStreamBufferedReader
DataInputStream
RAM Pipe Pipe RAMFOS/FWNetz
Internet
FIS/FR
Internet
Netz
FileOutputStreamFileWriter
FileInputStreamFileReader
DVG2 - 06 - Datenströme 36
Die Klasse ObjectInputStream Dient dem Lesen von Objekten in interner Darstellung von
Datenströmen. Objekte, die mit einem ObjectInputStream gelesen werden
sollen, müssen das Interface Serializable implementieren. Konstruktor
ObjectInputStream (InputStream in) Methoden
realisiert alle Lese-Methoden aus DataInputStream Object readObject()
DVG2 - 06 - Datenströme 37
Beispiel: Lesen einer Matrix
File inFile = new File("Matrix.dat");ObjectInputStream inStream = new ObjectInputStream( new BufferedInputStream( new FileInputStream(inFile)));double [][] matrix;matrix = (double[][])inStream.readObject();inStream.close();
DVG2 - 06 - Datenströme 38
Die Klasse ObjectOutputStream Dient dem Schreiben von Objekten in interner Darstellung auf
Datenströme. Objekte, die mit einem ObjectOutputStream geschrieben werden
sollen, müssen das Interface Serializable implementieren. Es werden alle enthaltenen Unterobjekte gespeichert. Konstruktor
ObjectOutputStream (OutputStream out) Methoden
realisiert alle Schreib-Methoden aus DataOutputStream void writeObject (Object obj)
DVG2 - 06 - Datenströme 39
Beispiel: Schreiben einer Matrix
File outFile = new File("Matrix.dat");ObjectOutputStream outStream = new ObjectOutputStream( new BufferedOutputStream( new FileOutputStream(outFile)));double [][] matrix = ...;outStream.writeObject(matrix);outStream.close();
DVG2 - 06 - Datenströme 40
OutputStream/Writer InputStream/Reader
Bytetransport
DataOutputStreamObjectOutputStream
BuferedOutputStreamBufferedWriter
Bytetransport
BuferedInputStreamBufferedReader
DataInputStreamObjectInputStream
RAM Pipe Pipe RAMFOS/FWNetz
Internet
FIS/FR
Internet
Netz
FileOutputStreamFileWriter
FileInputStreamFileReader
DVG2 - 06 - Datenströme 41
Lesen von URLsURL addr = new URL(
"http://www.wias-berlin.de/"+
"~telschow/dvg2/programme/File/dirf.java");
BufferedInputStream inStream =
new BufferedInputStream(addr.openStream());
int z;
while ( (z=inStream.read()) >=0 )
System.out.print((char)z);
inStream.close();
DVG2 - 06 - Datenströme 42
Weitere IO-Klassen InputStreamReader macht aus einem Bytestrom einen
Zeichenstrom OutputStreamWriter macht aus einem Zeichenstrom einen
Bytestrom ByteArrayInputStream bzw. ByteArrayOutputStream lesen
bzw. schreiben auf Hauptspeicherbereiche, die sich in ByteArrays befinden.
CharArrayReader bzw. CharArrayWriter lesen bzw. schreiben auf Hauptspeicherbereiche, die sich in CharArrays befinden.
StringReader bzw. StringWriter lesen bzw. schreiben auf Hauptspeicherbereiche, die sich in Strings befinden.
SequenceInputStream verknüpft mehrere Eingabeströme zu einem Strom.
DVG2 - 06 - Datenströme 43
PipedInputStream, PipedOutputStream, PipedReader, PipedWriter lesen bzw. schreiben auf Pipes.
PushbackInputStream, PushbackReader lesen von Strömen und ermöglichen die schon gelesenen Daten in den Eingabestrom zurückzustellen.
StreamTokenizer liest den Eingabestrom und zerlegt ihn in Tokens.
LineNumberReader liest Zeilen und zählt diese mit. RandomAccessFile erlaubt, auf eine Datei sowohl zu schreiben als
auch von dieser zu lesen und in ihr beliebig zu positionieren.
top related