DATENSTRÖME DIE JAVA-IO
|
|
|
- Matthias Schreiber
- vor 9 Jahren
- Abrufe
Transkript
1 5. Kapitel DATENSTRÖME DIE JAVA-IO Techniken der Prgrammentwicklung Prf. Dr. Wlfgang Schramm
2 Übersicht 1 1. Prgrammstrukturierung mit Paketen (packages) 2. Vererbung 3. Abstrakte Klassen und Interfaces 4. Ausnahmebehandlung 5. Datenströme: die Java IO-Biblithek 6. MulTthreading 7. Innere Klassen 8. CllecTns 9. Generics 10. ReflecTn
3 Lernziele des Kapitels 2 2 Arbeitsweisen bei der IO kennenlernen. OrganisaTn der Java-IO-Biblithek kennenlernen und nachvllziehen. Reader- und Writer-Klassen kennenlernen. Eigene Reader/Writer schreiben können. Verstehen was Filter sind und eigene Filter schreiben können. Eigenschaben vn Streams verstehen. Flexibilität der Einsatzmöglichkeiten vn Streams kennen- und anwenden lernen.
4 Inhalt 3 Teil 1 Teil 2 Teil 3 Überblick I/O-Package Klasse Reader Klasse Writer OutputStream und Spezialisierungen InputStream und Spezialisierungen Serialisieren unterschiedlicher Datentypen Streams für unterschiedliche Quellen/Ziele Wahlfreier Zugriff auf Dateien Klassen-Übersicht für java.i
5 Ein-/Ausgabe in anderen Prgrammiersprachen 4 In alten Sprachen (z.b. Pascal): Ein- und Ausgabe gehören zur Sprache In neueren Sprachen (z.b. C) Ein- und Ausgabe sind in Biblitheken ausgegliedert Datentypen: File, Pipe, Scket Häufig sind die Schninstellen für die verscheiden Datenquellen sehr unterschiedlich. Entwickler muss jede I/O-Art neu kennen lernen, z.b. für n n n n n n Dateien Pipes Sckets HTTP-Verbindungen Geräteschninstellen etc.
6 Ein-/Ausgabe in Java 5 In Java bedienen (fast) alle I/O-Mechanismen die gleichen Schninstellen. Das Package java.i stellt flgende FunkTnalität zur Verfügung: Ein- und Ausgabe minels sequenteller Datenströme (englisch: streams) für beliebige Verbindungen. n Schreiben: erzeugen eines Ausgabestrms (in eine Datei der in den Speicher). n Lesen: Daten kmmen vn einem Eingabestrm (vn einer Datei der vm Speicher). Grundsätzliche Unterscheidung zwischen Byteströmen (Streams) und Zeichenströmen (Reader, Writer). Serialisierung (englisch: serializatn) Zugriff auf das Dateisystem. Das Package enthält 51 Klassen (einige davn sllen nicht mehr verwendet werden- deprecated) 12 Interfaces, 16 ExcepTns.
7 Package-Übersicht vn java.i 6 Hinweise: Die Übersicht zeigt swhl abstrakte als auch knkrete Klassen. Es sind bei den angegeben Klassen nicht alle Beziehungen dargestellt.
8 InputStreams Klassenhierarchie 7 InputStream {abstract FileInputStream ZipInputStream ScketInputStream ObjectInputStream PipedInputStream FilterInputStream ByteArray InputStream BufferedInputStream DataInputStream
9 OutputStreams Klassenhierarchie 8 OutputStream {abstract FileOutputStream ScketOutputStream ObjectOutputStream PipedOutputStream FilterOutputStream ByteArray OutputStream Buffered OutputStream DataOutputStream
10 9 Basisklassen für die I/O Knkrete Eingabe-/Ausgabe-Klassen erweitern abstrakte Oberklassen. Es gibt vier Kategrien vn I/O-Klassen: Klassen zur Ein-/Ausgabe vn Bytes (der Byte-Arrays), Klassen zur Ein-/Ausgabe vn Unicde-Zeichen (Arrays der Strings). InputStream / OutputStream = abstrakte Basisklassen für alle byterienterten Klassen. Bindeglied bei Methden, die als Parameter ein Eingabe-/Ausgabe-Objekt verlangen. Beispiel: InputStream nicht nur für Dateien, sndern auch für Daten, die über das Netzwerk kmmen. Reader / Writer = abstrakten Basisklassen für alle Klassen, die Unicde- Zeichen und Unicde-Zeichenflgen lesen bzw. schreiben. Basisklassen geben abstrakte read()- der write()-methden vr, die in den Unterklassen überschrieben werden müssen. Knkrete Unterklassen implementeren eine ganz bestmmte Strategie für eine Ressurce. S weiß zum Beispiel ein FileWriter, wie für Dateien die abstrakte Klasse Writer zu implementeren ist, als wie Unicde-Zeichen in eine Datei geschrieben werden.
11 Zugriff auf Streams in einem Prgramm 10 Datei InputStream OutputStream Prgramm
12 11 Byte-Streams vs. Reader/Writer OutputStreams behandeln Ausgabeströme vn Bytes. Es gibt verschiedene Möglichkeiten, whin diese Ausgabeströme fließen können. (Kmplexe) Datentypen können in Bytes zerlegt werden. Writer behandeln Ausgabeströme vn Zeichen (z.b. Textdateien). Es gibt verschiedene Möglichkeiten, whin dies Writer schreiben können. InputStreams behandeln Eingabeströme vn Bytes. Es gibt verschiedene Möglichkeiten, wher diese Eingabeströme kmmen können. (Kmplexe) Datentypen können aus Bytes zusammengesetzt werden. InputStreams blckieren slange, bis Eingabedaten verfügbar sind. Reader behandeln Eingabeströme vn Zeichen (z.b. Textdateien) Es gibt verschiedene Möglichkeiten, wher diese Eingabeströme kmmen können. Reader blckieren slange, bis Eingabedaten verfügbar sind. Streams sind unidirektnal: entweder dienen sie der Eingabe der der Ausgabe (Die Klasse RandmAccessFile erlaubt eine KmbinaTn vn Ein- und Ausgabe (vergleichbar zu C-Dateien)). Reader und Writer sind, wie der Name schn sagt, unidirektnal. Aufgrund der Bedeutung vn Zeichenströmen gibt es dafür eine eigene Klassen-Teilhierarchie.
13 Reader - Methden (Auszug) 12 prtected Reader() java.i.reader abstract public vid clse() thrws IOExceptin public vid mark(int readaheadlimit) thrws IOExceptin public blean marksupprted() public int read() thrws IOExceptin public int read(char[] cbuf) thrws IOExceptin abstract public int read(char[] cbuf, int ff, int len) thrws IOExceptin public lng skip(lng n) thrws IOExceptin public blean ready() thrws IOExceptin public vid reset() thrws IOExceptin
14 13 WichTge Methden der abstrakten Klasse Reader 1/2 Die Klasse Reader dient der Eingabe vn Textdateien. Knstruktr Öffnet einen neuen Reader. abstract vid clse() Schließt den Reader. int read() Liest das nächste Zeichen vn diesem Reader. Das gelesene Zeichen wird als Integer (= Unicde-Darstellung) im Bereich zurückgegeben. Die FunkTn liefert -1, falls das Ende des Readers erreicht ist. Der Aufrufende wird blckiert, falls keine Daten vrliegen (z.b. im Fall der Eingabe vn Knsle).
15 14 WichTge Methden der abstrakten Klasse Reader 2/2 abstract int read( char[ ] cbuf, int ff, int len ) Liest bis zu len Zeichen vn diesem Reader ab der PsiTn ff in das Array cbuf. Es wird versucht, len Zeichen zu lesen, eventuell werden aber weniger gelesen, wenn gar nicht (mehr) sviele Zeichen auf dem Reader bereit stehen. FunkTnsergebnis: Anzahl tatsächlich gelesener Zeichen. Ist der Reader zu Ende (beim Versuch das ersten Zeichen zu lesen), wird 1 als Ergebnis geliefert. Snst wird zumindest ein Zeichen gelesen und ab cbuf[ff] gespeichert. Die beiden anderen read-funktn benutzen diese abstrakte FunkTn. int read( char[ ] cbuf ) Der Aufruf entspricht read( cbuf, 0, cbuf.length). blean ready() Liefert true, wenn das nächste read() nicht blckieren wird; false als Ergebnis bedeutet nicht unbedingt, dass das nächste read() blckieren wird (denn bis dahin können wieder Daten vrliegen)!
16 Hierarchie der Reader-Klassen (Auszug im Detail) 15 Reader int read () int read (char[] cbuf, int ff, int len) vid clse () InputStreamReader InputStreamReader (InputStream s) InputStreamReader (InputStream s, Charset cs) int read (char[] cbuf, int ff, int len) vid clse ()... StringReader StringReader (String s) int read (char[] cbuf, int ff, int len)... FileReader FileReader (String filename)...
17 Hierarchie der Reader-Klassen 16 Reader {abstract StringReader CharacterArray Reader BufferedReader PipedReader FilterReader {abstract InputStreamReader PushbackReader FileReader
18 Spezielle Reader (Auszug) 1/ zur Auswahl des Eingabegeräts: InputStreamReader Basisklasse für alle Reader, die einen Byte-Stream in einen Character- Stream umwandeln: Liest Zeichen (stan Bytes) vn einem darin enthaltenen InputStream. FileReader, Unterklasse vn InputStreamReader Setzt Standard-Zeichencdierung und puffergröße vraus (die in der Oberklasse einstellbar sind). StringReader Reader zum Einlesen vn Zeichen aus einem String. CharArrayReader Reader zum Einlesen vn Zeichen aus einem Zeichen-Array. PipedReader Liest vn einer Pipe.
19 Spezielle Reader (Auszug) 2/2 18 FilterReader Abstrakte Klasse für die KnstrukTn vn Eingabefiltern. Arbeitet grundsätzlich auf einem anderen Reader. BufferedReader Reader zur Eingabepufferung und zum Lesen vn kmplenen Zeilen. Stellt einen Puffer (für mark(int) und reset()) zur Verfügung. LineNumberReader, Unterklasse vn BufferedReader Zählt Zeilennummern mit. PushbackReader, Unterklasse vn FilterReader Erlaubt das Zurückschreiben in den Reader. Der Knstruktr bekmmt einen Reader als Parameter (geschachtelter Stream).
20 FileReader - Beispiel 19 public FileReader(String filename) thrws FileNtFundExceptin public FileReader(File file) thrws FileNtFundExceptin public FileReader(FileDescriptr fd) imprt java.i.*; public class IO01 { Das Prgramm liest die Datei lg.txt und gibt ihren Inhalt auf dem Bildschirm aus. public static vid main(string[] args) { FileReader f; int c; try { f = new FileReader("c:\\lg.txt"); while ((c = f.read())!= -1) { System.ut.print((char)c); f.clse(); catch (IOExceptin e) { System.ut.println("Fehler beim Lesen der Datei");
21 Schachteln vn Streams 20 Basis: Datenströme sind mit bestmmten Datenquellen verbunden, vn denen sie lesen. Es gibt sg. Filterstreams, die nicht direkt mit der Datenquelle verknüpb sind, sndern mit einem anderen Datenstrm, hinter den sie wie ein Filter (nicht zu verwechseln mit der Klasse FilterReader) geschaltet werden. Hinter einen Datenstrm können ein der mehrere Filterströme gesteckt werden, welche die Daten vr der Eingabe vrverarbeiten. Beispiel: Filterströme nach einem FileReader Datei FileReader Datei FileReader BufferedReader Filterströme Datei FileReader BufferedReader DataInputStream
22 BufferedReader - Beispiel 21 public String readline() thrws IOExceptin public BufferedReader(Reader in) public BufferedReader(Reader in, int sz) imprt java.i.*; public class IO01 { Das Prgramm liest die Datei lg.txt gepuffert und gibt ihren Inhalt auf dem Bildschirm aus. public static vid main(string[] args) { BufferedReader f; String line; Geschachtelter Stream: BufferedReader erwartet ein Stream-Objekt. try { f = new BufferedReader (new FileReader("c:\\lg.txt")); while ((line = f.readline())!= null) {System.ut.println(line); f.clse(); catch (IOExceptin e) { System.ut.println("Fehler beim Lesen der Datei");
23 LineNumberReader - Beispiel 22 imprt java.i.*;..... LineNumberReader fnr=null; StringReader sr = null; Java behandelt den Zeilenumbruch betriebssystemunabhängig, d.h. jeder Zeilenumbruch wird erkannt. try { sr = new StringReader ("Dies ist \r\rein\r\ntext\n\r\n"); fnr = new LineNumberReader(sr); int res = fnr.read(); int cnt = 0; while (res!= -1) { cnt++; System.ut.print((char) res); res = fnr.read(); fnr.clse(); sr.clse(); System.ut.println ("Anzahl Zeilen= " + fnr.getlinenumber()); System.ut.println ("Anzahl Zeichen= " + cnt); catch (FileNtFundExceptin e) { System.err.println(e); catch (IOExceptin e) { System.err.println(e); Ausgabe: Dies ist ein Text Anzahl Zeilen= 5 Anzahl Zeichen= 21
24 Writer - Methden 23 prtected Writer() prtected Writer (Object lck) java.i.writer abstract public vid clse() thrws IOExceptin abstract public vid flush() thrws IOExceptin public vid write(int c) thrws IOExceptin public vid write(char[] cbuf) thrws IOExceptin abstract public vid write(char[] cbuf, int ff, int len) thrws IOExceptin public vid write(string str) thrws IOExceptin public vid write(string str, int ff, int len) thrws IOExceptin
25 Methden der abstrakten Klasse Writer 1/2 24 Die Klasse Writer dient der Ausgabe häufig benötgter Textdateien. Der Knstruktr Öffnet einen neuen Writer. abstract vid clse() thrws IOExceptin Schließt den Writer, zuvr wird flush() aufgerufen. abstract vid flush() thrws IOExceptin Erzwingt das Schreiben aller (eventuell) gepufferten Zeichen auf diesen Writer.
26 Methden der abstrakten Klasse Writer 2/2 25 vid write(char[ ] cbuf) Schreibt ein Zeichen-Array auf diesen Writer. abstract vid write(char[ ] cbuf, int ff, int len) Schreibt len Zeichen des Zeichen-Arrays cbuf ab dem Index ff auf diesen Writer. vid write(int c) Schreibt das Zeichen c (die Bits 0 bis 15) auf diesen Writer. vid write(string str) Schreibt den String str auf diesen Writer. vid write(string str, int ff, int len) Schreibt len Zeichen des Strings str ab dem Index ff auf diesen Writer.
27 Hierarchie der Writer-Klassen (Auszug im Detail) 26 Writer vid write (int ch) vid write (String s) int write (char[] cbuf, int ff, int len) vid flush () vid clse () OutputStreamWriter OututStreamWriter (OutputStream s) OututStreamWriter(OutputStream s, Charset cs) vid write (char[] cbuf, int ff, int len) vid flush() vid clse ()... StringWriter StringWriter (String s) vid write(char[] cbuf, int ff, int len) vid flush() vid clse () String tstring ()... FileWriter FileWriter (String filename)...
28 Hierarchie der Writer-Klassen 27 Writer {abstract StringWriter CharacterArray Writer BufferedWriter PipedWriter FilterWriter {abstract PrintWriter OutputStreamWriter FileWriter
29 Spezielle Writer (Auszug) zur Auswahl des Ausgabegeräts. OutputStreamWriter Schreibt Zeichen (stan Bytes) auf einen darin enthaltenen OutputStream. FileWriter, Unterklasse vn OutputStreamWriter Setzt Standard-Zeichencdierung und puffergröße vraus (die in deroberklasse einstellbar sind). StringWriter Schreibt auf einen String. CharArrayWriter Schreibt auf ein Zeichen-Array. PipedWriter Schreibt auf eine Pipe. FilterWriter Abstrakte Oberklasse, um Writer zu filtern BufferedWriter Stellt einen Puffer zur Verfügung. PrintWriter Eventuelle ExcepTns werden abgefangen und können durch eine Methde checkerrr() abgefragt werden.
30 FileWriter - Beispiel 29 public FileWriter(String filename) thrws IOExceptin public FileWriter(String filename, blean append) thrws IOExceptin public FileWriter(File file) thrws IOExceptin public FileWriter(FileDescriptr fd) imprt java.i.*; public class IO01 { public static vid main(string[] args) { String hell = "Hall JAVA\r\n"; FileWriter f1; Das Prgramm erzeugt die Datei hall.txt und schreibt einen String in die Datei. try { f1 = new FileWriter("hall.txt"); f1.write(hell); f1.clse(); catch (IOExceptin e) { System.ut.println("Fehler beim Erstellen der Datei");
31 BufferedWriter Beispiel 1/2 30 public BufferedWriter(Writer ut) public BufferedWriter(Writer ut, int size) imprt java.i.*; public class IO01 { public static vid main(string[] args) { Writer f1; BufferedWriter f2; String s; try { f1 = new FileWriter("buffer.txt"); f2 = new BufferedWriter(f1); fr (int i = 1; i <= 10000; ++i) { s = "Dies ist die " + i + ". Zeile"; f2.write(s); f2.newline(); f2.clse(); f1.clse(); catch (IOExceptin e) {System.ut.println("Fehler beim Erstellen der Datei"); Das Prgramm erzeugt die Datei buffer.txt und schreibt gepuffert Zeilen auf die Datei. Geschachtelter Stream: BufferedWriter erwartet ein Writer-Objekt.
32 BufferedWriter Beispiel 2/2 31 public BufferedWriter(Writer ut) public BufferedWriter(Writer ut, int size) imprt java.i.*; public class IO01 { public static vid main(string[] args) { BufferedWriter f1; String s; Das Prgramm erzeugt die Datei buffer.txt und schreibt gepuffert Zeilen auf die Datei. try { f1 = new BufferedWriter(new FileWriter("buffer.txt")); fr (int i = 1; i <= 10000; ++i) { s = "Dies ist die " + i + ". Zeile"; f1.write(s); f1.newline(); f1.clse(); Geschachtelter Stream: BufferedWriter erwartet ein Writer-Objekt. catch (IOExceptin e) {System.ut.println("Fehler beim Erstellen der Datei");
33 Beispiel für das Schreiben vn Textdateien 32 Writer fw; // Writer ist die Oberklasse try { fw = new FileWriter( "prt.txt" ); fw.write( "Dies ist\n" ); fw.write( "ein Test-Text\n" ); fw.clse(); catch ( IOExceptin e ) { System.err.println( e ); Zum Anhängen an eine existierende Datei:... fw = new FileWriter( "prt.txt", true );...
34 Beispiel für das Schreiben vn Textdateien 33 Writer fw; // Writer ist die Oberklasse try { fw = new FileWriter( "prt.txt" ); fw.write( "Dies ist\n" ); fw.write( "ein Test-Text\n" ); fw.clse(); catch ( IOExceptin e ) { System.err.println( e );
35 34 Beispiel für andere Writer: Schreiben auf einen String Writer fw; // Writer ist die Oberklasse try { fw = new StringWriter( "prt.txt" ); fw.write( "Dies ist\n" ); fw.write( "ein Test-Text\n" ); fw.clse(); catch ( IOExceptin e ) { System.err.println( e ); System.ut.println("Test: " +fw.tstring().equals("dies ist\nein Test-Text \n") );
36 35 Beispiel für andere Writer: Schreiben in ein Array f Character Writer fw; // Writer ist die Oberklasse try { fw = new CharArrayWriter(); fw.write( "Dies ist\n" ); fw.write( "ein Test-Text\n" ); fw.clse(); catch ( IOExceptin e ) { System.err.println( e ); // type cast is necessary CharArrayWriter cw = (CharArrayWriter) fw; char[] ca = cw.tchararray(); fr (int i=0; i<fw.size(); i++) System.ut.print(ca[i]);
37 PrintWriter (Auszug) 36 public PrintWriter(Writer ut) public PrintWriter(Writer ut, blean autflush) public vid print(duble d) public vid print(int i) public vid print(blean b) public vid print(string s) public vid print(char c) public vid print(char[] s) public vid print(flat f) public vid print(lng l) public vid print(object bj) java.i.printwriter public vid write(char[] buf) public vid write(int c) public vid write(string s) public vid write(string s, int ff, int len) public vid write(char[] buf, int ff, int len)
38 PrintWriter - Beispiel 37 Ausgabe vn Werten der einfachen PrintWriter f; Datentypen im Klartext in einen Stream. duble sum = 0.0; int nenner; try { f = new PrintWriter( new BufferedWriter( new FileWriter("zwei.txt"))); fr (nenner = 1; nenner <= 1024; nenner *= 2) { sum += 1.0 / nenner; f.print("summand: 1/"); f.print(nenner);f.print(" Summe: "); f.println(sum); f.clse(); catch (IOExceptin e) { System.ut.println("Fehler beim Erstellen der Datei");
39 Eigene FilterWriter erstellen 38 Die Klasse wird aus FilterWriter abgeleitet. Im Knstruktr wird der Superklassen-Knstruktr aufgerufen, um ut zu initialisieren. Die drei write-methden werden separat überschrieben: Zuerst wird die Filterfunktin ausgeführt, Dann wird die gefilterte (geänderte) Ausgabe an die Oberklassenmethde übergeben. Die neue Filterklasse kann, wie gewhnt, in einer Kette vn geschachtelten Writer-Objekten verwendet werden.
40 Eigene FilterWriter Beispiel 1/2 39 class UpCaseWriter extends FilterWriter { public UpCaseWriter(Writer ut) { super(ut); public vid write(int c) thrws IOExceptin { super.write(character.tuppercase((char)c)); public vid write(char[] cbuf, int ff, int len) thrws IOExceptin { fr (int i = 0; i < len; ++i) { write(cbuf[ff + i]); public vid write(string str, int ff, int len) thrws IOExceptin { write(str.tchararray(), ff, len); Die write-methden können wesentlich perfrmanter implementiert werden, wenn nicht alle Ausgaben einzeln an write(int) gesendet würden.
41 40 Eigene FilterWriter Beispiel 2/2 public static vid main(string[] args) { PrintWriter f; String s = "und dieser String auch"; try { f = new PrintWriter( new UpCaseWriter( new FileWriter("upcase.txt"))); f.println("diese Zeile wird schön grß geschrieben"); f.write('a'); //Test vn write(int) f.println(); f.write(s); //Test vn write(string) f.println(); f.write(s,0,17); //Test vn write(string, int, int) f.println(); f.write(s.tchararray(),0,10); //Test vn write(char[], int, int) f.println(); //Zeilenvrschub f.clse(); catch (IOExceptin e) { System.ut.println("Fehler beim Erstellen der Datei");
42 Byte-Streams 41 Viele Gemeinsamkeiten zwischen Byte-Streams und den Character-Streams. Die Klassen-Architektur beider Stream-Arten stmmt weitgehend überein. Bisheriges Wissen ist prblemls auf Byte-Streams übertragbar. Lesender Zugriff: InputStream; Schreibender Zugriff: OutputStream (Character-Streams = Reader / Writer). Basisklassen (Wurzeln der Klassenhierarchien): OutputStream und InputStream. Knzepte der Schachtelung vn Streams: wie bei Character-Streams. Paket : java.i.
43 42 Methden der abstrakten Klasse OutputStream 1/2 vid clse() thrws IOExceptin Schließt den Stream und gibt alle belegten Ressurcen frei. abstract vid write(int b) thrws IOExceptin java.i.outputstream Schreibt das lw-rder Byte vn b (die Bits 0 bis 7) auf diesen Stream. vid write(byte[ ] b) thrws IOExceptin Schreibt b.length Bytes aus dem Array b auf diesen Stream. vid write(byte[ ] b, int ff, int len) thrws IOExceptin Schreibt len Bytes aus dem Array b beginnend mit dem Index ff auf diesen Stream. vid flush() thrws IOExceptin Erzwingt das Schreiben aller (eventuell) gepufferten Bytes auf diesen Stream.
44 43 Methden der abstrakten Klasse OutputStream 2/2 Die Klasse OutputStream ist abstrakt: die ImplemenTerung der Methde write(int b) fehlt. Ihre (knkreten) Unterklassen müssen zumindest write(int b) implementeren. Sie sllen... andere FunkTnen durch eine effizientere ImplemenTerung überladen, sfern möglich, weitere FunkTnalität bieten, zum Beispiel Puffern der Ausgabe.
45 Hierarchie der OutputStream-Klassen (Auszug) 44 OutputStream vid write (int ch) int write (byte b) int write (byte[] b, int ff, int len) vid flush () vid clse () FileOutputStream FileOututStream (String filenname) vid write (int b)... BufferedOutputStream ByteArrayOutputStream ByteArrayOutputStream (byte[] b) vid write(int b) byte[] tbytearray ()... BufferedOutputStream (OutputStream ut)...
46 Spezielle (Knkrete) OutputStreams (Auszug) 45 Aufgabe: Herstellung einer Verbindung zu einem knkreten Ausgabegerät der Übernahme vn Filterfunktinen. FileOutputStream Ein Stream, der auf eine Datei geleitet ist. ByteArrayOutputStream Ein Byte-Array, auf das wie auf einen Stream zugegriffen wird. ObjectOutputStream Ein Stream, auf den serialisierte Java-Objekte geschrieben werden. PipedOutputStream Ein Stream, der auf eine Pipe geleitet ist. FilterOutputStream Transfrmiert der bearbeitet die Daten, bevr sie an den anderen Stream durchgereicht werden (s. FilterWriter).
47 OutputStream - Beispiel 46 public File(String filename) public FileOutputStream(File f) public OutputStreamWriter(OutputStream f)... File f = new File( "c:\\prt.txt" ); try { FileOutputStream fs = new FileOutputStream( f ); OutputStreamWriter w = new OutputStreamWriter( fs ); w.write( "Test\n" ); w.clse(); catch (IOExceptin e) { System.ut.println("Fehler beim Schreiben der Datei");... Das Prgramm erzeugt die Datei prt.txt und schreibt Test auf die Datei. Dppelt geschachtelter Stream: OutputStreamWriter erwartet ein FileOutputStream-Objekt.
48 Zusammenhang OutputStream und Writer 47 Byte-Streams Char-Streams OutputStream Writer FileOutputStream OutputStreamWriter File FileWriter Prgramm mit derselben Wirkung: indirekt!... FileWriter w = new FileWriter( "c:\\prt.txt" ); try { w.write( "Test\n" ); w.clse();...
49 Spezielle FilterOutputStreams 48 BufferedOutputStream Benutzt einen internen Puffer, der mit flush() geleert werden kann. PrintStream ExcepTns werden abgefangen und können durch eine Methde checkerrr() abgefragt werden DataOutputStream In den Stream werden serialisierte elementare Datentypen in maschinen-unabhängiger Frm geschrieben. CheckedOutputStream Ein Stream, der eine Checksumme über die geschriebenen Daten berechnet. CipherOutputStream Ein Stream, der beim Schreiben die Daten verschlüsselt. DeflaterOutputStream, GZIPOutputStream Die zu schreibenden Daten werden kmprimiert.
50 DataOutputStream Beispiel 1/2 49 try { DataOutputStream ut = new DataOutputStream( ut.writeint(1); ut.writeint(-1); ut.writeduble(math.pi); ut.writeutf("häßliches"); ut.writeutf("entlein"); ut.clse(); new BufferedOutputStream( new FileOutputStream("c:\\prt.txt"))); Schreiben vn Daten in UTF-8- Kdierung. catch (IOExceptin e) {System.err.println(e.tString());
51 DataOutputStream Beispiel 2/2 50 Das Prgramm erzeugt eine Ausgabedatei prt.txt vn 38 Byte Länge FF FF FF FF FB D 00 0B 68 C3 A4 C3 9F 6C h...liches..E 6E 74 6C E ntlein Die ersten 4 Byte stellen den int-wert 1 dar. Die nächsten 4 Byte repräsentieren die -1 (es wird die übliche Zweierkmplementdarstellung verwendet). Anschließend flgen 8 Byte mit der duble-darstellung der Zahl pi. Nun flgt die Längeninfrmatin 000B des ersten UTF-8-Strings und danach dessen 11 Zeichen. Man kann sehen, dass die beiden Umlaute ä und ß jeweils zwei Byte belegen, alle übrigen Zeichen jedch nur eines. Schließlich flgt der zweite UTF-8-String. Er hat die Länge 7, und alle Zeichen werden mit einem Byte dargestellt.
52 Schreiben auf Knsle Beispiel 51 Die Knsle (in Eclipse, JBuilder etc.) ist mit einem PrintStream (ein spezieller FilterOutputStream) verbunden. Die Knsle ist als Anribut in der Klasse System wie flgt vereinbart static PrintStream ut; // The "standard" utput stream. Schlüsselwrt static à das Anribut kann über den Klassennamen (stan über ein Objekt) angesprchen werden: System.ut Die Klasse PrintStream stellt viele überladene print-/println-methden zur Verfügung: System.ut.println( 3.14f ); // für flat System.ut.println( false ); // für blean etc. Beschreibung bei den FilterOutputStreams: Die print-methden lösen keine ExcepTns aus, Fehler werden durch eine Methde checkerrr() abgefragt. Das Schreiben auf die Knsle ist einfach, sicher und relatv kmfrtabel hne eine Snderbehandlung zu benötgen.
53 kmprimiertes Schreiben auf zip-datei Beispiel 52 public static vid main(string[] args) { if (args.length < 2) { System.ut.println("Usage: java Zip zipfile files..."); System.exit(1); try { byte[] buf = new byte[4096]; ZipOutputStream ut = new ZipOutputStream( new FileOutputStream(args[0])); imprt java.i.*; imprt java.util.zip.*; fr (int i = 1; i < args.length; ++i) { // lese die zu kmprimierenden Dateien String fname = args[i]; System.ut.println("adding " + fname); FileInputStream in = new FileInputStream(fname); ut.putnextentry(new ZipEntry(fname)); int len; while ((len = in.read(buf)) > 0) ut.write(buf, 0, len); in.clse(); ut.clse(); catch (IOExceptin e) { System.err.println(e.tString());
54 53 Methden der abstrakten Klasse InputStream (Auszug) 1/2 vid clse() thrws IOExceptin Schließt den Stream und gibt alle belegten Ressurcen frei. abstract int read() thrws IOExceptin Liest das nächste Byte vn diesem Stream. Das gelesene Byte wird als Integer im Bereich zurückgegeben. Die FunkTn liefert 1, falls das Ende des Stream erreicht ist. Der Aufrufer wird blckiert, falls keine Daten vrliegen. int read(byte[ ] b, int ff, int len) thrws IOExceptin Liest bis zu len Bytes vn diesem Stream ab der PsiTn ff in das Array b. Es wird versucht, len Bytes zu lesen, eventuell werden aber weniger gelesen. Die Anzahl tatsächlich gelesener Bytes wird als FunkTnsergebnis geliefert. Ist der Stream zu Ende, wird 1 als Ergebnis geliefert. Snst wird zumindest ein Zeichen gelesen und ab b[ff] gespeichert. Die FunkTn rub wiederhlt die FunkTn read() auf. int read(byte[ ] b) thrws IOExceptin Der Aufruf entspricht read(b, 0, b.length).
55 54 Methden der abstrakten Klasse InputStream 2/2 lng skip(lng n) thrws IOExceptin Überspringt n Byte in diesem Stream. Die FunkTn liefert die tatsächliche Anzahl übersprungener Bytes als Ergebnis. int available() thrws IOExceptin Liefert die Anzahl vn Bytes, die vn diesem Stream gelesen werden können, hne den Lesenden zu blckieren. blean marksupprted() Gestanet der Datenstrm das Merken und Zurücksetzen vn PsiTnen. Diese Markierung ist ein Zeiger, der auf bestmmte Stellen in der Eingabedatei zeigen kann. vid mark(int readlimit) Merkt sich eine PsiTn im Datenstrm. vid reset() thrws IOExceptin Springt wieder zu der PsiTn zurück, die mit mark() gesetzt wurde. Unterklassen vn InputStream müssen zumindest read() implementeren; sie sllen: andere FunkTnen durch eine effizientere ImplemenTerung überladen, sfern möglich. weitere FunkTnalität bieten, zum Beispiel mark/reset (marksupprted liefert false für Objekte der Klasse InputStream, sfern es nicht vn einer Unterklasse überschrieben wird).
56 Hierarchie der InputStream-Klassen (Auszug) 55 InputStream abstract int read () int read (byte[] b, int ff, int len) int available () vid clse () FileInputStream FileInutStream (String filenname) int read ()... ByteArrayInputStream ByteArrayInputStream (byte[] b) int read()... BufferedInputStream BufferedOutputStream (InputStream in)...
57 Zusammenhang InputStream und Reader 56 Byte-Streams Char-Streams InputStream Reader FileInputStream InputStreamReader File FileReader indirekt!
58 Spezielle InputStreams (Auszug) 57 FileInputStream Ein Stream, der vn einer Datei gespeist wird. ByteArrayInputStream Ein Byte-Array, auf das wie auf einen Stream zugegriffen wird. SequenceInputStream Ein Stream, der eigentlich aus zwei der mehr (EnumeraTn) anderen InputStreams besteht, die nacheinander gelesen werden. ObjectInputStream Ein Stream, der serialisierte Java-Objekte enthält. PipedInputStream Ein Stream, der vn einer Pipe gespeist wird. AudiInputStream Ein Stream in einem angegebenen Audi-Frmat. FilterInputStream Ein Stream, der aus einem anderen InputStream gespeist, dessen Daten in irgendeiner Weise bearbeitet der transfrmiert werden; der zugrundeliegende Stream wird als Parameter an den Knstruktr übergeben.
59 InputStream - Beispiel 58 try { FileInputStream fis = new FileInputStream("prt.txt"); InputStreamReader isr = new InputStreamReader( fis ); while ( isr.ready() ) { System.ut.print( (char)isr.read() ); isr.clse(); catch ( FileNtFundExceptin e ) { System.err.println( e ); catch ( IOExceptin e ) { System.err.println( e );
60 SequenceInputStream Beispiel 1 59 try { FileInputStream fis1 = new FileInputStream("...")), fis2 = new FileInputStream("...")); SequenceInputStream sis = new SequenceInputStream( fis1, fis2 ); int ch = sis.read(); while (ch>=0) { System.ut.print( (char)ch ); ch = sis.read(); sis.clse(); // fis1 und fis2 werden auch geschlssen catch ( IOExceptin e ) { System.err.println( e );
61 SequenceInputStream Beispiel 2 60 try { Vectr v = new Vectr(); // aus dem Java Cllectin Framewrk v.add(new FileInputStream("...")); v.add(new FileInputStream("...")); v.add(new FileInputStream("...")); v.add(new FileInputStream("...")); SequenceInputStream sis = new SequenceInputStream(v.elements()); int ch = sis.read(); while (ch>=0) { System.ut.print((char)ch); ch = sis.read(); sis.clse(); catch ( IOExceptin e ) { System.err.println( e );
62 Spezialisierungen vn FilterInputStream 61 BufferedInputStream Benutzt einen internen Puffer, um mark und reset zu implementeren DataInputStream Der Stream enthält serialisierte elementare Datentypen in maschinen-unabhängiger Frm. CheckedInputStream Ein Stream, der eine Checksumme über die gelesenen Daten berechnet. CipherInputStream Ein Stream, der beim Lesen die Daten entschlüsselt. InflaterInputStream, GZIPInputStream Die Daten aus dem Stream werden dekmprimiert. PrgressMnitrInputStream Der Frtschrin des Lesens wird (in einem Fenster) angezeigt. PushBackInputStream Daten können in den Stream zurückgeschrieben werden.
63 Lesen vn der Knsle 62 Die Knsle (in Eclipse, JBuilder etc. Eingabeauffrderung) ist mit einem speziellen (Input)Stream verbunden. Die Knsle ist als Anribut in der Klasse System wie flgt vereinbart: static InputStream in; // The "standard" input stream. Schlüsselwrt static à das Anribut kann über den Klassennamen (stan über ein Objekt) angesprchen werden: System.in. Leider ist das Lesen vn der Knsle nicht kmfrtabel... Da die Knsle wie eine Textdatei funktniert, kann man einen InputStreamReader um den InputStream legen: InputStreamReader isr = new InputStreamReader(System.in); Prinzipiell funktniert das Arbeiten mit der Knsle wie das Lesen vn Datei im ersten Beispiel. Kmfrtabler wird es aber, wenn man um den InputStreamReader einen Buffered Reader legt: BufferedReader br = new BufferedReader(isr); Damit ist es z. B. möglich, ganze Zeilen mit der Methde readline() zu lesen: br.readline();
64 Lesen vn der Knsle Beispiel Umsetzung aus dem Lesen vn Datei try { FileInputStream fis = new FileInputStream("prt.txt"); InputStreamReader isr = new InputStreamReader( fis ); while ( isr.ready() ) { System.ut.print( (char)isr.read() ); System.in isr.clse(); catch ( FileNtFundExceptin e ) { System.err.println( e ); catch ( IOExceptin e ) { System.err.println( e );
65 Lesen vn der Knsle, verbessert Beispiel 64 try { InputStreamReader isr = new InputStreamReader( System.in ); BufferedReader br = new BufferedReader( isr ); String input = br.readline(); System.ut.println( ">" + input + "<" ); catch ( FileNtFundExceptin e ) { System.err.println( e ); catch ( IOExceptin e ) { System.err.println( e ); der bzw. besser try { BufferedReader br = new BufferedReader (new InputStreamReader( System.in ));...
66 65 Beispiel 1/2: de-kmprimierendes Lesen aus einer GZIP-Datei Das flgende Prgrammfragment liest den Inhalt der kmprimierten Datei ZIP aus und schreibt ihn dekmprimiert in die Datei COPY. imprt java.util.zip.*
67 66 Beispiel 2/2: Vergleich vn Quelle und Kpie; Input vn Przessen Das flgende Prgrammfragment demnstriert, wie man einen (beliebigen) Przess vn Java aus startet. Dann wird das Przess-Ende abgewartet. Die Ausgabe des Przesses wird aus einem Stream (wher snst?) gelesen und in einen Stream ausgegeben. Ausgabe der Dateiunterschiede
68 Beispiel: Lesen einer Web-Seite; 67 Basis: "Lesen aus einer Textdatei" URL url = new URL( null, "..." ); InputStream is = url.penstream(); try { FileInputStream is = new FileInputStream( "..." ); InputStreamReader isr = new InputStreamReader( is ); int res = isr.read(); while ( res!= -1 ) { System.ut.print( (char) res ); res = isr.read(); MalfrmedURLExceptin isr.clse(); catch ( FileNtFundExceptin e ) { System.err.println( e ); catch ( IOExceptin e ) { System.err.println( e );
69 Beispiel: Lesen aus und Schreiben in Pipes 68 Die Seite des Lesenden (wird zuerst knstruiert) // Verbindungsvrbereitung PipedReader pr = new PipedReader(); // Lesen (blckierend) try { while ( true ) { System.ut.println( "<<" + pr.read() ); catch ( IOExcepTn ex ) { System.ut.println( ex ); Datenaustausch zwischen 2 Threads: Verknüpfung eines PipedReader mit einem PipedWriter - entweder mit dem Knstruktr der mittels cnnect()- Methde. Die read-methden des PipedInputStream liefern dann Daten, die vn einem anderen Thread in den angeschlssenen PipedOutputStream geschrieben wurden. Die Seite des Schreibenden // Verbindungsaufbau PipedWriter pw;... try { pw = new PipedWriter( pr ); catch ( IOExceptin ex ) { System.err.println( ex ); // Schreiben (auf Knpfdruck) try { pw.write( 4711 ); catch ( IOExceptin ex ) { System.err.println( ex );
70 Existenzprüfung und Anlegen einer Datei 69 File f = new File( "prt.txt" ); try { System.ut.println( "File '" + f + "' exists already: " + f.exists() ); if (!f.exists() ) f.createnewfile(); catch ( SecurityExceptin e ) { System.err.println( e ); catch ( IOExceptin e ) { System.err.println( e );
71 Persistente Objekte / Serialisierung 71 Objekte existeren immer nur zur Laufzeit. Wunsch: auch nach dem Beenden der virtuellen Maschine sll ihre Struktur nicht verlren gehen. BenöNgt: ein Mechanismus, der die Objektstruktur und Variablenbelegung zu einer bestmmten Zeit sicher (persistent) macht und an anderer Stelle wieder hervrhlt und die Objektstruktur und Variablenbelegung restauriert. Man braucht: Im gespeicherten Datenfrmat müssen alle InfrmaTnen wie Objeknyp und Variablentyp enthalten sein, um später das richtge Wiederherstellen zu ermöglichen.
72 Persistente Objekte / Serialisierung 72 Objekttyp muss enthalten sein, um später das richtge Wiederherstellen zu ermöglichen. Strukturierte Objekte (Objekte, die weitere Objekte einschließen) à auch diese Unterbjekte müssen gesichert werden. Schreibt man eine Liste mit Bestellungen, s ist die Liste hne die referenzierten Objekte sinnls. Die persistenten Objekte sichern neben ihren eigenen InfrmaTnen auch die Unterbjekte als die vn der betrachtenden Stelle aus erreichbaren Objekte. Beim Speichern wird rekursiv ein Objektbaum durchlaufen, um eine vllständige Datenstruktur zu erhalten. Besndere SituaTnen: Dppelter Zugriff auf ein Objekt. Zyklische Abhängigkeiten in der Datenstruktur. Jedes Objekt bekmmt ein Handle, sdass es im Datenstrm nur einmal kdiert wird. Typischer Anwendungsbereich: wenn Objekte über das Netzwerk übertragen werden.
73 Serialisierung / Deserialisierung 73 Technik, mit der beliebig strukturierte Objekte in eine Flge vn Bytes transfrmiert werden. Die serialisierten Objekte können dann in eine Datei geschrieben der über ein Netzwerk (per RMI) an einen anderen Przess (Thread) übertragen werden. Serialisiertes Objekt: KlasseninfrmaTn + Aktueller Zustand des Objekts zum Zeitpunkt der Serialisierung. Deserialisierung: ReknstrukTn eines serialisierten Objekts aus seiner serialisierten Frm. Java stellt dazu eine kmfrtable Möglichkeit zur Verfügung: Alle betrffenen Klassen müssen dafür das Interface Serializable implementeren, snst gibt es ExcepTns zur Laufzeit. Das gilt auch für alle eingeschachtelten Objekte!
74 74 Schreiben vn elementaren Java-Datentypen in Dateien - Beispiel DataOutputStream Ein Stream, auf den serialisierte Java-Objekte in maschinenunabhängigem Binärfrmat geschrieben werden. try { FileOutputStream fs = new FileOutputStream( "prt.dta" ); DataOutputStream ds = new DataOutputStream( fs ); ds.writeblean( true ); ds.writeblean( false ); ds.writeint( 4712 ); ds.writeint( 1804 ); ds.writechars( "Test-String1" ); ds.writechars( "Test-String2" ); ds.clse(); catch ( IOExceptin e ) { System.err.println( e );
75 75 Lesen vn elementaren Java-Datentypen in Dateien - Beispiel DataInputStream Ein Stream, der serialisierte Java-Objekte in maschinenunabhängigem Binärfrmat enthält. try { FileInputStream fis = new FileInputStream( "prt.dta" ); DataInputStream dis = new DataInputStream( fis ); b = dis.readblean(); System.ut.println( "Sll-Ausgabe true: " + b ); b = dis.readblean(); System.ut.println( "Sll-Ausgabe false: " + b ); i = dis.readint(); System.ut.println( "Sll-Ausgabe 4712: " + i ); i = dis.readint(); System.ut.println( "Sll-Ausgabe 1804: " + i ); System.ut.print("Sll-Ausgabe 'Test-String1TestString2': " ); while ( dis.available() > 0 ) { ch = dis.readchar(); System.ut.print( ch ); catch ( IOExceptin e ) { System.err.println( e ); Bei nicht passenden Frmaten kann es überraschende Effekte geben.
76 76 Schreiben nicht-elementarer Datentypen in Dateien: ObjectOutputStream ObjectOutputStream besitzt swhl Methden, um primitve Typen zu serialisieren, als auch die wichtge Methde writeobject, mit der ein kmpleqes Objekt serialisiert werden kann. Was schreibt writeobject auf den OutputStream: Die Klasse des als Argument übergebenen Objekts. Die Signatur der Klasse. Alle nicht-statschen, nicht-transienten Membervariablen des übergebenen Objekts inkl. der aus allen Vaterklassen geerbten Membervariablen.
77 Serialisierung was ist zu beachten? 77 Es muss zur Laufzeit erminelt werden, welche Membervariablen das zu serialisierende Objekt besitzt (bzw. geerbt hat) und welche vn ihnen serialisiert werden sllen. Dazu wird das ReflecTn-API verwendet. Eine Membervariable kann natürlich selbst ein Objekt sein, das seinerseits serialisiert werden muss. Insbesndere muss writeobject dabei krrekt mit zyklischen Verweisen umgehen und dafür srgen, dass Objektreferenzen erhalten bleiben. Alle betrffenen Klassen deren Objekte mit writeobject auf Datei geschrieben werden sllen, müssen das Interface Serializable implementeren.
78 78 Schreiben vn nicht-elementaren Datentypen in Dateien - Beispiel List ll = new List(); ll.addfirst (new Hardcver ()); ll.addfirst (new CD ()); // Ausgabe der ursprünglichen Liste: ll.printlist(); // Liste auf Datei schreiben try { s = new ObjectOutputStream ( new FileOutputStream("list.dat")); s.writeobject(ll); s.clse(); // ganze Liste schreiben catch (IOExceptin e) { e.printstacktrace();
79 79 Lesen nicht-elementarer Datentypen vn Dateien: ObjectInputStream Nachdem ein Objekt serialisiert wurde, kann es mit Hilfe der Klasse ObjectInputStream wieder reknstruiert werden. Analg zu writeobject der Klasse ObjectOutputStream gibt es Methden zum Wiedereinlesen vn primitven Typen und eine Methde readobject, mit der ein serialisiertes Objekt wieder hergestellt werden kann.
80 Deserialisierung was ist zu beachten? 1/2 80 Zunächst wird ein neues Objekt des zu deserialisierenden Typs angelegt, und die Membervariablen werden mit Default- Werten vrbelegt. Zudem wird der Default-Knstruktr der ersten nicht-serialisierbaren Superklasse aufgerufen. Anschließend werden die serialisierten Daten gelesen und den entprechenden Membervariablen des angelegten Objekts zugewiesen. Das erzeugte Objekt hat anschließend dieselbe Struktur und denselben Zustand, den das serialisierte Objekt hane (abgesehen vn den nicht serialisierten Membervariablen des Typs statc der transient). Da der Rückgabewert vn readobject vm Typ Object ist, muss das erzeugte Objekt in den tatsächlichen Typ (der eine seiner Oberklassen) umgewandelt werden.
81 Deserialisierung was ist zu beachten? 2/2 81 Das nächste Element des Eingabestreams ist tatsächlich ein Objekt (kein primitver Typ). Das Objekt muss sich vllständig und fehlerfrei aus der Eingabedatei lesen lassen. Es muss eine KnverTerung auf den gewünschten Typ erlauben, als entweder zu derselben der einer daraus abgeleiteten Klasse gehören. Der Bytecde für die Klasse des zu deserialisierenden Objekts muss vrhanden sein. Er wird beim Serialisieren nicht mitgespeichert, sndern muss dem Empfängerprgramm wie üblich als kmpilierter Bytecde zur Verfügung stehen. Die KlasseninfrmaTn des serialisierten Objekts und die im deserialisierenden Prgramm als Bytecde vrhandene Klasse müssen zueinander kmpatbel sein.
82 82 Lesen vn nicht-elementaren Datentypen aus Dateien - Beispiel List nl = new List(); try { is = new ObjectInputStream (new FileInputStream("list.dat")); nl = (List)is.readObject(); // ganze Liste einlesen is.clse(); catch (IOExceptin e) { System.ut.println("IO-Fehler"); e.printstacktrace(); catch (ClassNtFundExceptin e) { System.ut.println("IO-Fehler"); e.printstacktrace();
83 83 Wahlfreier Zugriff mit RandmAccessFiles: Öffnen und Schließen Streams erlauben entweder eine Eingabe der eine Ausgabe Die Klasse RandmAccessFile erlaubt eine KmbinaTn vn Einund Ausgabe (vergleichbar zu C-Dateien) Der Knstruktr Öffnet ein neues RandmAccessFile; Parameter: String der File: bezeichnen die zu lesende/schreibende Datei String: Mdus, vergleichbar zu C n "r": Datei zum Lesen öffnen n "rw": Datei zum Lesen und Schreiben öffnen n "wrd": Datei zum Lesen und Schreiben öffnen; die Daten werden synchrn (direkt) in die zugrunde liegende Datei geschrieben n "wrs": Datei zum Lesen und Schreiben öffnen; die Daten inklusive ntwendiger Metadaten werden synchrn in die zugrunde liegende Datei geschrieben vid clse() Schließt die Datei und gibt alle belegten Ressurcen frei
84 Methden der Klasse RandmAccessFile 1/2 84 readblean(), writeblean( blean b ) readbyte(), writebyte( byte b ) readshrt(), writeshrt( shrt s ) readint(), writeint( int i ) readlng(), writelng( lng l ) readchar(), writechar( char c ) readflat(), writeflat( flat f ) readduble(), writeduble( duble d ) readline()
85 Methden der Klasse RandmAccessFile 2/2 85 length() lng Liefert die Länge der Datei gemessen in Bytes setlength(int newlength) Setzt die Länge der Datei Ist newlength kleiner der aktuellen Dateilänge, wird die Datei gekürzt Ist newlength größer der aktuellen Dateilänge, wird die Datei verlängert, der zusätzliche Inhalt ist undefiniert skipbytes(int len) int Überspringt len Bytes beim Lesen; liefert die Anzahl tatsächlich übersprungener Bytes als Ergebnis
86 Anwendungsbeispiel 88 RandmAccessFile raf; try { raf = new RandmAccessFile("Test.dat", "rw"); fr ( int i=3; i<=6; i++ ) raf.writeint(i); 3, 4, 5, 6 raf.clse(); raf = new RandmAccessFile("Test.dat", "rw"); System.ut.println( raf.readint() ); raf.writeint(14); raf.writeint(15); System.ut.println( raf.readint() ); raf.clse(); raf = new RandmAccessFile("Test.dat", "r"); fr ( int i=3; i<=6; i++ ) System.ut.println( raf.readint() ); raf.clse(); catch (IOExcepTn e1) { e1.printstacktrace(); 3, 14, 15, 6 à Daten nur in der Mitte wurden überschrieben 3 6 Zuerst Testdaten schreiben Lesen, dann Daten überschreiben Prbelesen
87 89 Zusammenfassender Überblick über die wichtgsten Eingabeklassen 1/2 Byte-Stream-Klasse Zeichen-Stream-Klasse Beschreibung InputStream Reader 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 der Byte- Arrays (keine Entsprechung) InputStreamReader Wandelt einen Byte-Stream in einen Zeichen-Stream um. Sie ist das Bindeglied zwischen Byte und Zeichen DataInputStream (keine Entsprechung) Liest elementare Datentypen und auch UTF-8 FilterInputStream FilterReader Abstrakte Klasse für gefilterte Eingabe
88 90 Zusammenfassender Überblick über die wichtgsten Eingabeklassen 2/2 Byte-Stream-Klasse Zeichen-Stream-Klasse Beschreibung PushbackInputStream PushbackReader Erlaubt, gelesene Zeichen wieder in den Stream zu geben PipedInputStream PipedReader Liest vn einem PipedWriter der PipedOutputStream StringBufferInputStream (unter 1.1 nicht mehr erwünscht) StringReader Liest aus Strings SequenceInputStream (keine Entsprechung) Verbindet mehrere InputStreams
89 91 Zusammenfassender Überblick über die wichtgsten Ausgabeklassen Byte-Stream-Klasse Zeichen-Stream-Klasse Beschreibung OutputStream Writer Abstrakte Klasse für Zeichenausgabe der Byte- Ausgabe 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 Knvertiert elementare Datentypen in Strings und schreibt sie in einen Ausgabestrm PipedOutputStream PipedWriter Schreibt in eine Pipe (keine Entsprechung) StringWriter Schreibt in einen String
Java I/O. Input / Output stream Library Regelt I/O über verschiedene Kanäle. Führt notwendige Umwandlungen/Konvertierungen aus
Java I/O Input / Output stream Library Regelt I/O über verschiedene Kanäle Filesystem Console Netzwerk Intern Führt notwendige Umwandlungen/Konvertierungen aus 1 Furchtbar viele Klassen BufferedInputStream
Umleitung von Datenströmen
Datenströme Filter und Pipes In UNIX eingeführte Abstraktion beim Datenaustausch Programme arbeiten als Erzeuger und/oder als Verbraucher von Datenströmen ==> Filter Die Erzeuger- und Verbraucherschnittstelle
Datenströme in Java. Zeichenkonvertierung
Datenströme in Java Arten von Strömen Ein- und Ausgabeoperationen sind in Java im Wesentlichen über Datenströme realisiert. Dabei werden zwei Arten von Datenströmen unterschieden; byteorientierte Ströme
Vorlesung Programmieren. Java I/O: Input und Output mit Java. Ein-/Ausgabe von Daten. Java I/O. Heute. Grundlage fast aller Programme
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
Java I/O. Input / Output stream Library Regelt I/O über verschiedene Kanäle. Führt notwendige Umwandlungen/Konvertierungen aus
Java I/O Input / Output stream Library Regelt I/O über verschiedene Kanäle Filesystem Console Netzwerk Intern Führt notwendige Umwandlungen/Konvertierungen aus 1 Furchtbar viele Klassen BufferedInputStream
Einführung in die OOP mit Java Character-Streams Gliederung
Hochschule für Angewandte Wissenschaften Hamburg Hamburg University of Applied Sciences Einführung in die OOP mit Java Character-Streams Christian Dreyer 03.11.2008 Character-Streams 1 Gliederung Begriffsklärung
Java Input/Output System (IO)
Java Input/Output System (IO) Ziel: Schreiben und Lesen von Daten auf sequentielle Medien. Paket: java.io. ab Java 1.4 auch java.nio, hier nicht beru cksichtigt. Trennung in 2 Welten: - Byteorientierte
Einführung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 14: Sequentielle Ein-/Ausgabe, Ströme, Dateiorganisation.
Universität Osnabrück 1 Einführung 3 - Objektorientierte Programmierung in Java Vorlesung 14: Sequentielle Ein-/Ausgabe, Ströme, SS 2004 Prof. Dr. F.M. Thiesing, FH Dortmund Für die Ein- und Ausgabeprogrammierung
Einführung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 14: Sequentielle Ein-/Ausgabe, Streams, Dateiorganisation.
Universität Osnabrück 1 Einführung 3 - Objektorientierte Programmierung in Java Vorlesung 14: Sequentielle Ein-/Ausgabe, Streams, SS 2006 Prof. Dr. F.M. Thiesing, FH Osnabrück Für die Ein- und Ausgabeprogrammierung
Ein- und Ausgabe in Java
Ein- und Ausgabe in Java Das Package java.io enthält eine Sammlung von Klassen, die die Kommunikation mit dem Computer steuern Einlesen und Ausgeben von Dateien Ausgabe auf dem Bildschirm Einlesen von
Dynamische Datenstrukturen Jiri Spale, Algorithmen und Datenstrukturen - Dynamische Datenstrukturen 1
Dynamische Datenstrukturen 2006 Jiri Spale, Algorithmen und Datenstrukturen - Dynamische Datenstrukturen 1 Dynamische Datenstrukturen Keine konstante Kardinalität Speicherzuweisung erfolgt während der
Streams. V by WBR1&MOU2/BFH-TI. Berner Fachhochschule Hochschule für Technik und Informatik HTI
Ein- Ausgabe Streams Unterlagen zum Modul "OOP mit Java" V 3.0 2011 by WBR1&MOU2/BFH-TI Ein- Ausgabe, Streams V3.0 2011 by WBR1&MOU2/BFH-TI Definition: Berner Fachhochschule Streams Ein Stream ist eine
Javakurs für Fortgeschrittene
Javakurs für Fortgeschrittene Einheit 02: Streams filtern Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme Heutige Agenda 1. Teil: Datenströme (Streams) Filtern FilterWriter, - Reader Praxis:
Grundlagen zu Streams
17. Mit Character- und Bytestreams arbeiten Grundlagen zu Streams Was sind Streams? Die sequenziellen Ein- und Ausgaben werden in Java mit Streams (Strömen) realisiert. Mit einem Input-Stream (Eingabestrom)
Arten von Streams. Daten. Bytes (8-Bits) Java Programm. Daten. Java Programm. Characters (16 - Bits)
Datenströme Arten von Streams Daten 0 1 1 0 1 0 1 0 Java Programm Bytes (8-Bits) Daten 0 1 1 0 1 0 1 0 1 0 1 1 0 0 1 1 Java Programm Characters (16 - Bits) Byteströme(InputStream/OutputStream) I Java Programm
JAVA für Einsteiger. Streams und Dateien. eden market Autor: Norman Lahme
JAVA für Einsteiger Streams und Dateien eden market Autor: Norman Lahme 1 Gliederung 1. Einleitung 2. Bildschirmausgabe und Tastatureingabe 3. Laden und Speichern von Tex ten 4. Laden und Speichern von
Software Entwicklung 1
Software Entwicklung 1 Annette Bieniusa / Arnd Poetzsch-Heffter AG Softech FB Informatik TU Kaiserslautern Ströme zur Ein- und Ausgabe Bieniusa/Poetzsch-Heffter Software Entwicklung 1 2/ 44 Ströme zur
Streams und Files. Datenströme Byteweises Lesen und Schreiben Zeichenweises Lesen und Schreiben Dateien Serialisierung
Streams und Files Datenströme Byteweises Lesen und Schreiben Zeichenweises Lesen und Schreiben Dateien Serialisierung Pratikum SWE 2 M. Löberbauer, T. Kotzmann, H. Prähofer Streaming Quelle InputStream
Handbuch konsultieren!
Zeichenketten Klasse String Enthält zahlreiche Methoden z.b.: int length(): Anzahl der Zeichen in Zeichenkette String substring(int start): Unterzeichenkette ab Position start boolean equalsignorecase(string
Vorlesung Programmieren
Vorlesung 25.01.2007 Wintersemester 2006/2007 Computerlinguistik, Campus DU Überblick Seite 2 Datenströme: Ein und Ausgabe von Daten Java Collections Framework Eingabe/Ausgabe Seite 3 Lesen, Schreiben
Streams und Files. Datenströme Byteweises Lesen und Schreiben Zeichenweises Lesen und Schreiben Dateien Serialisierung
Streams und Files Datenströme Byteweises Lesen und Schreiben Zeichenweises Lesen und Schreiben Dateien Serialisierung Pratikum SWE 2 M. Löberbauer, T. Kotzmann, H. Prähofer 1 Streams und Files Datenströme
Programmieren I. Kapitel 15. Ein und Ausgabe
Programmieren I Kapitel 15. Ein und Ausgabe Kapitel 15: Ein und Ausgabe Ziel: einen kleinen Einblick in die vielfältigen IO Klassen geben Grober Überblick Klasse File zur Verwaltung von Dateien Random
Java Fehlerbehandlung
Java Fehlerbehandlung 1 Fehlerbehandlung In jedem nicht-trivialen Programm kann es während der Laufzeit zu Fehlersituationen kommen. Dabei handelt es sich nicht unbedingt um Programmierfehler: z. B.: Programm
Client-Server TCP/IP - Kodierung
Client-Server TCP/IP - Kodierung Die Socketklassen Ein Socket (engl. Sockel) ist eine bidirektionale Netzwerk-Kommunikationsschnittstelle, deren Verwaltung das Betriebssystem übernimmt. Die Kombination
Ein- und Ausgabe mit Java
Ein- und Ausgabe mit Java Michael Wiedau 1 math.- techn. Assistent/Informatik (IHK) 24. Mai 2004 1 [email protected] Inhaltsverzeichnis 1 Streamkonzept in Java 2 1.1 Die Klassenhierarchie.........................
Programmieren 2 Selbststudium Semesterwoche 6
Programmieren 2 Selbststudium Semesterwoche 6 1. Datenströme (Basis: Handout PRG2_SW6_OOP) 1. Gehen Sie nochmals die Kontrollfragen A durch. A.1. Ein JavaProgramm liest Daten aus einem???strom. InputStream
Programmieren 2 09 File-IO
Programmieren 2 09 File-IO Bachelor Medieninformatik Sommersemester 2015 Dipl.-Inform. Ilse Schmiedecke [email protected] 1 Eingabe und Ausgabe in Java Daten im Programm während der Ausführungszeit:
Dateien: Allgemeines Dateien lesen Beispiel: CSV-Daten Filter Ausgabe in Dateien. Programmieren I. Martin Schultheiß
Programmieren I Martin Schultheiß Hochschule Darmstadt Wintersemester 2010/2011 1 Dateien: Allgemeines 2 Dateien lesen 3 Beispiel: CSV-Daten 4 Filter 5 Ausgabe in Dateien Dateien: Allgemeines Kaum eine
Socket-Programmierung unter Java
Datenströme -Programmierung unter Java 1 - Grundlagen: Datenströme JAVA unterscheidet Streams und Reader/Writer Zur Dateneingabe: InputStream oder Reader Zur Datenausgabe: OutputStream oder Writer Verwende
Java Einführung IO (Eingabe/Ausgabe)
Java Einführung IO (Eingabe/Ausgabe) Inhalt dieser Einheit Ein-/Ausgabe: Arbeiten mit Verzeichnissen und Dateien Schreiben und Lesen von Dateien bzw. Datenströmen Fehlerbehandlung beim Schreiben und Lesen
Programmieren in Java
Programmieren in Java Dateien lesen und schreiben 2 Übersicht der heutigen Inhalte File Streams try-with-resources Properties csv-dateien 3 Klasse File Die Klasse java.io.file bietet Unterstützung im Umgang
Socket-Programmierung unter Java
Socket-Programmierung unter Java 1 - Grundlagen: Datenströme Datenströme JAVA unterscheidet Streams und Reader/Writer Zur Dateneingabe: InputStream oder Reader Zur Datenausgabe: OutputStream oder Writer
Grundlegende Java Bibliotheken
Grundlegende Java Bibliotheken Java Praktikum SS 2009 [email protected] 1 Grundlegende Java-Bibliotheken Ein-/Ausgabe Standard-IO, Streams, Files,... Ausnahmebehandlung New IO Character (En)Coding
Grundlagen der Programmierung. Kapitel 11: Ein- und Ausgabe. Ziele dieses Kapitels. Das Problem. Datei
Ziele dieses Kapitels Grundlagen der ierung Dr. Christian Herzog Technische Universität München! Sie verstehen das Konzept der Ströme Sie können n wie,, Input und Output benutzen.! Sie können in Java Dateien
Informatik B. Vorlesung 14 Serialisierung, Autoboxing. Dr. Ralf Kunze
Vorlesung 14 Serialisierung, Autoboxing 1 Serialisierung von Objekten Die Objekte innerhalb eines Java-Programmes sollen manchmal auch nach Beendigung der JVM verfügbar bleiben Objekte müssen ab und an
Ausnahmen. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung
Annabelle Klarl Zentralübung zur Vorlesung Einführung in die Informatik: http://www.pst.ifi.lmu.de/lehre/wise-13-14/infoeinf WS13/14 Fehlerarten Bei der Programmierung können viele Arten von Fehlern auftreten:
Kapitel 9. Ein- und Ausgabe. 9.1 Ströme
Kapitel 9 Ein- und Ausgabe In den bisherigen Programmbeispielen wurden die Benutzereingaben immer über die Kommandozeile und Ausgaben immer durch Aufruf der Methode System.out.println realisiert. Tatsächlich
Referat: Netzwerkprogrammierung in Java
1.)ISO/OSI und Internet Referenzmodell Referat: Netzwerkprogrammierung in Java ISO/OSI 7 Schichtenmodell (1-Bitübertragung, 2-Sicherung, 3-Netzwerk, 4-Transport, 5-Sitzung, 6- Darstellung, 7-Anwendung)
Dateien: Allgemeines Dateien lesen Beispiel: CSV-Daten Filter Ausgabe in Dateien. Programmieren I. Dr. Klaus Höppner
Programmieren I Dr. Klaus Höppner Hochschule Darmstadt Wintersemester 2008/2009 1 / 26 Dateien: Allgemeines Dateien lesen Beispiel: CSV-Daten Filter Ausgabe in Dateien 2 / 26 Dateien: Allgemeines Kaum
Client-Server TCP/IP - Kodierung
Client-Server TCP/IP - Kodierung Die klassen Ein (engl. Sockel) ist eine bidirektionale Netzwerk-Kommunikationsschnittstelle, deren Verwaltung das Betriebssystem übernimmt. Die Kombination aus IP-Adresse
Telecooperation/RBG. Grundlagen der Informatik 1 Thema 20: Ströme und Ein-/Ausgabe in Java. Dr. Guido Rößling
Technische Universität Darmstadt Telecooperation/RBG Grundlagen der Informatik 1 Thema 20: Ströme und Ein-/Ausgabe in Java Dr. Guido Rößling Copyrighted material; for TUD student use only Inhaltsverzeichnis
Objektserialisierung
Objektserialisierung SEP 170 Serialisierung von Objekten Umwandlung des Objektzustandes in einen Strom von Bytes, aus dem eine Kopie des Objekts zurückgelesen werden kann. Serialisierung in Java einfacher
Java I/O, Serialisierung und Netzwerkprogrammierung
Java I/O, Serialisierung und Netzwerkprogrammierung Philipp Güttler 16. Dezember 2009 Universität Ulm, Abt. SGI Progwerkstatt 2 19 Gliederung Java I/O, Serialisierung und Netzwerkprogrammierung 16. Dezember
Versuchsziele Konzepte der parallelen Programmierung am Beispiel von Threads anwenden können. Einbau von Kontrollmechanismen mittels Semaphore.
Hochschule Harz Versuch: fcopy Mit Java FB Automatisierung und Informatik Betriebssysteme Thema: Kopieren einer Datei unter der Kontrolle von Semaphoren Versuchsziele Konzepte der parallelen Programmierung
Vorlesung 11. Sitzung Grundlegende Programmiertechniken
Vorlesung 11. Sitzung Grundlegende Programmiertechniken Wintersemester 2007/2008 Dozent Nino Simunic M.A. Computerlinguistik, Campus DU Grundlegende Programmiertechniken, WS 2007/2008 Datenströme Externe
Java Schulung. Objektorientierte Programmierung in Java Teil VI: Wichtige Java Pakete. Prof. Dr. Nikolaus Wulff
Java Schulung Objektorientierte Programmierung in Java Teil VI: Wichtige Java Pakete Prof. Dr. Nikolaus Wulff Java Pakete Für die meisten Aufgaben stellt Java bereits viele nützliche Bibliotheken zur Verfügung:
Streams. Programmiermethodik. Eva Zangerle Universität Innsbruck
Streams Programmiermethodik Eva Zangerle Universität Innsbruck Dateien In Java gibt es eine File-Klasse. Liefert Informationen über Dateien und Verzeichnisse. Diese Klasse wurde eingeführt, um Dateioperationen
Kapitel 8: Serialisierbarkeit
Liste P: Programmieren mit Java WS 2001/2002 Prof. Dr. V. Turau FH Wiesbaden Kapitel 8: Serialisierbarkeit Folie 189 : Serialisierbarkeit Die Umwandlung eines komplexen Objektes in ein Byte-Array nennt
Java Einführung Exception Handling. Kapitel 17
Java Einführung Exception Handling Kapitel 17 Inhalt Was sind Exceptoins? Wie werden sie ausgelöst? Wie kann man Exceptions behandeln? Erweiterung von Exceptions Spezialfall IO 2 Ausnahmezustände Im Ablauf
