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