Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java...
-
Upload
siegfried-kembel -
Category
Documents
-
view
108 -
download
1
Transcript of Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java...
Praktikum Entwicklung und Einsatz
von Geosoftware I-
Sitzung 9IO – Streams in Java
Sommersemester 2003
Lars Bernard
Geosoftware I – Lars Bernard
Überblick
• Lesen und Speichern in Dateien:Filestreams und Tokenizer
• Kurzeinführung in Exceptions und das Exception-Handling in Java
Geosoftware I – Lars Bernard
Streams
• Daten werden sequentiell aus einem Daten-Strom gelesen, bzw. in einen Daten-Strom geschrieben
• Ein solcher Datenstrom kann zu unterschiedlichen Quellen (Datei, Speicher, Netzressource) und Datenformate (Binär, Text, …) verbunden sein – zeigt aber immer dasselbe Verhalten
Geosoftware I – Lars Bernard
Lesen und Schreiben in Streams
Reading
open a stream
while more information
read information
close the stream
Writing
open a stream
while more information
write information
close the stream
• Das Prinzip ist immer gleich:
Geosoftware I – Lars Bernard
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)
Geosoftware I – Lars Bernard
Copy Beispiel aus dem Tutorialimport 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();
}
}
Geosoftware I – Lars Bernard
Beispiel Punkte schreiben/lesen
• Einfaches ARC-Generate Ascii-Dateiformat für Punkte:
Mehr Infos unter:http://gis.washington.edu/cfr250/lessons/data_export/
Geosoftware I – Lars Bernard
Beispiel Punkte schreiben - 1import java.util.*;
import java.io.*;
class GeneratePointFileWriter {
void write(String fileName, java.util.List pointList) throws IOException {
PrintWriter out = new PrintWriter(new FileWriter(new File(fileName)));
double x, y;
Point p;
int i = 1;
java.util.Iterator pointIterator = pointList.iterator();
while (pointIterator.hasNext()) {
p = (Point)pointIterator.next();
x = p.getX();
y = p.getY();
out.println(i + ", " + x + ", " + y);
i++;
}
out.println("END");
out.close();
}
}
Geosoftware I – Lars Bernard
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(), "WritingError", JOptionPane.ERROR_MESSAGE);
}
}…
Geosoftware I – Lars Bernard
Beispiel Punkte lesen - 1public class GeneratePointFileReader {
public java.util.List read(String name) throws IOException {
BufferedReader in = new BufferedReader(new FileReader(name));
java.util.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;
}
}
Geosoftware I – Lars Bernard
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);
}
…
Geosoftware I – Lars Bernard
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
Geosoftware I – Lars Bernard
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();
}
Geosoftware I – Lars Bernard
Ü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 aufgefangen werden !
Mehr Infos im Sun-Tutorial unter:Essential Java Classes Lesson: Handling Errors with Exceptions
Geosoftware I – Lars Bernard
Exceptions in Java – try & catch
• Der try catch Block:
try { . . . } catch ( . . . ) { . . . } catch ( . . . ) { . . . } . . .
Geosoftware I – Lars Bernard
Exceptions in Java – try & catch • Unterschiedliche Spezialisierung von der
Basisklasse Exception für unterschiedliche Behandlungen:
try {
. . .
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("Caught ArrayIndexOutOfBoundsException: " + e.getMessage());
} catch (IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
}
Geosoftware I – Lars Bernard
Exceptions in Java – try & catch
• In dem Beispiel zum einlesen von Punkten:
try {
pointWriter.write(file.getAbsolutePath(), model.getPointLayer() );
}
catch (Exception IOException) {
// writing failed:
JOptionPane.showMessageDialog(GISFrame.this, "Can not store File:" + file.getAbsolutePath(), "WritingError", JOptionPane.ERROR_MESSAGE);
}
Geosoftware I – Lars Bernard
• Eine Methode wirft eine Exception weiter:void write(String fileName, java.util.List pointList) throws
IOException { BufferedReader in = new BufferedReader(new FileReader(name));...}
• 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
...
}
Exceptions in Java – throw
Geosoftware I – Lars Bernard
Aufgabe 7
• Erweiterung des Programms so, dass mindestens Punkt-Layer und Polylinien-Layer unter verwendung des ARC ASCII Generate Format (neu) eingelesen und abgespeichert werden können
• Die angegebenen Stellen in dem Tutorial lesen und erarbeiten !
• Der Code soll mittels Java Doc dokumentiert werden – selbständig im Tutorial einarbeiten! Fragen dazu in der nächsten Sitzung.
• Abgabe: Montag 21.07. 12.00 !
Geosoftware I – Lars Bernard
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
Geosoftware I – Lars Bernard
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
Geosoftware I – Lars Bernard
Vorschlag für ein Klassendiagramm
TestGUI
+main:void
BoundingBox
pLL:PointpUR:Point
BoundingBoxBoundingBox+height:double+width:double+equals:boolean+upperRight:Point+lowerLeft:Point+exist:boolean+dimension:int
Point
#x_:double#y_:double
Point+equals:booleangetX:doublegetY:double+boundingBox:BoundingBox
Polyline
points:PointList
PolylinePolyline+add:void+removeLast:void+length:double+boundingBox:BoundingBox+iterator:Iterator
interfaceGeometry
+boundingBox:BoundingBox
Polygon
points:PointList
Polygon+add:void+removeLast:void+perimeter:double+boundingBox:BoundingBox+iterator:Iterator
PointList
points:List
PointList+add:void+removeLast:void+first:Point+last:Point+clear:void+boundingBox:BoundingBox+iterator:Iterator
JPanelGISViewer
model:ModelpreferredSize:Dimensionaf:AffineTransformboundingBox:BoundingBoxmode:inthasChanged:boolean
GISViewerGISViewerupdateTransformation:voidupdateBoundingBox:void+getMode:int+setMode:voidhasChanged:boolean+getPreferredSize:Dimension+paintComponent:void
GISMouseListener GeneratePointFileReader
+read:PointList
PolygonList
polygons:List
PolygonList+add:void+removeLast:void+first:Polygon+last:Polygon+clear:void+boundingBox:BoundingBox+iterator:Iterator
PolylineList
polylines:List
PolylineList+add:void+removeLast:void+first:Polyline+last:Polyline+clear:void+boundingBox:BoundingBox+iterator:Iterator
GeneratePolylineFileReader
+read:PolylineList
Model
pointLayer:PointListpolylineLayer:PolylineListpolygonLayer: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
GeneratePointFileWriter
write:void
JFrameGISFrame
viewer:GISViewermodel:Model
GISFrame
EditMenueListener FileMenueListener ViewMenueListener GISWindowListener
JFrameGISFrame
viewer:GISViewermodel:Model
GISFrame
EditMenueListener FileMenueListener ViewMenueListener GISWindowListener
GeneratePolylineFileWriter
write:void