Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Gerhard Gröger Einführung in die Programmierung mit Java 13. Vorlesung WS 2002/2003 Übersicht • Besprechung der Hausaufgabe • Ein- und Ausgabe in Java – Motivation, Allgemeines – für Text (Character Streams) – für Rohdaten (Byte Streams) G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 2 Hausaufgabe • Schreibt ein Programm, das einen Kreis (mit Radius 50) an jeder Stelle des Frame erzeugt, an die ihr mit der Maus klickt. • Hinweise: – nutzt die "interaktive" Methode paint; die zu zeichnenden Objekte werden in einer LinkedList (Attribut Eures Frames) verwaltet – die Klick-Koordinaten stecken in dem ClickEvent – die Methode repaint() von Frame ruft paint() auf. – Kreise sind spezielle Ellipsen G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 3 Wh.: Interaktives Zeichnen in „paint“ • bisher: Zeichnen fest in „paint“ programmiert • Interaktives Zeichnen: – LinkedList mit Shapes (Attribut des Frame) – „paint“ ruft für jedes Shape in der LinkedList die Methode „draw“ auf – Füllen der LinkedList mit Shapes in anderer Methode (z.B. formMouseClicked(MouseEvent evt)) und neuzeichnen (Methode repaint()). G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 4 Wh.: Methode „Paint“ interaktiv public void paint(Graphics g) { Graphics2D g2d = (Graphics2D) g; Iterator It = z.iterator();//z:LinkedList mit Shapes while(It.hasNext()) { Shape s = (Shape) It.next(); //Typkonvertierung g2d.draw(s); g2d.fill(s); } } G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 5 Lösung der Hausaufgabe import java.awt.*; import java.awt.geom.*; import java.util.*; public class erzeugeKreise extends java.awt.Frame { private LinkedList z = new LinkedList(); void formMouseClicked(java.awt.event.MouseEvent evt) double x=evt.getX(); double y=evt.getY(); Ellipse2D kreis= new Ellipse2D.Double(x-25,y-25,50,50); z.add(kreis); repaint(); } public void paint (Graphics g){/* vorige Folie*/} } G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 6 Übungsaufgabe • Modifiziert die Hausaufgabe so, dass Liniensegmente interaktiv durch Klicken auf Anfangs- und Endpunkt eingegeben werden können. G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 7 Ein- und Ausgabe: Motivation Wo braucht man Ein-/Ausgabe? • Einlesen von GIS-Daten aus Transferdateien (GML, EDBS,..) • Einlesen von Positionen aus GPS-Empfängern • Einlesen von Tachymeter-Daten • Senden/Empfangen von Daten über Internet-Verbindung • Schreiben von GIS-Daten in Transferdateien • Manipulation von Dateien (Lesen, Ändern, Schreiben) • Ansteuerung von Geräten • .... G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 8 Allgemeines • Java: Umfangreiche Klassenbibliothek für Ein-/Ausgabe • Paket: java.io.*; • Ein-/Ausgabe sehr fehleranfällig – Aufrufe von Ein- und Ausgabemethoden müssen mit try-catch geklammert werden – entsprechende Exceptions werden ausgelöst – Exceptions sind Unterklassen von der Klasse IOException • Stream: Abstraktion der Information, die von Gerät geliefert bzw. an Gerät geschickt wird G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 9 Streams und Java-Klassen • Unterscheidung nach Art der Daten: – Rohdaten-Streams (Bytes) – Zeichen-Streams (Text) • Unterscheidung nach Richtung: – Eingabe-Streams – Ausgabe-Streams • Java-Oberklassen: Zeichen Bytes Ausgabe Writer OutputStream Eingabe Reader InputStream • Art des Geräts bzw. Art der Ein-/Ausgabe: Wahl der Unterklasse dieser 4 Oberklassen G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 10 Ausgabe von Text-Streams G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 11 Klassen zur Ausgabe von Text-Streams Basisklasse für Konstruktion von Ausgabefiltern Textausgabe via Outputstreams gepufferte Ausgabe Textuelle Ausgabe der Java-Basistypen Die gleiche Klassenhierarchie existiert auch für Reader Textausgabe in Datei G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 12 Beispiel: Schreiben von Text in Datei Um in einem String einen Backslash \ einzugeben, müssen zwei \\ hintereinander angeben werden. import java.io.*; ............... try{ FileWriter fw = new FileWriter("M:\\Java\\Beispiel.txt"); String s = "Dies ist die erste Zeile Text.\n"; fw.write(s); s = "Und dies die zweite.\n" fw.write(s); \n erzeugt Zeilenumbruch fw.write("Dies ist die dritte."); fw.close(); } catch(Exception e) { ;} G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 13 Methoden von der Klasse "FileWriter" • FileWriter(String Dateiname) //Konstruktor, erzeugt neue Datei • FileWriter(String Dateiname,boolean Anfügen) //Konstruktor; ist Anfügen falsch, so wird Datei gelöscht und //neu geschrieben, sonst wird angefügt • write(String s) //schreibt s in Datei ans Ende • close() //schließt Stream G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 14 Übungsaufgabe • Schreibt in eine Datei „zahlen.txt“ auf Eurem HomeVerzeichnis alle Zahlen von 1 bis 10.000 sowie am Schluss die Summe dieser Zahlen. Jede Zahl soll in einer neuen Zeile erscheinen: 1 2 3 4 ... G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 15 Lesen von Text-Streams • hier: nur Lesen aus Dateien • Unterschiede hinsichtlich der Menge der Zeichen, die in einem Schritt gelesen werden: – – – – ein Buchstabe eine Zeichenkette einer bestimmten Länge eine Zeile eine Token (Zeichenkette, die von bestimmten Zeichen abgegrenzt werden) G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 16 Beispiel: Lesen von Buchstaben aus Textdatei import java.io.*; ............... try{ FileReader fr = new FileReader("M:\\Java\\Beispiel.txt"); int buchstabe; do{ buchstabe = fr.read();//Lesen des nächsten Buchstabens System.out.println("Buchstabe: " + buchstabe); } while (i != -1) //bei -1 Dateiende erreicht fr.close(); } catch(Exception e) { ;} G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 17 Beispiel: Lesen von Strings aus Textdatei import java.io.*; ............... try{ FileReader fr = new FileReader("M:\\Java\\Beispiel.txt"); char [] cArray = new char [10]; int anzahlGelesen = fr.read(cArray,0,10); fr.close(); } catch(Exception e) { ;} max. Anzahl zu lesender Buchstaben Gelesene Buchstaben -> cArray Anfangsposition G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 18 Beispiel: zeilenweises Lesen aus Textdatei import java.io.*; ............... try{ FileReader fr = new FileReader("M:\\Java\\Beispiel.txt"); BufferedReader br = new BufferedReader(fr); String zeile; do{ zeile = br.readLine(); if( zeile != null ) ...... } while(zeile != null) fr.close(); } catch(Exception e) { ;} G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 19 Lesen von Token aus Textdatei Token Token Delimiter G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 20 Lesen von Token aus Textdatei • Token: Teil eines Stream, der von Delimitern begrenzt wird • Beispiel: – Stream: "abc de,f 66,z-2" – Delimiter: {" "} //Leerzeichen • Token: abc de,f 66,z-2 – Delimiter: {" ",","} //Leerzeichen und Komma • Token: abc de f 66 z-2 • Ziel: Extraktion der Token aus Stream, die bestimmte Bedeutung haben (Parsen) – Abhängig von Menge der Delimiter G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 21 Extraktion von Token: Klasse StreamTokenizer • Standard-Delimiter: Leerzeichen, Zeilenende, Dateiende, ... (können ergänzt werden) • Methoden: – StreamTokenizer(Reader): Konstruktor – int nextToken(): schaltet auf nächstes Token um • Attribute: – int ttype: Typ des Token • TT_EOF: • TT_EOL: • TT_NUMBER : • TT_WORD : – double nval: – String sval: Dateiende Zeilenende Zahl String Token als double Token als String G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 22 Beispiel: Lesen von Token aus Textdatei import java.io.*; try{ FileReader fr = new FileReader("M:\\Java\\Beispiel.txt"); StreamTokenizer st = new StreamTokenizer(fr); do{ st.nextToken(); switch (st.ttype){ case StreamTokenizer.TT_NUMBER: double d = st.nval; break; case StreamTokenizer.TT_WORD: String s = st.sval; break; default: break;} } while(st.ttype != StreamTokenizer.TT_EOF); fr.close(); }catch(Exception e) { ;} G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 23 Lesen von Byte-Streams G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 24 Klassen zum Einlesen von Rohdaten (Bytes) Datei (Lesen) aus Strings lesen Einlesen von Java Datentypen Die gleiche Klassenhierarchie existiert auch für OutputStreams zur Interprozesskommunikation gepufferte Eingabe Lesen komprimierter Daten G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 25 Beispiel: Lesen von Bytes aus Datei import java.io.*; ............... try{ FileInputStream fis = new FileInputStream("c:\\java\\IOTEST.class"); System.out.println(„Anzahl Bytes: „ + fis.available()); int b; do{ b = fis.read();//Lesen des nächsten Bytes } while (i != -1) //dann Dateiende erreicht fr.close(); } catch(Exception e) { ;} G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 26 Ende der Vorlesung • Vorlesung ist zu Ende, aber Java nicht abschließend besprochen. Unbehandelte Konzepte (u.a.): – Interfaces: Trennung von Schnittstellen und Implementierung – Abstrakte Klassen, Geschachtelte Klassen, anonyme Klassen – Nebenläufigkeit (quasi-Parallelverarbeitung) mittels Threads – Java innerhalb von WWW-Seiten: Applets – Datenbankanbindung • Vorschlag: Betrachtung bestimmter Bereiche im Rahmen einer Java-AG im Sommersemester 2003 – e-Mail und Aushang zu Beginn des Sommersemesters G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 27