220 likes | 338 Views
Sitzung 11: IO – Streams in Java. Überblick. Lesen und Speichern in Dateien: Filestreams und Tokenizer Kurzeinführung in Exceptions und das Exception-Handling in Java. Streams. Daten werden sequentiell aus einem Daten- Strom gelesen, bzw. in einen Daten- Strom geschrieben
E N D
Sitzung 11: IO – Streams in Java Sitzung 11
Überblick • Lesen und Speichern in Dateien:Filestreams und Tokenizer • Kurzeinführung in Exceptionsund das Exception-Handling in Java I/O – Streams in Java
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, Konsole, Objekte, …) und Datenformate (Binär, Text, …) verbunden sein – zeigt aber immer dasselbe Verhalten I/O – Streams in Java
Reading open a stream while more information read information close the stream Writing open a stream while more information write information close the stream Lesen und Schreiben in Streams • Das Prinzip ist immer gleich: I/O – Streams in Java
2 Arten von Streams in Java Character-StreamsByte-Streams Mehr Infos im Sun-Tutorial unter:Essential Java Classes Lesson: I/O: Reading and Writing (but no 'rithmetic) 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(); } } 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/ 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(); } } 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); } }… 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; } } 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); } } … 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 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(); } 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 auftrittund 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 I/O – Streams in Java
Exceptions in Java – try & catch • Der try catch Block: try { // code, der Fehler auslösen könnte } catch ( . . . ) { . . .} catch ( . . . ) { . . .} . . . 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()); } 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); } I/O – Streams in Java
Exceptions in Java – throw • Eine Methode wirft eine Exception weiter: • Eine Methode erzeugt und wirft eine Exception: void write(String fileName, List pointList) throws IOException { BufferedReader in = new BufferedReader(new FileReader(name)); int b = in.read(); ... } public Object pop() throws EmptyStackException { Object obj; if (size == 0) throw new EmptyStackException(); // EmptyStackException is a self created class // that is derived from Exception ... } 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 ! 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 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 I/O – Streams in Java
Vorschlag für ein Klassendiagramm I/O – Streams in Java