Ubungen VII zur Vorlesung Angewandte Informatik

Werbung
Übungen VII zur Vorlesung Angewandte Informatik
Prof. Dr. Nikolaus Wulff
zum 30. November 2006
1
EventListener
Java verwendet für graphische Oberflächen basierend auf den AWT oder
Swing Paketen sogenannte Listener Schnittstellen. Implementierungen dieser
Listener-Schnittstellen können sich bei entsprechenden Java Komponenten
registrieren lassen und werden dann beim Eintreten bestimmter Ereignisse
informiert.
Einige wichtige Listener Schnittstellen sind:
• java.awt.event.ActionListener
• java.awt.event.WindowListener
• java.awt.event.MouseListener
• java.awt.event.MouseMotionListener
Einige wichtige Nachrichten:
• java.awt.event.ActionEvent
• java.awt.event.WindowEvent
• java.awt.event.MouseEvent
•
Aufgabe
Konsultieren Sie die Java Dokumentation welche Methoden und Nachrichten diese Schnittstellen definieren. Achten Sie auch auf entsprechende
Adapter Klassen, die diese Listener implementieren. Wozu sind diese Listener gut, bzw. wie lassen sie sich verwenden und was ist deren Aufgabe? Wir
werden in der Übung und in den folgenden Vorlesungen dieses Listenerkonzept erörtern.
1
2
Datei Ein- und Ausgabe
UNIX Betriebsysteme besitzen mehrere Werkzeuge zum Anzeigen von Dateien. Es sind die Programme head, tail und cat. Diese zeigen den Anfang,
das Ende oder den gesamten Inhalt einer Datei auf der Konsole an.
Aufgabe:
Entwickeln Sie das Head Utility in Java. Das Programm soll folgende
Situationen beherrschen:
• Head versteht Kommandozeilenargumente:
– -l number: number ist die Anzahl der zu verarbeitenden Zeilen
– -s srcname: übergibt den Namen der Eingabedatei
– -d dstname: übergibt den Name der Ausgabedatei
• Wird Head ohne Argumente aufgerufen, so liest es von der Standardeingabe und gibt seine Ausgabe auf der Standardausgabe aus, d.h.
Head interpretiert Unix pipes richtig.
Einige Aufrufbeispiele von head mögen das Verhalten verdeutlichen:
head
head
head
head
-s dummy.txt -d test.txt :
< dummy.txt -d test.txt :
< dummy.txt > test.txt :
-s dummy.txt -l 4
:
kopiert dummy.txt nach test.txt
kopiert dummy.txt nach test.txt
kopiert dummy.txt nach test.txt
Konsolausgabe der ersten 4 Zeilen
Die Reihenfolge der ”-s”, ”-d” und ”-l” Argumente ist dabei egal. Wird ein
anderes Kommandoargument übergeben so erfolgt eine kurze Hilfe mit der
Aufrufbeschreibung und das Programm beendet sich.
Tip:
Java verwendet ähnliche Konzepte wie C. Es gibt im java.io-Paket eine
Klasse File, die der C FILE Struktur entspricht. Mit ihrer Hilfe lassen sich
sogenannte Input- und OutputStreams erzeugen. Die Ströme besitzen read
und write Methoden mit dennen sich eine allgemeine copy Routine entwickelt
lässt.
Speziell für Dateien gibt es die abgeleitetten Klassen FileInputStream und
FileOutputStream. Auch System.out und System.in sind spezielle Instanzen
dieser abstrakten IO-Ströme.
Das java.io-Paket kann zu Recht als eine objektorientierte Schicht für
die C <stdio.h> Implementierungen betrachtet werden. Konsultieren Sie
ihre JavaDoc API Beschreibung. Sollten Sie diese noch nicht installiert haben, so laden Sie sich die entsprechende Zip Datei von der Sun Website
http://java.sun.com/j2se/1.5.0/download.jsp herunter.
Entwickeln Sie ihre Lösung modular, die Kommandozeilenauswertung,
das Erzeugen geeigneter Ströme und das eigentliche Kopieren sind unterschiedliche Aufgaben, die sich in separaten Methoden implementieren und
2
dann auch an der Tafel diskutieren lassen. Ein Programm ist mehr als eine
main-Routine in einer programmierten Endlosschleife...
3
Persistenz per Serialisierung
Mit Hilfe der Java Serialisierung gibt es einen einfachen (primitiven) Weg,
um den Status von Java Objekten in einen Strom zu schreiben und persistent
zu machen. Auch ist es so möglich Objekte remote per Sockets zu verschicken. Alle Java Objekte erben hierzu von der Klasse Objekt die privaten
Methoden readObject und writeObject, diese wird zur Serialisierung aufgerufen. In speziellen Fällen müssen diese Methoden gegebenenfalls überladen
werden. Damit Objekte serialisierbar sind müssen die Klassen das Markerinterface java.util.Serializable implementieren, ansonsten wird beim Aufruf von
read/writeObject eine java.util.NotSerializableException geworfen.
Aufgabe
• Entwickeln Sie einen Algorithmus der alle Elemente eines Containers
in einer Datei ”Ausgabe.ser” serialisiert.
• Testen Sie diese Operation indem Sie einige Elemente in den Container
fügen und ihn anschließend serialisieren. Schauen Sie sich die Datei mit
einem Editor an. Was enthält diese Datei?
• Entwickeln Sie die umgekehrte Operation, die die ursprüngliche Ausgabedatei wieder einliest.
• Überlegen Sie wie sich das Ganze in einem JUnit Test namens SerialPersistenzTest automatisieren lässt.
Tip
Verwenden Sie hierzu die entsprechenden Input/Output-Ströme aus dem
java.io Paket ObjectOutputStream und ObjectInputStream. Temporäre Dateien für JUnit Tests lassen sich im setUp mit der statischen Methode File.createTempFile erzeugen. Gelöscht werden diese am einfachsten in der
tearDown-Methode.
3
Herunterladen