Algorithmen und Datenstrukturen II

Ähnliche Dokumente
Programmieren I. Kapitel 15. Ein und Ausgabe

Java I/O. Input / Output stream Library Regelt I/O über verschiedene Kanäle. Führt notwendige Umwandlungen/Konvertierungen aus

Vorlesung Programmieren

Programmieren 2 Selbststudium Semesterwoche 6

Java Fehlerbehandlung

Programmieren I. Dateien: Allgemeines. Vorlesung 10. Handout S. 1. Martin Schultheiß. Hochschule Darmstadt Wintersemester 2010/2011

Referat: Netzwerkprogrammierung in Java

Java Input/Output System (IO)

Dr. Monika Meiler. Inhalt

Programmieren in Java

Vorlesung Programmieren. Java I/O: Input und Output mit Java. Ein-/Ausgabe von Daten. Java I/O. Heute. Grundlage fast aller Programme

AK-Automatisierungs und Kommunikationstechnik TI Technische Informatik. NWT Netzwerktechnik

Vorlesung 11. Sitzung Grundlegende Programmiertechniken

Software Entwicklung 1

Einführung zur Aufgabengruppe 2

3. Grundlegende Sprachkonstruktionen imperativer Programme

Programmieren 2 09 File-IO

Java I Vorlesung Exceptions

Dateien: Allgemeines Dateien lesen Beispiel: CSV-Daten Filter Ausgabe in Dateien. Programmieren I. Martin Schultheiß

Ein- und Ausgabe in Java

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Modellierung und Programmierung 1

Einstieg in die Informatik mit Java

Primitive Datentypen

Dateien: Allgemeines Dateien lesen Beispiel: CSV-Daten Filter Ausgabe in Dateien. Programmieren I. Dr. Klaus Höppner

Einführung in die Programmierung 1

Distributed Computing Group

II.3.1 Rekursive Algorithmen - 1 -

1 Polymorphie (Vielgestaltigkeit)

Vorlesung Programmieren

1.3 Welche Schritte werden bei der Programmerstellung benötigt? 1.5 Was sind Variablen im Kontext der Programmierung?

Java-Schulung Grundlagen

Tipps und Hinweise zum Bezug der Beitragssatzdatei V5.0

Programmieren in Java

Beispiel Time Client/Server

Einführung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 14: Sequentielle Ein-/Ausgabe, Streams, Dateiorganisation.

Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015

Einstieg in die Informatik mit Java

Einführung in die Informatik Files and Streams

Beispiel senden

Ein-/Ausgabe. Wo sind wir? Streams. Streams. Character- und Byte-Streams. Operationen auf Streams

Programmieren in Java

Musterlösungen zur Klausur Informatik 3

VS4 Slide 1. Verteilte Systeme. Vorlesung 4 vom Dr. Sebastian Iwanowski FH Wedel

Exceptions: Parameterprüfung import java.io.ioexception;

Javakurs für Anfänger

Verteilte Systeme CS5001

Computeranwendung und Programmierung (CuP)

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Java: Der Einstieg. Algorithmen und Datenstrukturen II 1

Einführung in die Informatik

Programmieren I + II Regeln der Code-Formatierung

5 Grundlagen der Java-Syntax

II.1.1. Erste Schritte - 1 -

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

1. Der Einstieg in Java. Was heißt Programmieren?

Einführung in Javadoc

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

Ein erstes Java-Programm

Programmieren in Java

Liste Programmieren Java Überblick

Algorithmen und Datenstrukturen

Dokumentenstrukturen

Programmiersprachen Einführung in C. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm

Elementare Konzepte von

7. Pakete Grundlagen der Programmierung 1 (Java)

6. Iteration (Schleifenanweisungen)

Grundlagen der Programmierung Prof. H. Mössenböck. 6. Methoden

Java I Vorlesung Objektorientiertes Programmieren

5.5.8 Öffentliche und private Eigenschaften

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

Einführung in die Programmierung

Algorithmen und Datenstrukturen Wintersemester 2004/ November T(n) = T(n a) + T(a) + n

