E.1 TestCase E Testen mit JUnit E.1 TestCase ■ Test-First-Ansatz ■ Sammelt alle Unit-Tests zu einer Klasse. ◆ Tests werden erstellt bevor der eigentliche Produktionscode implementiert wird ■ Erbt von junit.framework.TestCase. ◆ sobald ein Test erfolgreich aufgerufen werden kann ist der zugehörige Produktionscode ausreichend ■ Verfügt per Konvention über den Klassennamen <Name>Test.java. ■ Beispiel: ◆ Entwicklung verläuft in Mikro-Iterationen von 10-15 min import junit.framework.*; ■ Unit-Test public class MoneyTest extends TestCase { ◆ testet eine Methode einer Klasse ◆ überprüft das Verhalten einer Methode unter Rand- und Normalbedingungen public MoneyTest (String name){super(name);} public void testAmount(){ Money money = new Money(3.00); assertTrue(3.00 == money.getAmount()); } Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JUnit.fm 2002-04-30 12.22 E.1 OOVS OOVS ◆ ist jederzeit wiederholbar } Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. JUnit.fm 2002-04-30 12.22 E.3 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. E.1 TestCase E Testen mit JUnit E.1 TestCase ■ Erzeugen der Testbasis (Fixture) mit setUp(): ■ Vorteile der Kombination aus Unit-Tests und Test-First-Ansatz: ◆ verändert den Programmcode der Applikation nicht import junit.framework.*; ◆ gewährleistet definierte Funktion auch nach großen Modifikationen des Programmcodes public class MoneyTest extends TestCase { private Money money; ◆ weniger debugging am kompletten System public MoneyTest (String name){super(name);} ◆ kleinerer Programmcode protected void setUp(){money = new Money(3.00);} ◆ reduziert den Wartungsaufwand public void testAmount(){ assertTrue(3.00 == money.getAmount()); } Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JUnit.fm 2002-04-30 12.22 E.2 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. OOVS OOVS } ■ Aufräumen der Testbasis mit tearDown(). Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JUnit.fm 2002-04-30 12.22 E.4 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. E.2 Asserts E.3 Testsuiten E.2 Asserts E.3 Testsuiten ■ assert()-Methoden überprüfen Testbedingungen: ■ Aufruf eines einzelnen Tests: ◆ assertTrue() stellt fest, ob eine Bedingung wahr ist TestResult result = (new MoneyTest(“testAmount”)).run(); ◆ assertEquals() verifiziert, ob zwei Objekte gleich sind ■ Sammlung der Testfälle eines TestCase: ◆ assertSame() verifiziert, ob zwei Referenzen auf das gleiche Objekt verweisen public class MoneyTest extends TestCase { ◆ assertNull() public static Test suite(){ TestSuite suite = new TestSuite(); suite.addTest( new MoneyTest(“testAmount”); suite.addTest( new MoneyTest(“testSimpleAdd”); return suite; } .... ◆ assertNotNull() ■ Beispiel: assertEquals(“rounded amount”,2,money.getAmount(),0.002); } junit.framework.AssertionFailedError: rounded amount expected:<2.0> but was:<1.995> at MoneyTest.testRounding(MoneyTest.java:16) Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JUnit.fm 2002-04-30 12.22 E.5 OOVS OOVS ■ Ausgabe im Fehlerfall: Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. JUnit.fm 2002-04-30 12.22 E.7 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. E.2 Asserts E.3 Testsuiten E.2 Asserts E.3 Testsuiten ■ fail() kann verwendet werden wenn es keine passende assert() Methode gibt ■ Sammlung der Testfälle mehrere TestCases: public class AllTests extends TestCase { ■ Beispiel: public static Test suite() { TestSuite = new TestSuite(); suite.addTest(MoneyTest.suite()); suite.addTest(CustomerTest.suite()); } public void testIndexOutOfBoundsException() { Vector v= new Vector(10) try{ Object o= v.elementAt(v.size()); fail("Should raise ArrayIndexOutOfBoundsException"); } catch (ArrayIndexOutOfBoundsException e) {} public static void main(String args[]){ junit.textui.TestRunner.run(suite); } } Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JUnit.fm 2002-04-30 12.22 E.6 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. OOVS OOVS } Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JUnit.fm 2002-04-30 12.22 E.8 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. E.3 Testsuiten F Ausgewählte Kapitel des Java Laufzeitsystems E.3 Testsuiten ■ UML-Darstellung der Abhängigkeiten interface Test ■ Fehlerbehandlung (Exceptions) ■ Ein-/Ausgabesystem (Streams) 1..* ■ Threads TestSuite Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JUnit.fm 2002-04-30 12.22 E.9 OOVS OOVS TestCase Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. JavaRTS.fm 2002-04-30 12.22 F.1 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. E.4 TestRunner F.1 Fehlerbehandlung E.4 TestRunner F.1 Fehlerbehandlung ■ batch-TestRunner : junit.textui.TestRunner ■ Programm beenden (System.exit()) ◆ meist eine schlechte Idee ■ swing-TestRunner: junit.swingui.TestRunner ■ Ausgabe einer Fehlermeldung ◆ hilft nicht den Fehler zu überwinden ■ spezieller Rückgabewert kennzeichnet Fehler ◆ Konstruktoren haben keinen Rückgabewert ◆ Was ist wenn die Methode den Wertebereich des Rückgabewerts bereits voll ausnutzt? ■ Aufruf einer benutzerdefinierten Fehlerroutine ◆ unschön Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JUnit.fm 2002-04-30 12.22 E.10 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. OOVS OOVS ◆ Was muss diese Methode tun? ■ Lösung: Ausnahmebehandlung (Exceptions)! Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.2 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. F.1 Fehlerbehandlung F.1 Fehlerbehandlung 1 Was ist Ausnahmebehandlung? 2 Was passiert bei einem Methodenaufruf? (2) class Customer { void createAccount(Bank bank) { Account account = new Account(); bank.newAccount(account, ■ Weiterreichen des Programmflusses vom Fehlerursprung zur Fehlerbehandlung A.m() B.n() C.p() class Main { public static void main(String args[]) { Customer c = new Customer(); c.createAccount(new Bank()); ■ Verantwortlichkeit: Stackframe von createAccount ◆ Benutzer des Codes weiß was zu tun ist, hat jedoch nicht die Möglichkeit den Fehler zu erkennen. Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen JavaRTS.fm 2002-04-30 12.22 F.3 OOVS OOVS ◆ Autor eines Codestücks kann den Fehler erkennen, weiß jedoch nicht wie er behandelt werden soll. • Universität Erlangen-Nürnberg • Informatik 4, 2002 class Bank { void newAccount(Account a, int i) { int counter = 0; ... } bank account args c Stackframe von main • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.1 Fehlerbehandlung class Customer { void createAccount(Bank bank) { Account account = new Account(); bank.newAccount(account, class Bank { void newAccount (Account a, int i) { int counter = 0; ... } Stackframe von Stackframe von createAccount Parametervariable lokale Variablen Stack Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen JavaRTS.fm 2002-04-30 12.22 F.4 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. OOVS OOVS class Bank { void newAccount(Account a, int i) { int counter = 0; ... } class Main { public static void main(String args[]) { Customer c = new Customer(); c.createAccount(new Bank()); newAccount • Universität Erlangen-Nürnberg • Informatik 4, 2002 F.5 2 Was passiert bei einem Methodenaufruf? (3) class Main { public static void main(String args[]) { Customer c = new Customer(); c.createAccount(new Bank()); main lokale Variable Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen F.1 Fehlerbehandlung Stackframe von Parametervariable Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. 2 Was passiert bei einem Methodenaufruf? args c lokale Variable (account) Stack Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. class Customer { void createAccount (Bank bank) { Account account = new Account(); bank.newAccount(account, 5); Parametervariable (bank) Stackframe von main account 5 Parametervariable (a) Parametervariable (i) 0 lokale Variable (counter) bank account Parametervariable (bank) args c lokale Variable (account) Parametervariable lokale Variable Stack Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.6 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. F.1 Fehlerbehandlung F.1 Fehlerbehandlung 2 Was passiert bei einem Methodenaufruf? (4) class Customer { void createAccount(Bank bank) { Account account = new Account(); bank.newAccount(account, 2 Was passiert bei einem Methodenaufruf? (6) class Customer { void createAccount(Bank bank) { Account account = new Account(); bank.newAccount(account, class Bank { void newAccount(Account a, int i) { int counter = 0; ... } class Main { public static void main(String args[]) { Customer c = new Customer(); c.createAccount(new Bank()); OOVS bank account Stackframe von main args c class Main { public static void main(String args[]) { Customer c = new Customer(); c.createAccount(new Bank()); Parametervariable (bank) lokale Variable (account) Parametervariable lokale Variable Stack Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.7 OOVS Stackframe von createAccount class Bank { void newAccount(Account a, int i) { int counter = 0; ... } Stack Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. JavaRTS.fm 2002-04-30 12.22 F.1 Fehlerbehandlung F.1 Fehlerbehandlung 2 Was passiert bei einem Methodenaufruf? (5) class Customer { void createAccount(Bank bank) { Account account = new Account(); bank.newAccount(account, F.9 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. 3 Try, Throw und Catch-Anweisung class Bank { void newAccount(Account a, int i) { int counter = 0; ... } try { ... if (...) throw new MyException(); ... } catch(MyException e) { // exception handler ... } class Main { public static void main(String args[]) { Customer c = new Customer(); c.createAccount(new Bank()); ■ throw wird benutzt um eine Ausnahme (Exception) zu werfen ■ ein catch-Block muss direkt nach dem try-Block folgen ■ es kann mehr als nur einen catch-Block geben ◆ der passende catch-Block wird nach der Programmreihenfolge gesucht Stackframe von main args c Parametervariable lokale Variable Stack Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.8 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. OOVS OOVS ■ ein Methode muss nicht alle Exception fangen ◆ nicht gefangene Exception werden automatisch an die aufrufende Methode weitergereicht Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.10 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. F.1 Fehlerbehandlung F.1 Fehlerbehandlung 4 Finally-Anweisung 6 Fehlerklassen ■ der finally-Block wird immer beim Verlassen eines try-Blockes ausgeführt ■ alle Exceptions sind von Throwable abgeleitet ■ Ausnahmen die beinahe überall auftreten können sind: ◆ kann zum Aufräumen benutzt werden bei (un-)behandelten Ausnahmen ◆ Error: Linkerfehler, Fehler im Format von Klassendateien, out of memory,.. try { ... } catch(...) { ... // Fehlerbehandlung } finally { ... // Ressourcen freigeben } ◆ RuntimeException: array index, null pointer, illegal cast, ... ■ Ausnahmen von Anwendungen sind von java.lang.Exception abgeleitet Throwable getMessage() Exception try { ... if (...) return; ... } finally { ... } Error needs not to be declared or catched Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.11 OOVS OOVS ■ ein finally-Block kann auch ohne catch-Block benutzt werden: ... RuntimeException Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. JavaRTS.fm 2002-04-30 12.22 F.1 Fehlerbehandlung F.1 Fehlerbehandlung 5 throws-Anweisung 7 Ausnahmen und Vererbung: Fehlerbehandlung ■ unbehandelte Exceptions müssen bei der Methode angeben werden: ■ Ausnahmebehandlung von Unterklassen durch mehrere catch-Blöcke class Test { void m() throws MyException { ... if (...) throw new MyException(); ... } } ■ Bemerkung: Die Oberklasse behandelt alle Unterklassen, die Oberklasse sollte daher immer am Ende “gefangen” werden: class MathException {} class ZeroDivideException extends MathException {} class InvalidArgException extends MathException {} try { ... } catch(ZeroDivideException e) { ... } catch(InvalidArgException e) { ... } catch(MathException e) { ... } Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.12 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. OOVS OOVS F.13 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.14 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. F.1 Fehlerbehandlung F.1 Fehlerbehandlung 8 Beispiel 9 Beispiel class TestException extends Exception { public TestException(String s) {super(s);} } class E1 extends Exception {} class E2 extends Exception {} class E3 extends E2 {} class A { void m() throws E2 {} } class B extends A { void m() throws ??? {} } public class Test { public void testIt() { try { hello(); ... } catch (TestException t) { System.out.println("Exception raised:" + t.getMessage()); } finally { // clean up } } Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.15 ■ ??? = OOVS OOVS public void hello() throws TestException { if (...) throw new TestException("...an error description..."); } Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. JavaRTS.fm 2002-04-30 12.22 F.17 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. F.1 Fehlerbehandlung F.1 Fehlerbehandlung 9 Ausnahmen und Vererbung: Throwing 9 Beispiel (2) ■ Können überschriebene Methoden andere Exceptions werfen, als die ursprüngliche Methode? class E1 extends Exception {} class E2 extends Exception {} class E3 extends E2 {} class A { void m() throws E2 {} } class B extends A { void m() throws ??? {} } ■ Grundsatz: ◆ Unterklassen können überall dort verwendet werden wo die Oberklasse erwartet wird. ◆ Unterklassen sind “besser” als Oberklassen. ■ das bedeutet: ◆ Unterklassen dürfen keine zusätzlichen Exception werfen. ■ ??? = ◆ Unterklassen können Unterklassen von den deklarierten Ausnahmen der Oberklasse werfen. Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.16 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. OOVS OOVS ◆ Unterklassen dürfen keine Oberklassen von den ursprünglich deklarierten Ausnahmen werfen. Falsch sind: Richtig sind: E1 Exception ... E2 E3 keine Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.18 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. F.1 Fehlerbehandlung F.2 Das Java Ein-/Ausgabesystem 10 Zusammenfassung 1 Byteströme ■ werfen von Ausnahmen: throw new MyException("..."); ■ Programm-Block für den die Ausnahmebehandlung gilt: try { ... } ■ Ausnahmebehandlung: Benutzer try { ... throw new MyException("..."); ... } catch(MyException e) { ... } read() ■ Zusätzlich: finally-Block ■ Ausnahmen müssen von Throwable abgeleitet sein. Datenquelle write() Bytestrom Bytestrom InputStream OutputStream Datensenke ■ Ausnahmen von Anwendungen sollten von Exception abgeleitet werden. void mymethod() throws ... Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.19 OOVS OOVS ■ Ausnahmen müssen bei der Methodendeklaration angegeben werden: Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. JavaRTS.fm 2002-04-30 12.22 F.21 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. F.2 Das Java Ein-/Ausgabesystem F.2 Das Java Ein-/Ausgabesystem F.2 Das Java Ein-/Ausgabesystem 2 Spezialisierungen von Strömen ■ Wo kommen die Daten her, wo gehen sie hin? ■ Grundlegendes Konzept: Ströme (Streams) ◆ Byteströme (InputStream/OutputStream) FileInputStream ◆ Zeichenströme (Reader/Writer) Datei Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.20 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. OOVS OOVS FileOutputStream Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.22 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. F.2 Das Java Ein-/Ausgabesystem F.2 Das Java Ein-/Ausgabesystem 2 Spezialisierungen von Strömen (2) 2 Spezialisierungen von Strömen (4) ■ Wo kommen die Daten her, wo gehen sie hin? ■ Wo kommen die Daten her, wo gehen sie hin? FileInputStream ByteArrayInputStream byte[] Datei FileInputStream ByteArrayInputStream FileOutputStream ByteArrayOutputStream byte[] Datei FileOutputStream ByteArrayOutputStream SocketInputStream ? Internet Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.23 OOVS OOVS SocketOutputStream Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. JavaRTS.fm 2002-04-30 12.22 F.2 Das Java Ein-/Ausgabesystem F.2 Das Java Ein-/Ausgabesystem 2 Spezialisierungen von Strömen (3) 3 Klassendiagram der Eingabeströme InputStream ■ Wo kommen die Daten her, wo gehen sie hin? FileInputStream ByteArrayInputStream byte[] ByteArrayInputStream Datei FileOutputStream F.25 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. ByteArrayOutputStream FileInputStream PipedInputStream FilterInputStream SequenceInputStream DataInput SocketInputStream ObjectInput Internet BufferedInputStream PushbackInputStream DataInputStream Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.24 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. OOVS OOVS SocketOutputStream ObjectInputStream Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.26 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. F.2 Das Java Ein-/Ausgabesystem 5 Kombinieren von Strömen ■ Aus einer Datei lesen: ■ Aus einfachen Strömen “komfortable” Ströme generieren import java.io.*; ■ Der komfortable Strom umhüllt den einfachen Strom public class InTest { public static void main (String argv[]) throws IOException { FileInputStream f = new FileInputStream ("/tmp/test"); byte buf[] = new byte[4]; f.read(buf); } } ■ ➜ Decorator Design-Pattern Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.27 OOVS OOVS F.2 Das Java Ein-/Ausgabesystem 4 FileInputStream, FileOutputStream Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. JavaRTS.fm 2002-04-30 12.22 F.29 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. F.2 Das Java Ein-/Ausgabesystem F.2 Das Java Ein-/Ausgabesystem 4 FileInputStream, FileOutputStream (2) 5 Kombinieren von Strömen (2) ■ In eine Datei schreiben: import java.io.*; public class OutTest public static void FileOutputStream byte buf[] = new for (byte i=0; i f.write(buf); } } { main (String argv[]) throws IOException { f = new FileOutputStream ("/tmp/test"); byte[4]; < buf.length; i++) buf[i]=i; Benutzer read() Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.28 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. OOVS OOVS Datenquelle Bytestrom InputStream Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.30 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. F.2 Das Java Ein-/Ausgabesystem F.2 Das Java Ein-/Ausgabesystem 5 Kombinieren von Strömen (3) 7 Reader/Writer ■ Zeichenströme zur Ein- und Ausgabe (Reader, Writer) Benutzer Benutzer read() Zeichen-strom Datenquelle readInt() Datenquelle Bytestrom InputStream write() Zeichenstrom Reader Writer Datensenke DataInputStream Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.31 OOVS OOVS ■ Zeichenströme enthalten Unicodezeichen (16 bit) Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. JavaRTS.fm 2002-04-30 12.22 F.2 Das Java Ein-/Ausgabesystem F.2 Das Java Ein-/Ausgabesystem 6 DataInputStream 8 Reader ■ InputStream ist relativ unkomfortabel ■ wichtige Methoden: ◆ int read() liest ein Zeichen und gibt es als int zurück ■ DataInputStream wird verwendet um eine binäre Darstellung der Daten zu lesen (int, float,...) ◆ int read(char buf[]) liest Zeichen in ein Array. Liefert die Anzahl der gelesenen Zeichen zurück oder -1 falls ein Fehler aufgetreten ist ■ Ein DataInputStream kann aus jedem InputStream erzeugt werden: InputStream in = new FileInputStream ("/tmp/test"); DataInputStream dataIn = new DataInputStream(in); float f = dataIn.readFloat(); ◆ int read(char buf[], int offset, int len) liest len Zeichen in den Puffer buf, beginnend ab offset ◆ long skip(long n) überspringt n Zeichen ■ readLine() kann verwendet werden um ganze Zeilen zu lesen: ◆ void close() schließt den Strom Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen JavaRTS.fm 2002-04-30 12.22 F.32 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. OOVS OOVS for(;;) { String s = dataIn.readLine(); System.out.println(s); } • Universität Erlangen-Nürnberg • Informatik 4, 2002 F.33 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.34 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. F.2 Das Java Ein-/Ausgabesystem F.2 Das Java Ein-/Ausgabesystem 8 FileReader 10 Gepufferte Ein-/Ausgabe ■ Wird verwendet um aus einer Datei zu lesen ■ Lesen/Schreiben von einzelnen Zeichen kann teuer sein. ■ Konstruktoren: ■ Umrechnung der Zeichenkodierung kann teuer sein. ◆ FileReader(String fileName) ■ Falls möglich BufferedReader, BufferedWriter verwenden. ◆ FileReader(File file) ■ BufferedReader kann aus jedem anderen Reader erzeugt werden. ◆ FileReader(FileDescriptor fd) ■ Wichtige Methoden von BufferedWriter: void flush(): Leert den Puffer - schreibt den Puffer zum ungepufferten Writer: ■ Keine weitere Methoden (nur die von InputStreamReader geerbten) ■ Was ist ein InputStreamReader? Puffer Benutzer Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.35 OOVS OOVS read() Datenquelle ... Reader BufferedReader Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. JavaRTS.fm 2002-04-30 12.22 F.37 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. F.2 Das Java Ein-/Ausgabesystem F.2 Das Java Ein-/Ausgabesystem 9 Byte- und Zeichenströme 10 Gepufferte Ein-/Ausgabe (2) ■ Umwandeln von Byteströmen in Zeichenströme mit Hilfe einer Codierung ■ BufferedReader kann ganze Zeilen lesen: String readLine() Codierung BufferedReader in = new BufferedReader(new FileReader("test.txt")); String line = in.readLine(); Local Unicode Benutzer A B BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String line = in.readLine(); ... read() Datenquelle Bytestrom Bytestrom InputStream Zeichenstrom InputStreamReader Reader Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.36 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. OOVS OOVS ■ einige Codierungen: "Basic Latin", "Greek", "Arabic", "Gurmukhi" Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.38 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. F.2 Das Java Ein-/Ausgabesystem 11 PrintWriter ■ Kann von jedem OutputStream oder Writer erzeugt werden. ■ println(String s): schreibt den String und das/die EOL Zeichen. ■ Beispiel: Datei einlesen und auf der Standardausgabe ausgeben: OOVS import java.io.*; public class CopyStream { public static void main(String a[]) throws Exception { BufferedReader in = new BufferedReader( new FileReader("test.txt")); PrintWriter out = new PrintWriter(System.out); for(String line; (line = in.readLine())!=null;) { out.println(line); } out.close(); } } Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.39 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors. F.2 Das Java Ein-/Ausgabesystem 12 FileWriter ■ FileWriter wird verwendet um Zeichen in eine Datei zu schreiben. OOVS ■ Nachdem das Schreiben beendet ist sollte close() aufgerufen werden! Objektorientierte Konzepte in Verteilten Systemen und Betriebssystemen • Universität Erlangen-Nürnberg • Informatik 4, 2002 JavaRTS.fm 2002-04-30 12.22 F.40 Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.