3-A6 pdf

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