Kein Folientitel - Institut für Geodäsie und Geoinformation der

Werbung
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
Herunterladen