Objektorientierte Programmierung

Algorithmen und Datenstrukturen II

Welche Informatik-Kenntnisse bringen Sie mit?

Ein- und Ausgabe mit Java

Bitte beachten Sie: Es gibt mehr als einen Lösungsweg. Ihre Lösung kann auch richtig sein, wenn sie nicht mit der hier gezeigten Lösung übereinstimmt.

Programmieren I und II

Algorithmen und Programmierung II

15 Ein-/Ausgabe Kommunikation. Dateien. Schreiben und Lesen von Dateien. Sockets. Übungsaufgaben

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Hello World. Javakurs 2014, 1. Vorlesung. Sebastian Schuck. basierend auf der Vorlage von Arne Kappen. wiki.freitagsrunde.org. 3.

Repetitorium Informatik (Java)

Beispiel: Methode mit einem Fehler. Diese Methode wird problematisch, wenn von außen eine Dauer von 0 Sekunden angegeben wird, etwa im Aufruf

Programmiermethodik. Übung 13

Java-Programmierung. Remote Method Invocation - RMI

Java Native Interface (JNI)

Javakurs zu Informatik I. Henning Heitkötter

SWE1 / Übung 2 ( )

Objects First With Java A Practical Introduction Using BlueJ. Mehr über Vererbung. Exploring polymorphism 1.0

Praktische Softwaretechnologie Vorlesung 3

Java - Programmierung - Objektorientierte Programmierung 1

Java Schulung. Objektorientierte Programmierung in Java Teil VI: Wichtige Java Pakete. Prof. Dr. Nikolaus Wulff

Propädeutikum zur Programmierung

Javakurs für Anfänger

Einstieg in die Informatik mit Java

1.2 Attribute und Methoden Aufbau einer Java-Klasse:

Angewandte IT-Sicherheit

Kapitel 6. Vererbung

Transkript:

Algorithmen und Datenstrukturen II AG Praktische Informatik Technische Fakultät Vorlesung Sommer 2009

Teil I Ein- und Ausgabe

In den bisherigen Programmbeispielen wurden die Benutzereingaben immer über die Kommandozeile und Ausgaben immer durch Aufruf der Methode System.out.println realisiert. Tatsächlich sind die Einund Ausgabemöglichkeiten von Java weit mächtiger. Dieses Kapitel behandelt die Grundlagen hiervon, Ströme und einige Beispiele für deren Verwendung.

Ströme Input und Output (kurz I/O) in Java basieren auf Strömen (engl. streams). Sie sind geordnete Folgen von Daten, die einen Ursprung (input stream) oder ein Ziel (output stream) haben.

Ströme Input und Output (kurz I/O) in Java basieren auf Strömen (engl. streams). Sie sind geordnete Folgen von Daten, die einen Ursprung (input stream) oder ein Ziel (output stream) haben. Vorteil: Der Programmierer wird von den spezifischen Details des zugrundeliegenden Betriebssystems befreit, indem Zugriffe auf Systemressourcen einheitlich mittels Strömen möglich sind.

Standard Eingabestrom System.in Java Programm Standard Ausgabestrom System.out Abbildung: Standardströme Standard Fehlerstrom System.err

Object InputStream OutputStream FileInputStream...... FileOutputStream FilterInputStream DataInputStream... BufferedInputStream FilterOutputStream 3 PrintStream DataOutputStream... BufferedOutputStream Abbildung: I/O-Klassenhierarchie

Die Klasse InputStream Alle InputStream erweiternden Klassen können Bytes aus verschiedenen Quellen einlesen. Das Einlesen kann byteweise oder in Blöcken von Bytes beliebiger Größe durchgeführt werden. Wir listen hier nur die Methoden von InputStream auf und gehen nicht detailliert auf deren Unterklassen ein.

public abstract int read() throws IOException; Es wird das nächste Byte aus dem Strom gelesen und (als Integerzahl im Bereich von 0 bis 255) zurückgegeben. Bei Erreichen des Stromendes wird 1 zurückgegeben.

