Ü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