Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Thomas H. Kolbe Einführung in die Programmierung mit Java 12. Vorlesung WS 2001/2002 Übersicht • Besprechung der Übungsaufgabe • Ein- und Ausgabe in Java – Datenströme – Quellen, Senken und Filter – Zeichen und Rohdaten – Java-Klassen für Ein- und Ausgabe T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 2 Übungsaufgabe vom 23. 1. • Schreiben Sie ein Programm, das ein Integer-Array mit 500 Elementen erzeugt. • Füllen Sie das Array mit Zufallszahlen, die im Bereich von 0 bis 99 liegen sollen. • Anschliessend soll eine Schleife 10000 mal 1. Eine Integer-Zufallszahl von 0 bis 510 erzeugen, 2. welche als Index in das Array verwendet wird und den an der entsprechenden Stelle befindlichen Wert x=a[zufallsindex] ausliest. 3. Dieser Wert x soll als Divisor für eine beliebige Division verwendet werden, z.B.: b = 10 / x • Welche Fehler treten bei der Programmausführung auf? • Ergänzen Sie das Programm um eine differenzierte Fehlerbehandlung, so dass es nicht mehr abbricht. T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 3 Lösung • Welche Fehler treten bei der Programmausführung auf? • ArrayIndexOutOfBoundsException weil die Zufallsvariable, die auf das Array-Element verweist, auch die Werte 500 bis 510 annehmen kann. Die Array-Grenze reicht aber nur bis 499. • ArithmeticException: / by zero weil der aus dem Array gelesene Divisor auch den Wert 0 besitzen kann. • Ergänzen Sie das Programm um eine differenzierte Fehlerbehandlung, so dass es nicht mehr abbricht. • Lösung: die zweite Schleife in einen try-catch-Block einschließen mit zwei catch-Anweisungen für die beiden Exception-Klassen T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 4 Ein- und Ausgabe in Java • Alle Ein- und Ausgabefunktionen von Java sind Datenstrom-basiert (Stream-basiert). Die beteiligten Komponenten sind: – Quelle (oder auch Produzent) Beispiele: Datei, Internet-Verbindung, Prozess, Tastatur, Sensoren,... – Senke (oder auch Ziel, Konsument) Beispiele: Datei, Internet-Verbindung, Drucker, Bildschirm, Prozess,... • Bei Quellen und Senken wird zwischen externen und internen Datenströmen unterschieden. – extern: Daten verlassen bzw. kommen von außen in die Java-Umgebung – intern: Daten fließen zwischen Prozessen und/oder Methoden T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 5 Ein- und Ausgabedatenströme • Aus der Sicht eines Prozesses bzw. Programmabschnitts (z.B. einer Methode) sind Datenströme entweder – Eingabedatenströme oder – Ausgabedatenströme • Der Ausgabestrom eines Prozesses bzw. einer Methode kann der Eingabestrom für einen anderen Prozess sein – Die Verbindung zwischen den beiden Prozessen / Methoden wird dabei auch als Kanal bezeichnet • Mehrere Verbindungen möglich: – mehrere Prozesse können ihre Ausgabedatenströme in denselben Eingabestrom eines anderen Prozesses einspeisen – Mehrere Prozesse können sich mit ihrem Eingabestrom an denselben Ausgabestrom eines anderen Prozesses anhängen T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 6 Filter, Eigenschaften von Datenströmen • Es gibt spezielle Ein-/Ausgabekomponenten, die genau einen Ein- und Ausgabekanal besitzen; diese werden auch als Filter bezeichnet – Aufgaben: Filterung, Transformation, Konvertierung der durchgereichten Daten – Beispiele: Verschlüsselung, (De-)Kompression, Zeichensatzanpassung • Datenströme können – endlich (z.B. eine Datei, Email oder WWW-Seite) oder – unendlich (z.B. Mausbewegungen, Sensormessungen) sein. T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 7 Unterscheidung von Rohdaten und Text • Bei der Art der ein- und auszugebenden Daten wird kategorisch unterschieden zwischen – Rohdaten (Bytes) – Zeichen (Text) • Hintergrund: 1. Früher reichte ein Byte um ein Zeichen zu speichern (das amerikanische Standardzeichenformat ASCII benötigte sogar nur 7 Bit) Zur Unterstützung der Mehrsprachigkeit wurde ein neuer Standard geschaffen, der sog. Uni-Code mit 16 Bit pro Zeichen Java unterstützt sowohl die bisherigen Codierungen als auch Uni-Code. 2. Einige Ein- und Ausgabefunktionen sind für verschiedene Betriebssysteme unterschiedlich. Beispiel: Der Zeilenumbruch wird unter Windows anders realisiert als unter Linux oder MacOS T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 8 Java-Basisklassen für Ein- und Ausgabe InputStream : stellt Methoden zum Einlesen/ Öffnen von ByteStreams (Rohdaten) zur Verfügung OutputStream : stellt Methoden zum Öffnen/ Ausgabe von ByteStreams (Rohdaten) zur Verfügung Reader : stellt Methoden analog zum InputStream für Textdateien zur Verfügung Writer : analog zum OutputStream allerdings für Text alle 4 Klassen sind abstrakte Klassen T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 9 Klassen zum Einlesen von Rohdaten (Bytes) Datei (Lesen) aus Strings lesen Einlesen von Java Datentypen Die gleiche Klassenhierarchie existiert auch für OutputStreams zur Interprozesskommunikation gepufferte Eingabe Lesen komprimierter Daten T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 10 Klassen zur Ausgabe von Text Basisklasse für Konstruktion von Ausgabefiltern Textausgabe via Outputstreams gepufferte Ausgabe Textuelle Ausgabe der Java-Basistypen Die gleiche Klassenhierarchie existiert auch für Reader Textausgabe in Datei T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 11 Schnittstelle zwischen Text und Rohdaten • Jeder Text wird letztlich auf eine Folge von Bytes abgebildet, wenn er übertragen oder in eine Datei geschrieben werden soll. – gleiches gilt für externe Datenquellen • Konvertierung von Text- in Rohdaten notwendig (und umgekehrt) • Klasse InputStreamReader: Abstrakte Basisklasse für alle Reader, die einen Byte-Strom in einen Zeichenstrom umwandeln. – Unterklasse: z.B. FileReader zum Einlesen von Text aus Dateien • Klasse OutputStreamWriter: Abstrakte Basisklasse für alle Writer, die einen Zeichenstrom in einen Byte-Strom umwandeln. – Unterklasse z.B. FileWriter für Textausgaben in eine Datei T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 12 Arbeiten mit Datenströmen 1. Datenstrom öffnen – z.B. durch Erzeugen eines FileWriter- oder FileReader-Objekts, wobei der Dateiname dem Konstruktor übergeben wird Beispiel: FileWriter datei = new FileWriter(“C:\\Temp\\test.txt“); 2. Daten schreiben bzw. lesen Um in einem – die konkreten Methoden hängen von der verwendeten String einen Ein-/ Ausgabeklasse ab (siehe Java-Dokumentation) Backslash \ einzugeben, Beispiel: datei.write(“Hallo Welt!“); müssen zwei \\ hintereinander 3. Datenstrom schließen angeben werden. – Spätestens am Ende des Programms muss der Datenstrom geschlossen werden Beispiel: datei.close(); T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 13 Ausnahmebehandlung bei Ein-/Ausgaben • Bei fast allen Ein- und Ausgabeoperationen können Fehler auftreten. – z.B.: Datei voll, Datei nicht vorhanden, keine Zugriffsberechtigung,... • Zur Fehleranzeige lösen die Ein- und Ausgabemethoden von Java entsprechende Exceptions aus – Die Ein- und Ausgabemethoden sind so definiert, dass ein Aufrufer sich um das Auftreten möglicher Exceptions explizit kümmern muss – Aufrufe von Ein- und Ausgabemethoden müssen deshalb in einen trycatch-Block eingebettet werden – Eingabe-/Ausgabe-Exceptions sind Unterklassen von der Klasse IOException T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 14 Standardein- und ausgabeströme (I) • Grundsätzlich besitzt jedes Java-Programm drei vordefinierte Ein- und Ausgabedatenströme: – Standardeingabe – Standardausgabe – Standardfehlerausgabe • Diese Ströme werden von der Laufzeitumgebung des JavaProgramms beim Programmstart eingerichtet und geöffnet. – Für die Standardeingabe wird ein Objekt der Klasse InputStream erzeugt und der Klassenvariable System.in der Klasse System zugewiesen – Für die Standardausgabe und die Standardfehlerausgabe werden je ein Objekt der Klasse PrintStream erzeugt und den Klassenvariablen System.out bzw. System.err der Klasse System zugewiesen T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 15 Standardein- und ausgabeströme (II) • In der Entwicklungsumgebung Forté wird – der Standardausgabe- sowie der Standardfehlerausgabestrom auf das Ausgabefenster gelenkt – der Standardeingabestrom durch das Eingabefeld „Program Input:“ am unteren Rand des Ausgabefensters bedient • Eigenständig laufende Java-Programme (außerhalb einer Entwicklungsumgebung) lenken die Standardströme oftmals in das Fenster (z.B. MSDOS-Eingabeaufforderung oder Linux Shell-Fenster), in dem das Programm gestartet wurde • Per Voreinstellung sind die Standardein- und Ausgabedatenströme also unendlich, sie können aber auch auf einen Dateilese- oder –schreibdatenstrom umgelenkt werden. T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 16 Übungsaufgabe Mini-Taschenrechner • Schreiben Sie ein Programm, das eine Zeile von der Standardeingabe einliest (String) • Diese Zeile soll eine Grundrechenoperation auf ganzen Zahlen ausdrücken. Beispiel für erlaubte Eingaben: • • • • 4+7 23/9 2*8 3-1234 • Das Programm soll den Ausdruck auswerten und das Ergebnis ausgeben T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 17