22
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard

Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard

Embed Size (px)

Citation preview

Page 1: Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard

Praktikum Entwicklung und Einsatz

von Geosoftware I-

Sitzung 9IO – Streams in Java

Sommersemester 2003

Lars Bernard

Page 2: Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – 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

Page 3: Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard

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

Page 4: Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard

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:

Page 5: Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard

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)

Page 6: Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard

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();

}

}

Page 7: Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard

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/

Page 8: Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard

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();

}

}

Page 9: Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard

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);

}

}…

Page 10: Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard

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;

}

}

Page 11: Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard

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);

}

Page 12: Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard

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

Page 13: Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard

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();

}

Page 14: Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard

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

Page 15: Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard

Geosoftware I – Lars Bernard

Exceptions in Java – try & catch

• Der try catch Block:

try { . . . } catch ( . . . ) { . . . } catch ( . . . ) { . . . } . . .

Page 16: Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard

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());

}

Page 17: Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard

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);

}

Page 18: Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard

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

Page 19: Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard

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 !

Page 20: Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard

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

Page 21: Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard

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

Page 22: Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard

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