public abstract int read() throws IOException; Es wird das nächste Byte aus dem Strom gelesen und (als Integerzahl im Bereich von 0 bis 255) zurückgegeben. Bei Erreichen des Stromendes wird 1 zurückgegeben. public int read(byte b[]) throws IOException; Es werden b.length Bytes aus dem Strom gelesen und in dem Feld b abgelegt. Der Rückgabewert ist die tatsächliche Anzahl der gelesenen Bytes oder bei Erreichen des Stromendes 1.

public abstract int read() throws IOException; Es wird das nächste Byte aus dem Strom gelesen und (als Integerzahl im Bereich von 0 bis 255) zurückgegeben. Bei Erreichen des Stromendes wird 1 zurückgegeben. public int read(byte b[]) throws IOException; Es werden b.length Bytes aus dem Strom gelesen und in dem Feld b abgelegt. Der Rückgabewert ist die tatsächliche Anzahl der gelesenen Bytes oder bei Erreichen des Stromendes 1. public int read(byte b[], int off, int len) throws IOException; Es werden len Bytes gelesen und ab der Position off im Feld b abgelegt. Die Anzahl der gelesenen Bytes wird wieder zurückgegeben.

public long skip(long n) throws IOException; Die nächsten n Bytes werden überlesen.

public long skip(long n) throws IOException; Die nächsten n Bytes werden überlesen. public int available() throws IOException; Es wird die Anzahl der Bytes zurückgegeben, die von dem Strom noch gelesen werden können.

public long skip(long n) throws IOException; Die nächsten n Bytes werden überlesen. public int available() throws IOException; Es wird die Anzahl der Bytes zurückgegeben, die von dem Strom noch gelesen werden können. public void close() throws IOException; Der Strom wird geschlossen und die benutzten Ressourcen sofort wieder freigegeben.

public boolean marksupported(); Es wird geprüft, ob der Strom die Methoden mark und reset unterstützt.

public boolean marksupported(); Es wird geprüft, ob der Strom die Methoden mark und reset unterstützt. public synchronized void mark(int readlimit); Die aktuelle Position im Strom wird markiert.

public boolean marksupported(); Es wird geprüft, ob der Strom die Methoden mark und reset unterstützt. public synchronized void mark(int readlimit); Die aktuelle Position im Strom wird markiert. public synchronized void reset() throws IOException; Es wird zu der Position zurückgesprungen, die mit mark markiert wurde.

Analog zu InputStream und seinen Unterklassen gibt es die Klasse OutputStream und deren Erweiterungen, die zum Schreiben von Zeichen benötigt werden.

File-Ströme Um Dateien einlesen zu können, reicht es, ein FileInputStream-Objekt anzulegen. Beispiel import java.io.*; class ReadDemo { public static void main(string[] args) throws FileNotFoundException, IOException { FileInputStream fileinputstream = new FileInputStream(args[0]); int ch, count=0; while((ch = fileinputstream.read())!= -1) { count++; } System.out.println("Die Datei enthält "+count+" Bytes."); } }

Ausgaben werden durch die Klasse FileOutputStream ermöglicht, z.b. Beispiel FileOutStream fos = new FileOuputStream("out.txt"); fos.write( a );

Gepufferte Ströme I Die Klassen BufferedInputStream und BufferedOutputStream unterstützen Objekte, die ihre Daten puffern. verhindern, dass jedes Lesen oder Schreiben sofort an den nächsten Strom weitergegeben wird werden oft in Verbindung mit File-Strömen verwendet, denn es ist relativ ineffizient, auf eine Datei zuzugreifen, die auf der Festplatte gespeichert ist Puffern hilft, diesen Aufwand erheblich zu reduzieren

Gepufferte Ströme II Ein BufferedInputStream oder BufferedOutputStream entspricht in seinen Methoden dem InputStream bzw. OutputStream. Die Konstruktoren nehmen einen entsprechenden Strom als Parameter. Bei einem Methodenaufruf werden die Daten gepuffert und bei einem vollen Puffer mit den entsprechenden Methoden des Stroms geschrieben bzw. gelesen. Manuell lässt sich ein Puffer auch immer mit der Methode public void flush() leeren.

