Kein Folientitel - Institut für Geodäsie und Geoinformation der

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