Java für Fortgeschrittene

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

der Universität Oldenburg
Imperative Programmierung
der Universität Oldenburg
DVG Dateien Dateien. DVG Dateien 2 Die Klasse File Die Klasse File stellt die Verbindung zwischen dem Filesystem des Rechners und dem.
Zusammenfassung der Vorwoche
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
Kapselung , toString , equals , Java API
1 Spezielle Packages des Java SDK (1.4) java.nio.
(kleine!) Java Einführung Mittwoch, Heute Ziel: erstes Java-Programm erstellen Von der Aufgabenstellung bis zur Lösung Grundlagen Einfache.
der Universität Oldenburg
Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik F Verteilte Software - Java.
10 Streams JavaHS Merseburg WS 05/06 E/A - Ströme (Streams) in Java.
3 Sprachelemente und Anweisungen JavaHS Merseburg (FH) WS 06/07 Strings (Zeichenketten)
Ausnahmen HS Merseburg (FH) WS 06/07.
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Sortierverfahren Richard Göbel.
FH-Hof Servlets Richard Göbel. FH-Hof Konzept Servlets werden auf der Server-Seite durch ein Formular aufgerufen werten die Eingaben aus einem Formular.
Indirekte Adressierung
FH-Hof Sockets in Java Richard Göbel. FH-Hof Kommunikation über das Internet - Grundlagen Ein Rechner wird im Internet über die so genannte IP- Adresse.
FH-Hof Indirekte Adressierung Richard Göbel. FH-Hof Einfache Speicherung von Daten Eine "einfache" Deklaration definiert direkt eine Speicherplatz für.
FH-Hof Verwaltung von Zeichenketten Richard Göbel.
Java: Grundlagen der Sprache
Java: Referenzen und Zeichenketten
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Konstruktoren.
Polymorphie (Vielgestaltigkeit)
Objekte und Arbeitsspeicher
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 3 Klassen, Objekte, Arrays und Kontrollstrukturen Sommersemester 2003 Lars Bernard.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
Zusammenfassung Vorwoche
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
Vorlesung 3: Verschiedenes Universität Bielefeld – Technische Fakultät AG Rechnernetze und verteilte Systeme Peter B. Ladkin
Packages Vortrag : Cornelia Hardt 23. November 1999.
DVG Kommentare1 Kommentare. DVG Kommentare 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht.
DVG Klassen und Objekte
DVG Kommentare 1 Kommentare. 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht bis zum Ende der Zeile.
Datenströme DVG Datenströme.
Einführung in die Programmierung Datensammlung
© 2005 Pohlig - Taulien Datenströme GK Informatik 1 Datenströme.
1 Vorlesung 3 Verschiedenes Peter B. Ladkin
FH-Hof 1 XML-Parser Richard Göbel. FH-Hof 2 XML-Parser- DOM Object Tree Parser Objekt der Klasse 'DocumentBuilderFactory' mit 'newInstance()' erzeugen.
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Learning By Doing TCP/IP Netzwerke mit TCP/IP Das Internet verwendet weitgehend das rund 30-jährige TCP/IP-Protokoll (TCP: Transmission Control Protocol,
TWS/Graph HORIZONT Produkt-Präsentation Software für Rechenzentren
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Copyright 2007 Bernd Brügge, Christian Herzog Grundlagen der Programmierung TUM Wintersemester 2007/08 Kapitel 10, Folie 1 2 Dr. Christian Herzog Technische.
Grundlagen der Informatik 1 Thema 20: Ströme und Ein-/Ausgabe in Java
Netzwerkprogrammierung
Java für Fortgeschrittene
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Prof. Bernd Brügge, Ph.D Institut für Informatik Technische Universität.
HORIZONT 1 XINFO ® Das IT - Informationssystem PL/1 Scanner HORIZONT Software für Rechenzentren Garmischer Str. 8 D München Tel ++49(0)89 / 540.
CuP - Java Eingabe über Tastatur, AudioClips, überschreiben, Quiz Montag, 18. November 2002.
CuP - Java Achte Vorlesung Entspricht ungefähr Kapitel 4.1 des Skriptums Montag, 28. Oktober 2002.
3. Beschreibung von Abläufen durch Algorithmen 3.4 Zufall
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold.
Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  Verwendung von.
Ausnahmen Vorlesung besteht aus zwei Teilen Programmierung (4 SWS)
Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei.
Ein- und Ausgabe in Java Packet: java.io
Ein-/ Ausgabe in Java ein Überblick. © eigentlich ganz einfach ? Ein-/Ausgabe durch package java.io Ausgabe (auf Konsole) mit System.out.println()
, Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Ein- und Ausgabe in der Programmiersprache Java.
Java I/O Input / Output stream Library
Java I/O Input / Output stream Library
 Präsentation transkript:

Java für Fortgeschrittene Kurseinheit 04 Java Input/Output Thomas Klutsch Florian Köttner Dienstag, 26. Juli 2011 WS 2011/2012 1 1

Aufbau der Einheit: Einführung in Input/Output und Terminologie Genauere Betrachtung des java.io Packages Objekte in Unicode-Darstellung speichern und lesen Objekte in Binärdarstellung speichern und lesen Random Access und Object Serialization Java Input/Output

Terminologie eines Streams: 1. Einführung Terminologie eines Streams: Ein Stream ist eine Quelle aus der bytes gelesen werden. Ein Stream ist ein Ziel, in das bytes geschrieben werden. Ein Stream kann eine Datei, Netzwerkverbindung oder Memory Block sein. Es wird zwischen Input und Output Stream unterschieden. Es gibt Byte-orientierte und Unicode-orientierte Streams. Definition von Input- und Output Streams Input-Stream: ist ein Objekt, aus dem bytes gelesen werden. Output-Stream: ist ein Objekt, in das bytes geschrieben werden. aus einer Datei: InputStream Objekt. in eine Datei schreiben: OutputStream Objekt. Java Input/Output

Byte-orientierte Streams 1. Einführung Byte-orientierte Streams Schreiben/Lesen ein Byte, eine Folge von Bytes. Java Wurzel-Hierarchie: OutputStream, InputStream. DataOutputStream/DataInputStream schreiben/lesen binäre Daten. Unicode(Zeichen)-orientierte Streams Schreiben/Lesen als Unicode-Text Ein Unicode-Zeichen braucht für die Kodierung mehrere bytes. Java Wurzel-Hierarchie: Reader, Writer. PrintWriter/Scanner schreiben/lesen Unicode Texte/Zahlen. BufferedWriter/BufferedReader lesen/schreiben Unicode Texte. Reader/Writer lesen/schreiben basierend auf 2-byte Unicode code unit. Java Input/Output

Exkurs Unicode Zeichen: 1. Einführung Exkurs Unicode Zeichen: Verschiedene Sprachen haben unterschiedliche Standards ASCII für USA ISO 8859-1 für Europa KOI-8 für Russland BIG-5 für China Es entstehen Kodierungsprobleme die Standards benutzen unterschiedliche Kodierungslänge. Kodierung: 1,2 oder mehrere Bytes für ein Zeichen. Ein Wert könnte bei 2 Standards unterschiedliche Symbole darstellen. Lösung der Kodierungsprobleme einheitliche Kodierung: Unicode Zeichen. Java Input/Output

Unicode vs. UTF-16: Unicode Zeichen UTF-16 Kodierung 1. Einführung benutzt zur Kodierung 2 bytes pro Zeichen. kann 65,536 Zeichen darstellen darstellbar als hexadezimal Wert von \u0000 bis \uFFFF. Zum Beispiel ist \u2122 das griechische Buchstabe (pi). mit ostasiatischen Sonderzeichen gibt es mehr als 65,536 Zeichen. Lösung: UTF-16 Kodierung. UTF-16 Kodierung stellt alle Unicode-Werte(code points) durch variable Kodierungslänge. char in Java beschreibt ein „code unit“ in die UTF-16 Kodierung. Java Input/Output

Vergleich von Zeichen und Byteformat: 1. Einführung Vergleich von Zeichen und Byteformat: Speichern von int 1234 in binary Format In hexadecimal notation: 00 00 04 D2 Speichern von int 1234 im Character Format UTF-Encoding: 00 31 00 32 00 33 00 34 (in hex) ISO 8859-1 Encoding: 31 32 33 34 UTF, ISO werden "Character Sets„ genannt. Einlesen von Unicode-Textdateien ist vereinfacht und Daten müssen nicht auf festgelegten Zeichensätzen arbeiten => wir bekommen vom Konvertieren von Unicode nach Byte überhaupt nichts mit Zeichenformat vs. Binary Format Binary Format: schneller, effizienter, für Menschen schwer lesbar. Text Format: langsamer, weniger effizient, für Menschen leicht lesbar. Java Input/Output

1. Einführung Java Input/Output

1. Einführung Java Input/Output

Stream-Klassen am Beispiel von Dateien: 1. Einführung Stream-Klassen am Beispiel von Dateien: Vorgang Bytes Zeichen Aus Dateien lesen FileInputStream FileReader In Dateien schreiben FileOutputStream FileWriter byteorientiertes Auslesen zeichenorientiertes Auslesen Java Input/Output

byteorientiertes Schreiben 1. Einführung byteorientiertes Schreiben zeichenorientiertes Schreiben Java Input/Output

Regeln für byte-orientierte Input/OutputStream 1. Einführung Regeln für byte-orientierte Input/OutputStream Das Blockierungsprinzip von int read() und void write() int read(): wartet solange bis bytes zum Lesen bereit sind. void write(): wartet solange bis bytes zum Schreiben bereit sind. während des Wartens(Blockieren) können andere Threads weiter arbeiten. Blockierung umgehen/vermeiden Die available() Abfrage vor dem Lesen kann die Blockierung vermeiden. Betriebssystem-Ressourcen wieder freisetzen: close() close() muss am Ende vom Lesen/Schreiben aufgerufen. close() leert den für das Output-Stream benutzten Buffer. offene Streams ohne close() belasten die Leistung des Rechners sehr. Java Input/Output

Fehlerbehandlung hilft hierbei deutlich! 1. Einführung Aufgabe 1: Erstellen sie eine Klasse FileCopy, welche byteorientiert Dateien kopiert und unter einem anderen Namen zwischenspeichert. Dateiursprungsort und Dateizielort sollen hierbei beliebig gewählt werden können byteorientierte Lösung, d.h. geeignete Kombination aus FileInputStream und FileOutputStream nötig. Fehlerbehandlung hilft hierbei deutlich! Java Input/Output

2. Genauere Betrachtung des java.io Packages Das java.io.* Package: Eingabeklassen Java Input/Output

2. Genauere Betrachtung des java.io Packages Ausgabeklassen IO-Interfaces Java Input/Output

2. Genauere Betrachtung des java.io Packages java.io.Closable Interface: Methode void close() Closabe ist eine Datenquelle/Datenziel das geschlossen werden kann. wird von InputStream/OutputStream, Reader/Writer implementiert. void close() throws IOException (falls ein I/O error auftritt) close() schließt das Stream und gibt die beteiligen Ressourcen wieder frei. java.io.Flushable Interface: Methode void flush() Flushable ist ein Datenziel das geleert werden kann. wird von OutputStream und Writer implementiert. void flush() throws IOException (falls ein I/O error passiert) flush() leert das Stream und schreibt die gepufferte Daten in das Ziel. Java Input/Output

2. Genauere Betrachtung des java.io Packages java.lang.Readable Interface: Methode int read(CharBuffer cb) Readable ist eine Zeichenquelle (source of characters). CharBuffer stellt die Readable Characters für read() Aufrufer bereit. Readable wird vom Reader implementiert. int read(CharBuffer cb) throws IOException (falls ein I/O error passiert) read liest characters und speichert sie in dem spezifizierten buffer cb. java.lang.Appendable Interface: Methode 3 append Methoden ein Objekt an dem char/Sequence angehängt werden können. wird von Writer/StringBuffer und CharBuffer implementiert. Appendable append(char c) throws IOException Appendable append(CharSequence csq) throws IOException Appendable append(CharSequence csq, int start, int end) append Methoden hängen ein char/CharSequence oder SubSequence an. Java Input/Output

3. Objekte in Unicode-Darstellung speichern und lesen FileWriter zum erzeugen der Datei (OutputStream) benutzen. BufferedWriter zum Schreiben des Objektzustandes benutzen. BufferedWriter mit FileWriter miteinander kombinieren. Java Input/Output

3. Objekte in Unicode-Darstellung speichern und lesen Die BufferedWriter Klasse muss mit einem Output-Source kombiniert werden. ermöglicht das Schreiben von Daten in Unicode-Format. kann keine Zahlen wie z.B. long, float, double schreiben. Zahlen müssen vorher in String konvertiert werden. Puffert Zeichen, um sie effizienter zu schreiben. Standard Puffer Größe ist für die meisten Aufgabe ausreichend. BufferedWriter write Methoden schreiben Array von Zeichen und können IOExceptions werfen. BufferedReader als Pendant für Input Source Java Input/Output

3. Objekte in Unicode-Darstellung speichern und lesen Objektrekonstruktion aus Datei: Java Input/Output

3. Objekte in Unicode-Darstellung speichern und lesen Prinzip: Streams als Filter verketten (verschalen): I/O benutzt die Technik des Decorator-Design-Pattern. Manche Streams können die Bytes nur extrahieren, andere nur verarbeiten. FileInputStream kann z.B. Bytes holen aber keine Nummer lesen. DataInputStream kann z.B Zahlen lesen aber nicht Daten aus Datei lesen. Dekorator-Pattern: kombiniere DataInputStream mit FileInputStream HighLevelStream h = new HighLevelStream(LowLevelStream); Java Input/Output

3. Objekte in Unicode-Darstellung speichern und lesen Low-Level Streams: zum gewinnen von Bytes liefern Disk-Datei gebundenes Input und OutputStream. lesen/schreiben nur bytes (byte-level Operationen) Beispiel für Byte-orientiert: FileOutputStream/FileInputStream Beispiel für Unicode-orientiert: FileWriter/FileReader. High-Level Streams: zum verarbeiten von Bytes haben keine Methoden um Bytes zu gewinnen, sondern zum Verarbeiten. Beispiel für Byte-orientiert: DataInputStream/DataOutputStream Beispiel für Unicode-orientiert: BufferedWriter/BufferedReader. Java Input/Output

3. Objekte in Unicode-Darstellung speichern und lesen Spezielle Klassen: java.util.PrintWriter ermöglicht das Schreiben von Strings und Zahlen in Text-Format. ihre Methoden: print, println, printf schreiben ein output in Text-Format. PrintWriter Methoden werfen keine Exception, deshalb checkError() aufrufen. boolean checkError() : Überprüfen ob etwas beim Schreiben nicht stimmte. Java Input/Output

3. Objekte in Unicode-Darstellung speichern und lesen Spezielle Klassen: java.util.Scanner ermöglicht das Lesen von Strings und Zahlen im Text-Format. nextLine() liefert null, wenn kein input mehr vorhanden ist. nextInt(), nextLong(), nextDouble() zum lesen von Zahlen in Textformat. Lesen aus der Console scanner in = new Scanner(System.in); Scanner Methoden werfen keine IOExceptions (aber passende java.util Exceptions).

3. Objekte in Unicode-Darstellung speichern und lesen Aufgabe 2: Programmieren Sie die Klasse Student. Dieser hat einen Namen, studyId, und department. Student hat Konstruktoren und Setter/Getter Methoden. Speichern Sie ein Objekt/Array von Objekten in Text-Format writeData(BufferedWriter out): speichert ein Objekt im Text-Format. writeData(BufferedWriter out, Student[] s): speichert ein Array im Text-Format readData(BufferedReader in): liest ein Objekt im Text-Format aus einer Datei. readData(BufferedReader in, boolean all): liest ein Array im Text-Format. Java Input/Output

4. Objekte in Binärdarstellung speichern und lesen Interfaces zum Schreiben/Lesen in binärem Format DataOutput Interface definiert Methoden zum Schreiben in binärem Format DataInput Interface definiert Methoden zum Lesen in binärem Format Implementation von DataOuput und DataInput Interfaces DataOutputStream Klasse implementiert das DataOutput Interface DataInputStream Klasse implementiert das DataInput Interface Java Input/Output

4. Objekte in Binärdarstellung speichern und lesen Besonderheiten zum Schreiben/Lesen im Binärformat: Anzahl geschriebener Bytes writeInt(int i) schreibt immer 4 bytes. writeDouble(double d) schreibt immer 8 bytes. Ergebnis ist für Menschen nicht lesbar. Die writeUTF Methode schreibt String-Daten mit modifizierten 8-bit Unicode Version. Strings werden zuerst in UTF-16 kodiert dann in UTF8 konvertiert. die modifizierte UTF8 Version ist ab 0xFFFF anders als Standard UTF8. modifizierte UTF8 ist zu alten VM ohne UTF-16 abwärts Kompatibel. Programme, die bytecodes generieren sollten writeChars benutzen. Java Input/Output

4. Objekte in Binärdarstellung speichern und lesen Big-Endian und Little-Endian Speicher-Methoden Big-Endian: speichert zuerst das Byte mit der höchster Signifikant. Little-Endian: speichert zuerst das Byte mit der niedrigsten Signifikant. Big-Endiag für int 1234: 00 00 04 D2 (1234=4*256+13*16+2 =04D2) Little-Endian für int 1234: D2 04 00 00 (1234=4*256+13*16+2 =04D2) Java benutzt Big-Endian, C++ Little Endian. Gleiche Prinzipien wie Unicode-Darstellung: Streams als Filter verketten und Puffern! Java Input/Output

4. Objekte in Binärdarstellung speichern und lesen Aufgabe 3: Programmieren Sie die Klasse Student. Diese hat einen Name, studyId, und department. Student hat Konstruktoren und Setter/Getter Methoden. Speichern Sie ein Objekt/Array von Objekten in Text-Format writeData(PrintWriter out): speichert ein Objekt in Text-Format. writeData(PrintWriter, Student[] s): speichert ein Array in Text-Format readData(Scanner in): liest ein Objekt in Text-Format. readData(Scanner in, boolean all): liest ein Array in Text-Format. Speichern Sie ein Objekt/Array von Objekten in binärem Format writeData(DataOutputStream out): speichert ein Objekt in binärem-Format. writeData(DataOutputStream out, Student[] s): speichert ein Array(Binär) readData(DataInputStream in): liest ein Objekt in binärem-Format. readData(DataInputStream in, boolean all): liest ein Array(Binär) Java Input/Output

4. Random Access und Object Serialization Random Access Prinzip Random Access = Lesen/Schreiben aus einer/in eine beliebiger Position. Random Access ermöglicht einen schnellen Zugriff auf die Einträge. Für Random Access bietet Java die Klasse RandomAccessFile an. Die RandomAccessFile Klasse realisiert das RandomAccess Verhalten. implementiert DataOuput und DataInput Interfaces. verfügt daher über die write und read Methoden. Java Input/Output

4. Random Access und Object Serialization RandomAccessFile hat einen File Pointer File Pointer zeigt auf die Position “des nächsten Bytes” im Stream. “Das nächste Byte” wird dann gelesen bzw. geschrieben. seek(long pos) setzt die File Pointer auf beliebige Position “pos” long getFilePointer() liefert die aktuelle Position. long length() liefert die Länge der Datei in Bytes. Speicherungs-Problem: unterschiedliche Bytelänge bei jedem Eintrag Integer und Fließkommazahlen haben feste Bytelänge. Strings haben natürlich unterschiedliche Länge. Ergebnis: Einträge haben unterschiedliche Byte-Anzahl. seek(long pos) springt zu einem Byte nicht zum Anfang eines Eintrages. Problem: sehr schwer, den gesuchten Eintrag schnell zu finden! Beispiel: “Lara:20:Informatik” und “Marina:20:informatik” Java Input/Output

4. Objekte in Binärdarstellung speichern und lesen Lösung: Strings in fester Länge speichern z.B. Länge n. hat ein String s die Länge l<n dann werden(n-l) Sonderzeichen an s angefügt Ergebnis: Alle Einträge haben gleiche Länge. seek((x-1) * Eintraglänge) springt zum Anfang von Eintrag x. Lesen/Überschreiben von Eintrag x ist jetzt sehr einfach. navigiere zum Eintrag X durch seek((x-1)* Eintraglänge); lese bzw. (über)schreibe dann den Eintrag X. Java Input/Output

4. Random Access und Object Serialization Motivation und Vorüberlegung RandomAccessFile funktioniert sehr gut bei Objekten gleicher Länge. Objekte der Unterklassen haben aber unterschiedliche Längen. Speichern von Objekten aller Unterklassen in fester Länge sehr aufwendig! Lösung: Mechanismus zum Speichern und Lesen von Objekten Object Serialization ist ein allgemeines Mechanismus zum Schreiben/Lesen von Objekten. Object Serialization: schreibt jedes Objekt in ein Stream und liest es. Java bietet dafür die Klassen ObjectOutputStream und ObjectInputStream Jedes geschriebene Objekt bekommt ein Serial Number. Hauptanwendung: Objekte über das Netzwerk hin und herübertragen. Objekte werden serialisiert, über das Netzwerk versendet und deserialisiert Java Input/Output

4. Random Access und Object Serialization Beispiel: Student-Objekt Serialisierung Deserialisierung Java Input/Output