Beispiel (Gepufferte Ströme) import java.io.*; import java.util.*; class WriteDemo { private static float time(outputstream os, long j) throws IOException { Date start = new Date(); for(int i=0; i<j; i++) { os.write(1); } os.close(); Date end = new Date(); return (float)(end.gettime()-start.gettime()); }

Beispiel (Gepufferte Ströme) public static void main(string[] args) throws IOException { FileOutputStream unbufstream; BufferedOutputStream bufstream; long iterate; iterate = Long.parseLong(args[0]); unbufstream = new FileOutputStream("f.unbuffered"); bufstream = new BufferedOutputStream( new FileOutputStream("f.buffered")); float t1 = time(unbufstream,iterate); System.out.println("Write file unbuffered: "+t1+" ms"); float t2 = time(bufstream,iterate); System.out.println("Write file buffered: "+t2+" ms"); } } System.out.println("Thus, the version with buffered streams is "+ (t1/t2)+" times faster.");

> java WriteDemo 10000 Write file unbuffered: 102.0 ms

> java WriteDemo 10000 Write file unbuffered: 102.0 ms Write file buffered: 4.0 ms Thus, the version with buffered streams is 25.5 times faster. > java WriteDemo 100000 Write file unbuffered: 964.0 ms Write file buffered: 14.0 ms Thus, the version with buffered streams is 68.85714 times faster.

Datenströme Byteströme allein bieten kein Format, in das alle Daten eingezwängt werden können vor allem die elementaren Datentypen von Java können in den bisher behandelten Strömen weder gelesen noch geschrieben werden Klassen DataInputStream und DataOutputStream definieren Methoden zum Lesen und Schreiben, die komplexe Datenströme unterstützen

Datenströme FileInputStream fis = new FileInputStream(args[0]); BufferedInputStream bis = new BufferedInputStream(fis); DataInputStream dis = new DataInputStream(bis);

Datenströme FileInputStream fis = new FileInputStream(args[0]); BufferedInputStream bis = new BufferedInputStream(fis); DataInputStream dis = new DataInputStream(bis); oder als ein Befehl DataInputStream dis = new DataInputStream( new BufferedInputStream( new FileInputStream(args[0])));

