22.05.2009
Transcrição
22.05.2009
Prog. 2 6 • • Prog. 2 Exceptions 6 • Ein Ereignis, das während der Programmausführung auftritt und den normalen Programmablauf stört, heißt Ausnahme oder Exception Auslösen von Exceptions Das Auslösen einer Exception besteht aus zwei Schritten – Eine Methode, in der eine Anweisung eine Ausnahmesituation auslöst, erzeugt eine Instanz der Klasse Throwable oder deren Subklassen • Üblicherweise werden beide Schritte zusammengefasst: throw new ExceptionTyp(“Message“); Beim Erzeugen eines ExceptionObjekts kann ein Fehlertext an den Konstruktor übergeben werden Der Fehlertext kann später vom Empfänger der Exception über die Methoden Throwable • Exception Error MeineGepruefteException • IOException ... ~55 der throw-Anweisung: Division 1. Erzeugen eines Exception Objekts durch Null wirft eine Exception */ mittels new-Operator 2. Werfen einer Exception mit Hilfe des ... Schlüsselworts throw Das Java-Laufzeitsystem kann Exceptions behandeln, die Instanzen von Throwable oder davon abgeleiteten Klassen sind Basisklasse für vom Laufzeitsystem erzeugte Fehler. Sollte nicht im Programm abgefangen werden. /* Werfen einer Exception mit Hilfe RuntimeException – – MeineUngepruefteException getMessage() toString() public Bruch geteilt(Bruch b) { if(b.zaehler == 0) { throw new ArithmeticException( “In Bruch: Division durch 0.“); } else { return new Bruch( this.zaehler * b.nenner, this.nenner * b.zaehler ); } } ... abgefragt werden ... ~20 22.05.2009 Prog. 2 FileNotFoundException ArithmeticException IndexOutOfBoundsException FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 6 Behandlung von Exceptions • Ausnahmen können – Innerhalb der Methode behandelt werden, in der sie auftauchen – Von einer Methode an die aufrufende Stelle weitergereicht werden (Mittels throws) • Ausnahmebehandlung (innerhalb einer Methode) mittels try-catch Anweisung – Im try-Block stehen die Anweisungen, die eine Ausnahme auslösen können – Im catch-Block werden die Ausnahmen behandelt – Leerer catch-Block verhindert Programmabbruch – Es können mehrere catch-Blöcke vorhanden sein – Anweisungen im optionalen finally-Block werden immer ausgeführt 22.05.2009 ... ~30 1 Prog. 2 6 try { /* Anweisungen, die Instanzen der Klasse Exception oder deren Subklassen werfen können.*/ ... } catch (ExceptionTyp e) { /* Bei einem Fehler wird die normale Programmausführung unterbrochen und die erste Anweisung nach der catchKlausel mit passendem ExceptionTyp ausgeführt */ ... } finally { // Optional!!! /* Anweisungen, die immer ausgeführt werden sollen */ ... } FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 22.05.2009 FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 2 try-catch Beispiel double number; String[] numbers = {“0“,“10“,“zwanzig“} for(int i=0; i<4; ++i) { try { Programm-Ausgabe: ArithmeticException: java.lang.ArithmeticException: / by zero number = 1/Integer.parseInt(numbers[i]); try-catch Ende. i: 0 System.out.println(“Number: “+number); } catch (ArithmeticException e) { System.out.println(“ArithmeticException:“); System.out.println(e); Number: 0.0 try-catch Ende. i: 1 } catch (IndexOutOfBoundsException e) { System.out.println(“IndexOutOfBoundsException:“); NumberFormatException: System.out.println(e); java.lang.NumberFormatException: For input } catch (NumberFormatException e) { System.out.println(“NumberFormatException:“); string: “zwanzig“ try-catch Ende. i: 2 System.out.println(e); } finally { System.out.println(“try-catch Ende. i: “+i); IndexOutOfBoundsException: System.out.println(); java.lang.ArrayIndexOutOfBoundsException : 3 } } 3 try-catch Ende. i: 3 22.05.2009 FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 4 Prog. 2 6 • • • Ungeprüfte Exceptions Ungeprüfte Exceptions sind Exceptions, bei denen der Compiler (zur Übersetzungszeit) keine zusätzlichen Überprüfungen vornimmt Exception-Klassen, die Subklasse der Klasse RuntimeException sind, definieren ungeprüfte Exceptions Ungeprüfte Exception sollten immer dann verwendet werden, wenn das Ergebnis voraussichtlich • Exception: IllegalArgumentException Eine Methode (meist Konstruktor) • signalisiert, dass die übergebenen Parameter ungültig sind. Hiermit kann z.B. die Erzeugung von Objekten mit • ungültigem Zustand verhindert werden.*/ ... • public Bruch(double z, double n) { if(n == 0) { throw new Geprüfte Exceptions Geprüfte Exceptions müssen behandelt werden Compiler überprüft zur Übersetzungszeit, ob alle geprüften Exceptions behandelt werden Exception-Klassen, die Subklasse der Klasse Exception sind, definieren geprüfte Exceptions Eine Methode, die eine geprüfte Exception wirft, muss dies durch eine throws-Anweisung im Methodenkopf kenntlich machen – Für ungeprüfte Exceptions sollte keine throws-Anweisung angegeben werden (obwohl Java es erlaubt) IllegalArgumentException( “In Bruch: Nenner = 0“); – nicht gefangen wird Ungeprüfte Exceptions können mittels try-catch-Anweisung gefangen werden, müssen aber nicht 6 /* Beispiel für eine ungeprüfte – ein Programmabbruch ist • Prog. 2 } else { • this.zaehler = z; this.nenner = n; } } Aufrufer einer Methode, die eine geprüfte Exception werfen kann, muss diese in einem try-Block behandeln Prog. 2 6 FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 5 22.05.2009 Prog. 2 throws Beispiel 6 static public boolean isPrime(int n) // throws ArithmeticException (ungeprüfte Ex) { if (n<=0) { throw new ArithmeticException( “isPrime: Parameter<=0“); } if (n==1) { return false; } for (int i=2; i<=n/2; ++i) { if(n%i==0) { return false; } } return true; } public static void main(String[] a){ try{ System.out.print(“10 is prime: “); System.out.println(isPrime(10)); Systen.out.print(“5 is prime: “); System.out.println(isPrime(5)); optional System.out.print(“0 is prime: “); System.out.println(isPrime(0)); } catch (ArithmeticException e) { System.out.println(“ArithmeticException:“); System.out.println(e); } static private void openFile() // geprüfte Exception ! throws FileNotFoundException { eingabeDatei = new BufferedReader( new FileReader(“zahlen.dat“)); } } ... BufferedReader eingabeDatei; eingabeDatei = new BufferedReader( new FileReader(“testDatei.txt“)); /* Fehlermeldung vom Compiler: Unhandled exception type FileNotFoundException */ try { eingabeDatei = new BufferedReader( new FileReader(“testDatei.txt“)); } catch (FileNotFoundException e) { System.out.println(“Datei nicht gefunden.“); System.out.println(“Bitte erneut versuchen.“); } private void openFile() throws FileNotFoundException // Sonst Fehler! { eingabeDatei = new BufferedReader( new FileReader(“testDatei.txt“)); try{ openFile(); } catch(FileNotFoundException e){ • FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke Gezieltere Fehlerbehandlung durch eigene Exception-Klassen /* Definition einer eigenen geprüften Exception-Klasse. – Hinweis auf den Fehlerkontext StackOverflowException erbt – Gezieltes Reagieren auf Exceptions der eigenen Klasse alle Attribute und Methoden der Klasse Exception und enthält zusätzlich das Attribut • Eigenen Exception-Klassen werden abgeleiten von – Exception overflowElement */ class StackOverflowException extends Exception • Eigene Exception-Klasse ist eine geprüfte Exception Muss! System.out.println(“FileNotFoundException“); System.out.println(e.getMessage()); { int overflowElement; – RuntimeExeption • Eigene Exception-Klasse ist eine ungeprüfte Exception StackOverflowException(int x) { overflowElement = x; Programm-Ausgabe } 10 is prime: false 5 is prime: true ArithmeticException: java.lang.ArithmeticException: isPrime: Parameter<=0 FileNotFoundException: zahlen.dat (No such file or directory) FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 6 Eigene Exception Klassen } 22.05.2009 import java.io.*; } ... 22.05.2009 // Beispiel für geprüfte Exceptions 7 } 22.05.2009 FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 8 Prog. 2 Prog. 2 Eigene Exceptions (einfaches Beispiel) 6 class Stack { int[] s; int length; boolean overflow, underflow; Stack(int size){ s = new int[size]; length = 0; overflow = false; underflow = false; } void push(int x) throws StackOverflowException { overflow = length >= s.length; if(overflow) throw new StackOverflowException(x); else s[length++] = x; } int pop() { underflow = length ==0; if(!underflow) return s[--length]; else return -1; } public class StackTest { public static void main(String[] args) { Stack s = new Stack(10); StackOverflowException: StackOverflowException: StackOverflowException: StackOverflowException: StackOverflowException: Prog. 2 6 • • • • 9 Liefert Eigenschaften mit Name key 2. public static String getProperty(String key, String default) • 22.05.2009 Wie 1., jedoch Rückgabe von default anstatt null, falls keine Eigenschaft key • public static void main(String[] args){ String[] s = {“java.version“, “java.home“, • “os.name“, “os.version“, “file.separator“, “path.separator“, for(int i=0; i<s.length; ++i) { FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke } } } • Programm-Ausgabe 1.5.0_06 .../JavaVM.framework/Versions/1.5.0/Home Mac OS X 10.4.6 / : Die Methode getProperties liefert das Properties-Objekt mit den System-Properties /* Auflisten verfügbaren System-Properties*/ import java.util.*; public class PrintProperties { public static void main(String[] a) { Die Methode propertyNames erzeugt einen Enumerator mit dem Nebenstehendes Beispiel liefert alle verfügbaren SystemProperties – sowohl system-abhängige als auch system-unabhängige 11 10 Die Methode getProperties – durch Aufruf von getProperty der zugehörige Wert ermittelt werden kann System.out.println(System.getProperty(s[i])); FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke public static void main(String[] args){ try { checkTemp(5); } catch(TempTooLowException e) { System.out.println(e); } catch(TempTooHighException e) { System.out.println(e); } } Properties sProps = System.getProperties(); Enumeration propNs = sProps.propertyNames(); while(propNs.hasMoreElements()){ String propN = (String)propNs.nextElement(); – alle Schlüsselwerte durchlaufen werden können “line.separator“}; Zugriff auf einzelne Properties • 6 public class PrintProperty { Zugriff auf Systemeigenschaften in Java über die Klasse Properties (abgeleitete von Hashtable) 1. public static String getProperty(String key) 22.05.2009 Prog. 2 // Zugriff auf System-Properties Jede Eigenschaft besitzt einen eindeutigen Namen, unter dem auf sie zugegriffen werden kann public static void checkTemp(double temp) throws TempTooLowException, TempTooHighException { if(temp < MIN_TEMP) { throw new TempTooLowException(temp); } else if (temp > MIN_TEMP) { throw new TempTooHighException(temp); } } class TempTooHighException extends TemperatureException { public TempTooHighException(double temp){ super(“Max. Temperatur ueberschritten: “+ temp); } Programm-Ausgabe } } TempTooLoowException: Min. Temperatur unterschritten: 5.0 Die Klasse Properties Über das Konzept der Properties kann in Java auf System-Eigenschaften zugegriffen werden public class ThowsTest{ final static double MIN_TEMP = 10.0; final static double MAX_TEMP = 100.0; class TempTooLowException extends TemperatureException { public TempTooLowException(double temp){ super(“Min. Temperatur unterschritten: “+ temp); } } 10 11 12 13 14 FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke Eigene Exceptions (zweites Beispiel) class TemperatureException extends Exception { public TemperatureException(String s){ super(s); } } /* Würde zur Compilerfehlermeldung führen: Unhandled exception type StackOverflowExample for(int i=0; i<20; ++i){ s.push(i); } */ for(int i=0; i<15; ++i){ try { s.push(i); } catch(StackOverflowException e) { System.out.print(e+“: “); System.out.println(e.overflowElement); } } } } Programm-Ausgabe } 22.05.2009 6 22.05.2009 System.out.println(propN + “=“ + System.getProperty(propN)); } } } Programm-Ausgabe java.runtime.name=Java(TM) 2 Runtime Environment... sun.boot.library.path=/System/Library/Frameworks/.. java.vm.version=1.5.0_06-64 awt.nativeDoubleBuffering=true gopherProxySet=false java.vm.vendor="Apple Computer, Inc." java.vendor.url=http://apple.com/ path.separator=: ... FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 12 Prog. 2 6 Die Klasse File • Die Klasse File (aus java.io) – stellt eine Abstraktion einer Datei bzw. eines Verzeichnisses dar – behandelt nicht den Inhalt einer Datei, sondern abstrahiert Name und Zugriffspfad • File besitzt die Konstruktoren Prog. 2 6 • Konstruiert File-Objekte zum Dateioder Verzeichnisnamen – public File(String parent, String child) Aufrufe */ • Wie 2. jedoch Übergabe von FileObjekt anstatt Verzeichisnamen • boolean isDirectory() • boolean isFile() • boolean canRead() • boolean canWrite() import java.io.*; – File f1 = new File(“TestDatei.txt“); – /* Unter DOS muss der Backslash – doppelt angegeben werden, da er gleichzeitig Escape-Zeichen für – Strings ist. */ Prog. 2 6 Liefert true, wenn f File ist Liefert true, wenn f lesbar ist String getName() File f3 = new • String[] list() – – File(“.“,“Beispiel.java“); File f4 = new • File(“/usr/testusr“); • File f5 = new FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke Liefert ein String-Array mit den } Namen der Dateien/Verzeichnisse im, durch f bezeichneten, Verzeichnis } Liefert true, wenn f existiert long length() – 13 Liefert Datei-/Verzeichnis-Namen boolean exists() – 22.05.2009 import java.io.*; public class VerzeichnisInfo { public static void main(String[] args) { File fod = new File("."); Out.println("Name : "+fod.getName()); Out.println("Pfad : "+fod.getPath()); Out.println(“Pfad voll : "+fod.getAbsolutePath()); Out.println("Schreiben : "+fod.canWrite()); Out.println("Lesen : "+fod.canRead()); Out.println("File : "+fod.isFile()); Liefert true, wenn in f geschrieben werden kann • File(f4,“FileExample.java“); 22.05.2009 Liefert true, wenn f Verzeichnis ist File f2 = new File(“c:\\documents\\docu.doc“); • Getrennte Übergabe von Verzeichnis- und Datei-Namen – public File(File parent, String child) f ist Instanz von File: /* Beispiele für gültige Konstruktor- – public File(String pathname) Methoden der Klasse File if(fod.isDirectory()) { Out.println("Directory : "+fod.isDirectory()); String flist[] = fod.list(); for(int i=0; i<flist.length; ++i) Out.println("-- "+flist[i]); } ProgrammAusgabe: Liefert die Anzahl Bytes in f Name : . Pfad : . Pfad voll : .../workspace/FileTest/. Schreiben : true Lesen : true File : false Directory : true -- .classpath -- .project -- VerzeichnisInfo.class -- VerzeichnisInfo.java FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 14 Prog. 2 Streams 6 Byte-Streams (OutputStream, InputStream) • Byte-Stream transportieren Bytes (Rohdaten, Binärinformationen) zwischen Sender und Empfänger • Abstrakte Basisklassen aller Byte-Streams sind • Alle Verbindungen nach außen (I/O-Vorgänge) erfolgen in Java über Streams • Streams sind abstrakte Verbindungen (Datenleitungen) eines Programms nach außen – OutputStream, mit den Methoden • public void close() – Auf der einen Seite gehen Daten ein, auf der anderen Seite werden sie angenommen – Ausgabestrom schließen (Freigabe aller zugehörigen System-Resourcen) • public void flush() • Das Paket java.io stellt zwei verschiedene Streams zur Verfügung – Gepufferte Daten schreiben • public void write(int b) – Schreibt die unteren 8 Bit von b – Byte-Streams • public void write(byte[] b) • Transportieren Bytes zwischen Sender und Empfänger – Schreibt b.length Bytes des Byte-Arrays b • Dienen dem Transport von „Rohdaten“ (z.B. Binärinformationen) • public void write(byte[] b,int offs, int len) – Character-Streams (seit JDK 1.1) – Schreibt len Bytes, bei offs beginnend, aus dem Byte-Array b • Vereinfachen die Ein-/Ausgabe von Unicode Zeichen • Vereinfachen Schreib- und Lesevorgänge für Textdateien – InputStream • Später mehr... 22.05.2009 FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 15 22.05.2009 FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 16 Prog. 2 Prog. 2 Klassendiagramm OutputStream/InputStream 6 6 FileOutputStream Byte stream Object Objekt vom Typ FileOutputStream /* FileOutputStream Beispiel. Legt eine Datei an und fügt die Bytes 0..255 an. */ OutputStream ... InputStream FileOutputStream FileInputStream FilterOutputStream BufferedInputStream DataOutputStream ObjectOutputStream PipedOutputStream ByteArrayOutputStream ... 6 • • ObjectInputStream public abstract int read() throws IOException • • – – – 22.05.2009 Liest ein Byte als Integer ein (die oberen drei Byte sind leer) Liefert -1 bei Dateiende public int read(byte[] b) throws IOException • Liest Bytes in das Byte-Array b ein • Gibt die Anzahl gelesener Bytes zurück public int read(byte[] b, int off, int len) throws IOException • Liest len Bytes in Byte-Array b , ab Position off ein • Gibt Anzahl gelesener Bytes zurück public long skip(long n) throws IOException • Überspringt von n Bytes • Löscht sie aus dem Eingabe-Strom 17 • Setzt Dateizeiger auf den Anfang public class FOSExample { public static void main(String[] args) { try { FileOutputStream out = new FileOuputStream(args[0],true); for(int i=0; i<256; ++i) { out.write(i); } out.close(); Prog. 2 6 } catch(IOException e) { System.err.println(e); System.exit(1); Entspricht 1., setzt aber den Dateizeiger auf das Ende der Datei, falls append=true 22.05.2009 } } } FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 18 FileInputStream Byte stream – public int available() throws IOException Objekt vom Typ FileInputStream import java.io.*; public class FISExample { • Liefert die Anzahl Bytes, die ohne Blockieren mindestens gelesen werden können (Die meisten Implementierungen geben hier immer max. 1 zurück) public static void main(String[] args) { myFile.dat try { FileInputStream in = new FileInputStream(args[0]); – public void close() thows IOException • Schließt den Eingabe-Strom – public void mark( int readlimit) • Markiert die aktuelle Position im Eingabestrom – public void reset() – • Testet ob Markieren / Positionieren unterstützt wird byte[] buf = new byte[4096]; int len; while((len=in.read(buf))>0) { out.write(buf,0,len); Öffnen einer Datei mit Namen name } out.close(); FileInputStream(File file) throws FileNotFoundException • – public boolean marksupported() FileOuputStream(args[1]); FileInputStream(String name) throws FileNotFoundException • – • Springt zur, mit mark gesetzten Markierung FileOutputStream out = new • FileInputStream stellt einen Byte-Stream zum Lesen aus einer Datei zur Verfügung • Konstruktoren • readlimit gibt maximale Anzahl zu markierender Zeichen an FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke Legt gewünschte Ausgabe-Datei an 3. FileOutputStream(File file) throws IOException AudioInputStream Die Basisklasse InputStream – • • ByteArrayInputStream ... Abstrakte Basisklasse aller EingabeByte-Streams Methoden FileOutputStream stellt einen Byte-Stream zur Ausgabe in eine Datei zur Verfügung Konstruktoren 2. FileOutputStream(String name, boolean append) throws FileNotFoundException PipedInputStream FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke import java.io.*; 1. FileOutputStream(String name) throws FileNotFoundException ... ... Prog. 2 • DataInputStream PrintStream 22.05.2009 • FilterInputStream In der Vorlesung BufferedOutputStream myFile.dat in.close(); } catch(IOException e) { Öffnen einer Datei zum File-Objekt file System.err.println(e); } } } 19 22.05.2009 FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke Bereits vorhandene Zieldatei wird ohne Rückfrage überschrieben 20 Prog. 2 Prog. 2 6 Filter-Streams • Streams können (mehrfach) geschachtelt werden 6 • FilterOutputStream ist Basisklasse aller gefilterten AusgabeStreams – Ein InputStream bzw. OutputStream stellt eine Stream-Verbindung zwischen einem Programm und einer Datei her – Abgeleitete Klassen bekommen das Ausgabegerät bei der Instanzierung in Form eines OutputStream-Arguments übergeben – Diese Streams können mit Filter-Streams geschachtelt werden, welche die durchlaufenden Daten filtern oder zwischenspeichern • FilterOutputStream / FilterInputStream • public FilterOutputStream(OutputStream out) – Von FilterOutputStream abgeleitete Klassen Filter-Streams • fangen Schreibzugriffe ab • verarbeiten diese • leiten sie an den OutputStream out weiter – können keine direkte Stream-Verbindung zu einem Ein-/Ausgabe-Gerät herstellen – können Daten in einen elementaren Eingabe- oder Ausgabe-Stream (InputStream, OutputStream) eingeben oder daraus lesen ... FilterStream FilterStream FileOutputStream • FilterInputStream ist Basisklasse aller gefilterten EingabeStreams – Abgeleitete Klassen bekommen das Eingabegerät bei der Instanzierung in Form eines InputStream-Arguments übergeben File • public FilterInputStream(InputStream in) – Von FilterInputStream abgeleitete Klassen ... 22.05.2009 FilterStream FilterStream FileInputStream • fangen Lesezugriffe ab • verarbeiten diese • leiten sie an den InputStream in weiter File FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 21 Prog. 2 22.05.2009 Prog. 2 FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke BufferedOutputStream / BufferedInputStream 6 DataOutputStream • BufferedOutputStream puffert die Ausgabe in einen AusgabeStream • • void writeBoolean(boolean v) Mittels DataOutputStream können throws IOException primitive Datenypen in definierter und • void writeByte(int v) portabler Weise ausgegeben werden • Die so geschriebenen Daten können mittel DataInputStream wieder eingelesen werden 6 – Beschleunigt die Ausgabe, wenn viele einzelne write-Aufrufe, die jeweils nur wenig Daten übertragen, erfolgen – Konstruktoren • public BufferedOutputStream(OutputStream out) • public BufferedOutputStream(OutputStream out, int size) • DataOutputStream implementiert das Interface DataOutput – Datenquelle und Puffergröße – Methoden – Für jeden primitven Datentyp gibt es eine Methode • public void flush() throws IOException – erzwingt das Schreiben der gepufferten Daten • BufferedInputStream puffert die Eingabedaten – Zusätzlich gibt es eine Methode writeUTF zur Konvertierung der 2Byte langen UNICODE-Zeichen in 1, 2 oder 3 Byte lange Einzelzeichen – Beschleunigt das Einlesen, wenn häufig kleine Datenmengen oder einzelne Bytes gelesen werden müssen – Konstruktoren • public BufferedInputStream(InputStream out) • public BufferedInputStream(InputStream out, int size) – Datenquelle und Puffergröße 22.05.2009 FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 23 22.05.2009 22 throws IOException • void writeShort(int v) throws IOException • void writeChar(int v) throws IOException • void writeInt(int v) throws IOException • void writeLong(long v) throws IOException • void writeFloat(float v) throws IOException • void writeDouble(double v) throws IOException • void writeChars(String s) throws IOException • void writeUTF(String str) throws IOException FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 24 Prog. 2 Prog. 2 6 DataInputStream • Mittels DataInputStream können die • boolean readBoolean() throws IOException von DataOutputStream • byte readByte() geschriebenen Daten eingelesen throws IOException werden • short readShort() • DataInputStream implementiert das Interface DataInput – Für jeden primitven Datentyp gibt es eine Methode 6 • void readFully(byte[] b, int off, int len) throws IOException 22.05.2009 Prog. 2 6 • import java.io.*; • • new BufferedInputStream( • String readUTF() throws IOException FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke FileInputStream(“test.dat“))); new DataOutputStream( new BufferedOutputStream( System.out.println(in.readInt()); new FileOutputStream(“test.dat“))); System.out.println(in.readDouble()); System.out.println(in.readUTF()); in.close(); out.writeInt(1); } catch(IOException e) { out.writeDouble(Math.PI); System.err.println(e); out.writeUTF(“Hallo Welt“); out.close(); float readFloat() throws IOException String readLine() throws IOException new DataOutputStream out = long readLong() throws IOException • new DataInputStream( try {// Datei schreiben int readInt() throws IOException double readDouble() throws IOException DataInputStream in = public static void main(String[] args) { char readChar() throws IOException • try {// Dateiinhalt ausgeben public class DatenEinUndAusgabe { throws IOException • – Zusätzlich gibt es Methoden zum einlesen von Datenbytes ungeachtet • ihres Typs • void readFully(byte[] b) throws IOException DataOutputStream/DataInputStream (Beispiel) } } catch(IOException e) { } System.err.println(e); } } DataOutputStream 25 BufferedOutputStream 22.05.2009 DataInputStream BufferedInputStream File FileOutputStream FileInputStream File Programm-Ausgabe: 1 3.141592653589793 Hallo Welt FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 26 Prog. 2 Character Streams 6 Klassendiagramm Writer/Reader Object Byte-Streams arbeiten auf Basis von Bytes und gehen davon aus, dass Zeichen im ASCII Standard dargestellt werden Byte stream Objekt vom Typ OutputStream Byte stream Objekt vom Typ InputStream • In Java werden Zeichen (Character) gemäß dem Unicode-Standard mit zwei Byte dargestellt • Character Streams dienen der vereinfachten zeichenorientierten Ein/Ausgabe • Abstrakte Basisklassen aller Character Streams sind die Klassen Writer OutputStreamWriter InputStreamReader In der Vorlesung FileWriter BufferedWriter CharArrrayWriter – Writer (Schreibvorgänge) ... Reader FilterWriter FileReader BufferedReader CharArrayReader FilterReader – Reader (Lesevorgänge) character stream Objekt vom Typ Writer character stream Objekt vom Typ Reader 22.05.2009 FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke PipedWriter PipedReader PrintWriter StringReader StringWriter 27 22.05.2009 FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 28 Prog. 2 6 FileWriter • Konkrete Klasse für Schreibvorgänge in Dateien Prog. 2 /* Unten stehendes Programm schreibt den Text „Hallo Welt“ in die Datei Testdatei.txt“.*/ • Erweiterung der abstakten Klasse OutputStreamWriter import java.io.*; • Konstruktoren public class FileWriterExample { – FileWriter(String dateiname) throws IOException • – – • Prog. 2 – void write(string str) throws IOException – void close() throws IOException • • Schreibt s in den Ausgabestrom – newLine() thows IOException • Schreibt einen Zeilenseparator (Property: line.separator) public class FileReaderExample { public static void main(String[] args) { String datei =“FileReaderExample.java"; try { FileReader fr = new FileReader(datei); int c; while( (c=fr.read())!=-1 ) Out.print((char)c); fr.close(); – public int read() throws IOException } catch(FileNotFoundException e) { } • Gibt den Integer-Wert eines Charakter zurück (bei Dateiende -1) – public void close() throws IOException } catch(IOException e) { } } } • Schließt den Character-Stream } 29 22.05.2009 Prog. 2 import java.io.*; public class BWriterExample { public static void main(String[] args) { String s[] = new String[2]; s[0] = "Hallo"; s[1] = "Welt"; BufferedReader • Speichert gelesene Character in einen Puffer Kann Lesegeschwindigkeit erhöhen Ermöglicht das Einlesen kompletter Zeilen Konstruktoren • FileWriter fw = new FileWriter(“Test.txt"); BufferedWriter bw = new BufferedWriter(fw); • – BufferedReader(Reader in) for(int i=0; i<s.length; ++i) { bw.write((i+1)+". Zeile: "+s[i]); • Erzeugt einen gepufferten CharacterEingabe-Stream bw.newLine(); – BufferedReader(Reader in, int size) } bw.close(); • Zusätzliche Angabe der Puffergröße } catch (FileNotFoundException e) {} catch (IOException e) {} } BufferedWriter FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 6 • try { } import java.io.*; Methoden catch(FileNotFoundException e) { } • Erzeugt einen gepufferten Character-Ausgabe-Stream – write(String s) thows IOException aus. */ • Öffnet Datei zum File-Objekt file catch(IOException e) { } • Zusätzliche Angabe der Puffergröße „FileReaderExample.java“ auf der Konsole – FileReader(File file) throws FileNotFoundException // Muss Methoden Nachfolgendes Programm gibt den Inhalt von • Öffnen der Datei dateiname } – BufferedWriter(Writer out, int size) /* – FileReader(String dateiname) thows FileNotFoundException fw.close(); – BufferedWriter(Writer out) 22.05.2009 Konstruktoren fw.write(text); FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke Schreibt Zeichen gepuffert in einen Ausgabestrom Kann Schreibgeschwindigkeit erhöhen Ermöglicht das Schreiben von Textzeilen Konstruktoren • • // Optional • • Erweiterung der abstakten Klasse OutputStreamReader FileWriter fw = new FileWriter(datei); Methoden BufferedWriter • • try { Öffnen der Datei zum File-Objekt file 6 • Konkrete Klasse für Lesevorgänge aus Dateien String datei ="Testdatei.txt"; Ist append=true, wird an eine bestehende Datei angehängt 22.05.2009 • String text ="Hallo Welt"; FileWriter(File file) throws IOException • FileReader public static void main(String[] args) { Öffnen einer Datei (existierende Datei wird überschrieben) FileWriter(String dateiname, boolean append) throws IOException • 6 FileWriter • Methoden • Liest Textzeile • Als Zeilenende werden akzeptiert: line feed (\n), carriage return (\r) oder (\r\n) Inhalt der Datei Test.txt 1. Zeile: Hallo 2. Zeile: Welt FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke import java.io.*; import java.util.*; public class BReaderExample { public static void main(String[] args) { Vector cont = new Vector(); String datei = “BReaderExample.java"; try { FileReader fr = new FileReader(datei); BufferedReader br = new BufferedReader(fr); String zeile; while((zeile = br.readLine())!=null) cont.add(zeile); br.close(); } catch (FileNotFoundException e) {} catch (IOException e) {} for(int i = (cont.size()-1); i>=0; --i) Out.println((String) cont.elementAt(i)); – String readLine() throws IOException File 30 } } BufferedReader FileReader File Ausgabe: Der Quellcode in umgekehrter Reihenfolge 31 22.05.2009 FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 32 Prog. 2 6 • Prog. 2 Standard-Datenströme 6 In Java sind die Standard-Datenströme für Eingabe, Ausgabe und Fehlermeldungen als statische Variablen der Klasse System realisiert – System.in • • • Statische Variable vom Typ InputStream (Byte-Stream) • Erwartet standardmäßig eine Eingabe von Tastatur • – System.out • Statische Variable vom Typ PrintStream (Byte-Stream) • Standard Ausgabe-Strom Tastatureingabe Mittels Standard-Eingabestrom System.in kann die Eingabe von der Tastatur erreicht werden Schachtelung mit dem CharacterStream BufferedReader macht den Einlesevorgang komfortabler Durch Schachtelung mit InputStreamReader erhält man den benötigten Stream vom Typ Reader // Einlesen einer Zeile von der Tastatur import java.io.*; public class TastaturEingabe { public static void main(String[] args){ BufferedReader eingabe = new BufferedReader( new InputStreamReader(System.in)); System.out.println("Eingabe: "); • Ausgabe wird standardmäßig in die Konsole geschrieben – System.err • Statische Variable vom Typ PrintStream (Byte-Stream) • Strom für Fehlermeldungen • Ausgabe wird standardmäßig in die Konsole geschrieben • 22.05.2009 FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke String zeile = ""; BufferedReader eingabe = new BufferedReader ( new InputStreamReader ( Sytem.in)); 33 Mittels readLine() können dann Zeilen von der Tastatur eingelesen werden 22.05.2009 try { zeile = eingabe.readLine(); } catch (IOException e) {} System.out.println(zeile); } } FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 34