Sitzung 11

Werbung
Praktikum
Entwicklung und Einsatz
von Geosoftware I
•
Sitzung 11: IO – Streams in Java
Sommersemester 2004
Jan Drewnak
20.07.2004
Sitzung 11
Überblick
• Lesen und Speichern in Dateien:
Filestreams und Tokenizer
• Kurzeinführung in Exceptions
und das Exception-Handling in Java
20.07.2004
I/O – Streams in Java
Streams
• Daten werden sequentiell aus einem DatenStrom gelesen, bzw. in einen Daten-Strom
geschrieben
• Ein solcher Datenstrom kann zu
unterschiedlichen Quellen (Datei, Speicher,
Netzressource, Konsole, Objekte, …) und
Datenformate (Binär, Text, …) verbunden sein –
zeigt aber immer dasselbe Verhalten
20.07.2004
I/O – Streams in Java
Lesen und Schreiben in Streams
•Das Prinzip ist immer gleich:
Reading
Writing
open a stream
open a stream
while more information
while more information
read information
close the stream
20.07.2004
I/O – Streams in Java
write information
close the stream
2 Arten von Streams in Java
Character-Streams
Byte-Streams
Mehr Infos im Sun-Tutorial unter:
Essential Java Classes  Lesson: I/O: Reading and Writing (but no 'rithmetic)
20.07.2004
I/O – Streams in Java
Copy Beispiel aus dem Tutorial
import java.io.*;
public class Copy {
public static void main(String[] args) throws IOException {
File inputFile = new File("farrago.txt");
File outputFile = new File("outagain.txt");
FileReader in = new FileReader(inputFile);
// file treated as char stream
FileWriter out = new FileWriter(outputFile);
int c;
while ((c = in.read()) != -1)
out.write(c);
in.close();
out.close();
}
}
20.07.2004
I/O – Streams in Java
Beispiel
Beispiel Punkte schreiben/lesen
• Einfaches ARC-Generate Ascii-Dateiformat für Punkte
Mehr Infos unter:
http://gis.washington.edu/cfr250/lessons/data_export/
20.07.2004
I/O – Streams in Java
Beispiel Punkte schreiben - 1
import java.util.*;
import java.io.*;
class GeneratePointFileWriter {
void write(String fileName, java.util.List pointList) throws IOException {
PrintWriter pw = new PrintWriter(new FileWriter(new File(fileName)));
double x, y;
Point p;
int i = 1;
Iterator pointIterator = pointList.iterator();
while (pointIterator.hasNext()) {
p = (Point)pointIterator.next();
x = p.getX();
y = p.getY();
pw.println(i + ", " + x + ", " + y);
i++;
}
pw.println("END");
pw.close();
}
}
20.07.2004
I/O – Streams in Java
Beispiel Punkte schreiben - 2
…
final JFileChooser fileChooser = new JFileChooser();
int returnVal = fileChooser.showSaveDialog(GISFrame.this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
GeneratePointFileWriter pointWriter = new GeneratePointFileWriter();
try {
pointWriter.write(file.getAbsolutePath(), model.getPointLayer() );
} catch (Exception IOException) {
// writing failed:
JOptionPane.showMessageDialog(GISFrame.this,
"Can not store File:" + file.getAbsolutePath(), "Writing Error",
JOptionPane.ERROR_MESSAGE);
}
}…
20.07.2004
I/O – Streams in Java
Beispiel Punkte lesen - 1
public class GeneratePointFileReader {
public List read(String name) throws IOException {
BufferedReader in = new BufferedReader(new FileReader(name));
List pointList = new ArrayList();
double x, y; int i = 0;
// read first line
String line = in.readLine();
while (!line.equals("END")) {
// using StringTokenizer to parse string; using comma as delimeter
StringTokenizer st = new StringTokenizer(line, ", ", false);
st.nextToken(); //overread point-number
// extract the point
x = Double.valueOf(st.nextToken()).doubleValue();
y = Double.valueOf(st.nextToken()).doubleValue();
Point p = new Point(x, y);
pointList.add(p);
// read next line
line = in.readLine();
}
in.close();
return pointList;
}
20.07.2004
I/O – Streams in Java
Beispiel Punkte lesen - 2
…
final JFileChooser fileChooser = new JFileChooser();
int returnVal = fileChooser.showOpenDialog(GISFrame.this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
GeneratePointFileReader pointReader = new GeneratePointFileReader();
try {
newPoints = pointReader.read(file.getAbsolutePath());
} catch (Exception IOException) {
// reading failed:
JOptionPane.showMessageDialog(GISFrame.this, "Can not read File:" +
file.getAbsolutePath(), "Reading Error", JOptionPane.ERROR_MESSAGE);
}
}
…
20.07.2004
I/O – Streams in Java
StringTokenizer
• Dient der Zerlegung einer Zeichenkette (in einem
String oder Stream) in Teilzeichenketten
• Voreingestellte Trennzeichen sind Leerzeichen,
Tabulatoren und Zeilenvorschübe
• Es können andere Trennzeichen definiert werden
Mehr Infos:
www.javabuch.de; Kapitel 17.1
20.07.2004
I/O – Streams in Java
Beispiel StringTokenizer
while (!line.equals("END")) {
// using StringTokenizer to parse
// string; using comma as delimeter
StringTokenizer st =
new StringTokenizer(line, ", ", false);
st.nextToken(); //overread point-number
// extract the point
x =
Double.valueOf(st.nextToken()).doubleValue();
y =
Double.valueOf(st.nextToken()).doubleValue();
Point p = new Point(x, y);
pointList.add(p);
// read next line
line = in.readLine();
}
20.07.2004
I/O – Streams in Java
Überblick Exceptions in Java
• Eine Exception ist ein außergewöhnliches
Verhalten, dass den normalen (= geplanten)
Programmfluss unterbricht (Lese- oder
Schreibefehler, Division durch Null, …)
• Eine Exception wird dort geworfen (throw), wo
der Fehler auftritt und dort aufgefangen
(try…catch), wo der Fehler behandelt werden
soll
• Exceptions müssen (irgendwann) aufgefangen
werden !
Mehr Infos im Sun-Tutorial unter:
Essential Java Classes  Lesson: Handling Errors with Exceptions
20.07.2004
I/O – Streams in Java
Exceptions in Java – try & catch
• Der try catch Block:
try {
// code, der Fehler auslösen könnte
}
catch ( . . . ) {
. . .
}
catch ( . . . ) {
. . .
}
. . .
20.07.2004
I/O – Streams in Java
Exceptions in Java – try & catch
• Unterschiedliche Spezialisierung von der
Basisklasse Exception für unterschiedliche
Behandlungen:
try {
… //unsichere Array-Index Zugriffe
… //unsichere IO-Methoden
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("Caught ArrayIndexOutOfBoundsException: " +e.getMessage());
} catch (IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
}
20.07.2004
I/O – Streams in Java
Exceptions in Java – try & catch
• In dem Beispiel zum Einlesen von Punkten:
try {
pointWriter.write(file.getAbsolutePath(),
model.getPointLayer() );
}
catch (IOException ioe) {
// writing failed:
JOptionPane.showMessageDialog(GISFrame.this,
"Can not store File:" + file.getAbsolutePath(), "Writing
Error", JOptionPane.ERROR_MESSAGE);
}
20.07.2004
I/O – Streams in Java
Exceptions in Java – throw
• Eine Methode wirft eine Exception weiter:
void write(String fileName, List pointList) throws IOException {
BufferedReader in = new BufferedReader(new FileReader(name));
int b = in.read();
...
}
• Eine Methode erzeugt und wirft eine Exception:
public Object pop() throws EmptyStackException {
Object obj;
if (size == 0)
throw new EmptyStackException();
// EmptyStackException is a self created class
// that is derived from Exception
...
}
20.07.2004
I/O – Streams in Java
Aufgabe 7
• Erweiterung des Programms:
• Polylinien-Layer unter Verwendung des bereitgestellten
GeneratePolylineFileReader einlesen und darstellen (sofort)
• GPFR & Beispieldaten: Exchange-Platte unter
\Geosoftware_I\Geowissenschaftler Kurs SS04\Aufgabe7
• Punkt-Layer im ARC ASCII Generate Format einlesen und
abspeichern (Hausaufgabe)
• Die angegebenen Stellen in dem
Tutorial lesen und erarbeiten !
• Abgabe: Samstag 24.07. 24:00 !
20.07.2004
I/O – Streams in Java
Aufgabe – Format für Liniendateien
•Das ARC ASCII Generate
Format zur Abspeicherung
von Polylinien
•Jede Linie beginnt mit einer
ID und endet
mit END
•Die Datei endet mit END
20.07.2004
I/O – Streams in Java
Aufgabe – Format für Polygondateien
•Das ARC ASCII
Generate Format zur
Abspeicherung von
Polygonen
•Jedes Polygon
beginnt mit einer ID
sowie einem
Labelpoint und endet
mit END
•Die Datei endet mit
END
20.07.2004
I/O – Streams in Java
Vorschlag für ein Klassendiagramm
interface
Geometry
+b oundingBox:BoundingBox
BoundingBox
pLL:Point
pUR:Point
BoundingBox
BoundingBox
+height:double
+width:double
+equals:boolean
+upperRight:Point
+lowerLeft:Point
+exist:boolean
+dimension:int
Point
#x_:double
#y_:double
Point
+equals:boolean
getX:double
getY:double
+boundingBox:BoundingBox
JPanel
GISViewer
TestGUI
+main:void
Polyline
model:Model
preferredSize:Dimension
af:AffineTransform
boundingBox:BoundingBox
mode:int
hasChanged:boolean
GISViewer
GISViewer
updateTransformation:void
updateBoundingBox:void
+getMode:int
+setMode:void
hasChanged:boolean
+getPreferredSize:Dimension
+paintComponent:void
points:List
points:PointList
points:PointList
Polyline
Polyline
+add:void
+removeLast:void
+length:double
+boundingBox:BoundingBox
+iterator:Iterator
Polygon
+add:void
+removeLast:void
+perimeter:double
+boundingBox:BoundingBox
+iterator:Iterator
JFrame
GISFrame
viewer:GISViewer
model:Model
GISFrame
EditMenueListener
FileMenueListener
ViewMenueListener
GISWindowListener
PointList
+add:void
+removeLast:void
+first:Point
+last:Point
+clear:void
+boundingBox:BoundingBox
+iterator:Iterator
PolylineList
Model
pointLayer:PointList
polylineLayer:PolylineList
polygonLayer:PolygonList
Model
+add:void
+add:void
+add:void
+newPointLayer:void
+newPolylineLayer:void
+newPolygonLayer:void
+removePoints:void
+removePolylines:void
+removePolygons:void
+pointLayerIterator:Iterator
+polylineLayerIterator:Iterator
+polygonLayerIterator:Iterator
+boundingBox:BoundingBox
GISMouseListener
20.07.2004
PointList
Polygon
I/O – Streams in Java
PolygonList
polylines:List
polygons:List
PolylineList
+add:void
+removeLast:void
+first:Polyline
+last:Polyline
+clear:void
+boundingBox:BoundingBox
+iterator:Iterator
PolygonList
+add:void
+removeLast:void
+first:Polygon
+last:Polygon
+clear:void
+boundingBox:BoundingBox
+iterator:Iterator
GeneratePointFileWriter
GeneratePolylineFileWriter
write:void
write:void
GeneratePointFileReader
GeneratePolylineFileReader
+read:PointList
+read:PolylineList
Herunterladen