Beispiel (Datenströme) import java.io.*; class DataIODemo { public static void main(string[] args) throws FileNotFoundException, IOException { DataOutputStream dataoutputstream = new DataOutputStream(new FileOutputStream(args[0])); double[] doubles = {16.57,15.44,9.99}; for(int i=0; i<doubles.length; i++) { dataoutputstream.writedouble(doubles[i]); } dataoutputstream.close(); DataInputStream dis = new DataInputStream(new FileInputStream(args[0]));

Beispiel (Datenströme) double sum = 0.0; try { while(true) { //Read next double until EOF is reached and an EOFException //is thrown; add the double to sum sum += dis.readdouble(); } } catch(eofexception e) { System.out.println("Sum of doubles: "+sum); } finally { dis.close(); } } }

Datenströme > java DataIODemo test.dat Sum of doubles : 42.0

Stream Tokenizer Das Zerlegen von Eingabedaten in Token ist ein häufiges Problem. Java stellt eine Klasse StreamTokenizer für solche einfachen lexikalischen Analysen zur Verfügung.

Stream Tokenizer Erkennt nexttoken() ein Token, gibt es den Tokentyp als seinen Wert zurück und setzt das Datenfeld ttype auf denselben Wert. Es gibt vier Tokentypen:

Stream Tokenizer Erkennt nexttoken() ein Token, gibt es den Tokentyp als seinen Wert zurück und setzt das Datenfeld ttype auf denselben Wert. Es gibt vier Tokentypen: TT_WORD: Ein Wort wurde eingescannt. Das Datenfeld sval vom Typ String enthält das gefundene Wort.

Stream Tokenizer Erkennt nexttoken() ein Token, gibt es den Tokentyp als seinen Wert zurück und setzt das Datenfeld ttype auf denselben Wert. Es gibt vier Tokentypen: TT_WORD: Ein Wort wurde eingescannt. Das Datenfeld sval vom Typ String enthält das gefundene Wort. TT_NUMBER: Eine Zahl wurde eingescannt. Das Datenfeld nval vom Typ double enthält den Wert der Zahl. Nur dezimale Gleitkommazahlen (mit oder ohne Dezimalpunkt) werden erkannt. Die Analyse versteht weder 3.4e79 als Gleitkommazahl noch 0xffff als Hexadezimalzahl.

Stream Tokenizer Erkennt nexttoken() ein Token, gibt es den Tokentyp als seinen Wert zurück und setzt das Datenfeld ttype auf denselben Wert. Es gibt vier Tokentypen: TT_WORD: Ein Wort wurde eingescannt. Das Datenfeld sval vom Typ String enthält das gefundene Wort. TT_NUMBER: Eine Zahl wurde eingescannt. Das Datenfeld nval vom Typ double enthält den Wert der Zahl. Nur dezimale Gleitkommazahlen (mit oder ohne Dezimalpunkt) werden erkannt. Die Analyse versteht weder 3.4e79 als Gleitkommazahl noch 0xffff als Hexadezimalzahl. TT_EOL: Ein Zeilenende wurde gefunden (nur wenn eolissignificant true ist).

Stream Tokenizer Erkennt nexttoken() ein Token, gibt es den Tokentyp als seinen Wert zurück und setzt das Datenfeld ttype auf denselben Wert. Es gibt vier Tokentypen: TT_WORD: Ein Wort wurde eingescannt. Das Datenfeld sval vom Typ String enthält das gefundene Wort. TT_NUMBER: Eine Zahl wurde eingescannt. Das Datenfeld nval vom Typ double enthält den Wert der Zahl. Nur dezimale Gleitkommazahlen (mit oder ohne Dezimalpunkt) werden erkannt. Die Analyse versteht weder 3.4e79 als Gleitkommazahl noch 0xffff als Hexadezimalzahl. TT_EOL: Ein Zeilenende wurde gefunden (nur wenn eolissignificant true ist). TT_EOF: Das Eingabeende wurde erreicht.

Beispiel import java.io.*; class TokenDemo { public static void main(string[] args) throws IOException { FileReader filein = new FileReader(args[0]); StreamTokenizer st = new StreamTokenizer(fileIn); int words = 0; // total word number. int numbers = 0; // total int number. int eols = 0; // total eols. int others = 0; // total others. st.eolissignificant(true); // to treat eols as a character

Beispiel while(st.nexttoken()!= StreamTokenizer.TT_EOF) { // to read next Token and check EOF if(st.ttype == StreamTokenizer.TT_WORD) words++; // if word then total words++. else if(st.ttype == StreamTokenizer.TT_NUMBER) numbers++; // if number then total numbers++. else if(st.ttype == StreamTokenizer.TT_EOL) eols++; else others++; // if eols total eols++. // else others++. } System.out.println("File "+args[0]+" contains\n\t"+ words+" words,\n\t"+ numbers+" numbers,\n\t"+ eols+" end-of-lines, and\n\t"+ others+" other characters."); } }

> java TokenDemo TokenDemo.java File TokenDemo.java contains 61 words, 6 numbers, 31 end-of-lines, and 88 other characters.

K. Arnold, J. Gosling: Java TM - Die Programmiersprache. Addison-Wesley, 1996. T.H. Cormen, C.E. Leierson, R.L. Rivest: Introduction to Algorithms. MIT Press, 1990. D. Flanagan: Java in a Nutshell. O Reilly & Associates Inc., 1996. F. Jobst: Programmieren in Java. Hanser Verlag, 1996. H. Klaeren: Vom Problem zum Programm. 2.Auflage, B.G. Teubner Verlag, 1991. K. Echtle, M. Goedicke: Lehrbuch der Programmierung mit Java. dpunkt-verlag, 2000.