Grundlagen der Programmierung! Kapitel 10: Ein- und Ausgabe! Ziele dieses Kapitels! Datei! Das Problem!

Ähnliche Dokumente
Dynamische Datenstrukturen Jiri Spale, Algorithmen und Datenstrukturen - Dynamische Datenstrukturen 1

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

Programmieren 2 Selbststudium Semesterwoche 6

Eingabe und Ausgabe in Java. Dr. Horst Treiblmaier Abteilung für Wirtschaftsinformatik WU Wien

Java Fehlerbehandlung

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

Umleitung von Datenströmen

Programmieren in Java

Software Entwicklung 1

Ein- und Ausgabe in Java

Java Input/Output System (IO)

AK-Automatisierungs und Kommunikationstechnik TI Technische Informatik. NWT Netzwerktechnik

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

Ausdrucksbäume in verschiedenen Darstellungen

Programmieren 2 09 File-IO

Socket-Programmierung unter Java

Dr. Monika Meiler. Inhalt

Algorithmen und Datenstrukturen II

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

Kapitel 9. Ein- und Ausgabe. 9.1 Ströme

Liebe Leserin, lieber Leser, in der ersten Auflage von Programmieren lernen mit Java von Hans- Peter Habelitz sind einige Fehler zu korrigieren.

Vorlesung Programmieren

Einführung in die Informatik Files and Streams

Einführung zur Aufgabengruppe 2

Versuchsziele Konzepte der parallelen Programmierung am Beispiel von Threads anwenden können. Einbau von Kontrollmechanismen mittels Semaphore.

Modellierung und Programmierung 1

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

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

Java Einführung Exception Handling. Kapitel 17

Java I Vorlesung Exceptions

Beispiel: Temperaturumwandlung. Imperative Programmierung. Schwerpunkte. 3. Grundlegende Sprachkonstruktionen imperativer Programme

Die elementare Ausgabe von Daten auf externe Medien, wie Dateien und das Einlesen davon wird demonstriert.

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

Ein- und Ausgabe (I/O)

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete! 4. Ausnahmen (Exceptions) II.4.

Dateien/Streams. Arthur Zaczek. Okt 2015

Einführung in die Informatik

3. Grundlegende Sprachkonstruktionen imperativer Programme

Klausur Grundlagen der Programmierung

Objektserialisierung

Universität Augsburg, Institut für Informatik Sommersemester 2005 Prof. Dr. Werner Kießling 15. Oktober 2005 Dr. Alfons Huhn, Timotheus Preisinger

Vorlesung Informatik II

Einführung in die Informatik Algorithmen und Datenstrukturen. Thema 12 Datenverarbeitung

Klassen und Objekte. Objekte einer Klasse bilden

Programmieren in Java

Javakurs für Fortgeschrittene

Einstieg in die Informatik mit Java

Telecooperation/RBG. Grundlagen der Informatik 1 Thema 20: Ströme und Ein-/Ausgabe in Java. Dr. Guido Rößling

Dateizugriff unter C

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

II.1.1. Erste Schritte - 1 -

Grundlagen der Programmierung Prof. H. Mössenböck. 15. Pakete

Primitive Datentypen

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

1 Fehler-Objekte: Werfen, Fangen, Behandeln

Name: Matrikelnr : Aufgabe 1: (ca. 8 Punkte )

Dr. Monika Meiler. Inhalt

Einführung in die Informatik 1

Im Windows Betriebssystem sind Dateien eindeutig gekennzeichnet durch ihren Pfad, Dateinamen und nach einem Punkt die Dateierweiterung.

Einstieg in die Informatik mit Java

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 23

Programmieren in C/C++ und MATLAB

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Distributed Computing Group

12.2 Persistente Objekte

Programmierkurs Kapitel 4: Dateien Seite 1. Verwaltungfeld im Speicher. 4.1 Alternativen zur Programmierung der Eingabe und der Ausgabe

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode

Java I/O, Serialisierung und Netzwerkprogrammierung

Ein erstes Java-Programm

Vorlesung Programmieren

Javakurs zu Informatik I. Henning Heitkötter

Ein- und Ausgabe mit Java

von Anja Austermann Drag and Drop

Java Einführung Klassendefinitionen

Tag 4 Repetitorium Informatik (Java)

Beispiele für Ausdrücke. Der imperative Kern. Der imperative Kern. Imperativer Kern - Kontrollstrukturen. Deklarationen mit Initialisierung

PIWIN 1 Übung Blatt 5

6 Ein- und Ausgabe. Bisher war unsere (Bildschirm-) Ausgabe leichtflüchtig (

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

E-/A-Funktionalität nicht Teil der Programmiersprache

Referat: Netzwerkprogrammierung in Java

Streams. Programmiermethodik. Eva Zangerle Universität Innsbruck

Repetitorium Informatik (Java)

Programmieren 2 10 Binäre und Objekt-IO

Einstieg in die Informatik mit Java

Repetitorium Informatik (Java)

RO-Tutorien 3 / 6 / 12

Vorlesung Programmieren

Klassenattribute und -methoden, Vererbung

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

2.13 Vererbung. Rainer Feldmann Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/ Article

Ein- und Ausgabe. Für die Ein- und Ausgabe von Daten gibt es eine Reihe von Möglichkeiten. Beispiele hierfür sind:

Einführung in die Programmierung 1

7. Pakete Grundlagen der Programmierung 1 (Java)

Delegatesund Ereignisse

Vorlesung 11. Sitzung Grundlegende Programmiertechniken

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Arbeitsblätter für die Lehrveranstaltung OOP JAVA 4

Programmieren in Java

Transkript:

Grundlagen der Programmierung Dr. Christian Herzog Technische Universität München Wintersemester 2014/2015 Ziele dieses Kapitels Sie verstehen das Konzept der Ströme Sie können Klassen wie Reader, Writer, InputStream und OutputStream benutzen. Sie können in Java Dateien lesen und schreiben Kapitel 10: Ein- und Ausgabe Herzog Grundlagen der Programmierung TUM Wintersemester 2014/15 Kapitel 10, Folie 1 2 Herzog Grundlagen der Programmierung TUM Wintersemester 2014/15 Kapitel 10, Folie 2 Das Problem In den Informatik-Systemen, die wir bisher implementiert haben, haben wir Klassen deklariert, instantiiert und die Attribute mit Werten gefüllt. Die Werte waren allerdings nur während der Laufzeit des Systems verfügbar. Häufig sollen Werte extern gespeichert werden, so dass sie bei einem erneuten Lauf wieder zur Verfügung stehen. In vielen Fällen werden auch Werte von einem Informatik-System erzeugt, die dann von einem anderen System benötigt werden. Bei interaktiven Systemen wollen wir bereits während der Ausführung Daten mit der Umgebung (Benutzer) austauschen: Wir wollen Werte über eine Tastatur eingeben lassen, andere Werte sollen auf dem Bildschirm erscheinen. Zur Speicherung von Werten und zur Interaktion mit Benutzern führen wir jetzt die Konzepte Strom und Datei ein. Datei Wir haben bereits die Kommunikation mit der Umgebung des Systems zugelassen, allerdings sehr spärlich. System.out.println(): Ausdrucken von Daten auf dem Bildschirm Unser Ziel ist jetzt die Modellierung der Interaktion von Informatik- Systemen mit ihrer Umgebung. Definition Datei: Eine Verwaltungseinheit zur Repräsentation von externen Daten nach gewissen Organisationsformen, die den Zugriff innerhalb des Informatik-Systems auf die Daten festlegen. Herzog Grundlagen der Programmierung TUM Wintersemester 2014/15 Kapitel 10, Folie 3 Herzog Grundlagen der Programmierung TUM Wintersemester 2014/15 Kapitel 10, Folie 4

Speicherung von Dateien Eine Datei ist mit einem Ein-Ausgabegerät, kurz E/A-Gerät, (engl. I/O device) verbunden, das die Daten einer Datei permanent speichern kann. Beispiele von E/A-Geräten: Platte, CD, DVD, Magnetband, Stick Abhängig vom Typ der Daten in der Datei unterscheiden wir ebenfalls verschiedene Arten von Dateien: Text-Datei, Binär-Datei, Personal- Datei, Studenten-Datei,... Strom Um auf Dateien innerhalb eines Informatik-Systems zugreifen zu können, führen wir den Begriff des Stroms(*) ein. Definition Strom: Die interne Repräsentation einer (externen) Datei oder eines E/A-Gerätes in einem Informatik-System. Definition Eingabe: Das Lesen der Daten von einer Datei oder einem Eingabegerät in einen Strom. Der Strom heißt dann Eingabestrom. Definition Ausgabe: Das Schreiben von Daten eines Stroms auf eine Datei oder ein Ausgabegerät. Der Strom heißt dann Ausgabestrom. Herzog Grundlagen der Programmierung TUM Wintersemester 2014/15 Kapitel 10, Folie 5 (*) Achtung: In Goos II hat der Begriff Strom eine andere Bedeutung. Bei Goos ist ein Strom ein Iterator über Daten. Herzog Grundlagen der Programmierung TUM Wintersemester 2014/15 Kapitel 10, Folie 6 Beispiele von Eingabe- und Ausgabeströmen Eine Tastatur ist eine Quelle für einen Eingabestrom von Zeichen an ein Programm. Tastatur Ein Bildschirm ist ein Empfänger für einen Ausgabestrom von Zeichen von einem Programm. Programm Ausgabestrom Eingabestrom Programm Eine Datei ist Empfänger oder Quelle für Ströme von Zeichen Dateien Ausgabestrom Eingabestrom Programm Bild Schirm Modellierung von Strömen Wir modellieren Ströme als Klassen. Allgemein: Ein Strom hat mehrere Attribute: Datei: Name der mit dem Strom assoziierten Datei Marke: Zeiger auf das derzeitige Element (current element). Ein Strom stellt gewöhnlich folgende Dienste bereit: Open(): Öffnen der Verbindung mit einer Datei / einem Gerät Read(): Lesen eines Elementes Write(): Schreiben eines Elementes Close(): Schließen der Verbindung mit der Datei / dem Gerät. Die genaue Funktionalität der Dienste und die Implementierung von Strömen ist abhängig von der Programmiersprache, die Implementierung von Dateien ist außerdem oft noch abhängig vom Betriebssystem. Java unterstützt Ströme und Dateien. Die Methoden lösen i.a. Ausnahmen der Klasse IOException bzw. von deren Unterklassen aus. Herzog Grundlagen der Programmierung TUM Wintersemester 2014/15 Kapitel 10, Folie 7 Herzog Grundlagen der Programmierung TUM Wintersemester 2014/15 Kapitel 10, Folie 8

Ströme und Dateien in Java Java stellt eine große Anzahl von unterschiedlichen Strömen für Ein- Ausgabe (Reader, Writer, InputStream, OutputStream) und eine betriebssystem-unabhängige Beschreibung für Dateien (File) bereit, die alle im Paket java.io definiert sind. Object InputStream: Modelliert binäre Eingabeströme ByteArray InputStream FileInput Stream FilterInput Stream InputStream ObjectInput Stream PipedInput Stream Reader Writer Abstrakte Klasse für textuelle Ausgabeströme InputStream Abstrakte Klasse für binäre Eingabeströme OutputStream Abstrakte Klasse für binären Ausgabeströme File Plattform-unabhängige Beschreibung von Dateien Grundlagen der Programmierung TUM Wintersemester 2014/15 Kapitel 10, Folie 9 Herzog Writer InputStream OutputStream File Klasse Beschreibung Reader Abstrakte Klasse für textuelle Eingabeströme Klasse Beschreibung ByteArrayInputSteam Erlaubt das Lesen von Reihungen, als ob sie Ströme wären FileInputStream Ermöglicht das Lesen von Bytes aus Binär-Dateien FilterInputStream Ermöglicht das Filtern von Daten auf verschiedene Arten Buffered InputStream Ermöglicht das Puffern von Eingabedaten DataInputStream Lesen von vordefinierten elementaren Java-Typen ObjectInputStream Zum Deserialisieren von Objekten PipedInputStream Lesen von Daten aus einem anderen Thread Herzog Buffered Input Stream DataInput Stream Grundlagen der Programmierung TUM Wintersemester 2014/15 Kapitel 10, Folie 10 Reader: Modelliert textuelle Eingabeströme Reader OutputStream: Modelliert binäre Ausgabeströme OutputStream Buffered Reader CharArray Reader InputStream Reader PipedReader StringReader ByteArray OutputStream FileOutput Stream FilterOutput Stream ObjectOutput Stream PipedOutput Stream LineNumber Reader Klasse Beschreibung BufferedReader Gepufferte Eingabe bei textuellen Eingabeströmen CharArrayReader Eingabe-Operationen auf Reihungen vom Typ Char FileReader Zeicheneingabe bei Dateien PipedReader Methoden zum Filtern von Zeicheneingaben StringReader Eingabe-Operationen für Zeichenketten (String) LineNumberReader Zählt Anzahl der Text-Zeilen, die gelesen wurden. Herzog FileReader Grundlagen der Programmierung TUM Wintersemester 2014/15 Kapitel 10, Folie 11 Klasse Beschreibung ByteArrayOutputSteam Erlaubt das Schreiben von Reihungen als ob sie Ströme wären FileOutputStream Ermöglicht das Schreiben von Bytes in Binär-Dateien FilterOutputStream Ermöglicht das Filtern von Daten auf verschiedene Arten Buffered OutputStream Ermöglicht das Puffern von Ausgabedaten DataOutputStream Schreiben von vordefinierten elementaren Java-Typen ObjectOutputStream Zum Serialisieren von Objekten PipedOutputStream Schreiben von Daten auf anderen Thread Herzog BufferedOutput Stream DataOutput Stream Grundlagen der Programmierung TUM Wintersemester 2014/15 Kapitel 10, Folie 12

Writer: Modelliert textuelle Ausgabeströme Die Standard Ein/Ausgabe in Java basiert auf Strömen Buffered Writer CharArray Writer FileWriter Writer OutputStream Reader Piped Writer Print Writer String Writer Informelles Modell mit Strömen Bild Schirm Die Klassenvariable System.out ist ein Strom vom Typ PrintStream System.out Programm Speicher Klasse Beschreibung BufferedWriter Gepufferte Ausgabe bei textuellen Ausgabeströmen CharArrayWriter Ausgabe-Operationen auf Reihungen (Array of Char) FileWriter Für Ausgabe auf Text-Dateien PipedWriter Methoden zum Filtern bei Ausgabe von Zeichen (Char) PrintWriter Textuelle Ausgabe von Java's Basistypen StringWriter Ausgabe von Zeichenketten (String) Tastatur System.in System.in ist ein Strom vom Typ InputStream: Eingabe wird Byte für Byte gelesen Herzog Grundlagen der Programmierung TUM Wintersemester 2014/15 Kapitel 10, Folie 13 Herzog Grundlagen der Programmierung TUM Wintersemester 2014/15 Kapitel 10, Folie 14 Wichtiges Konzept: Puffern von Daten Definition Eingabepuffer (input buffer): Ein Bereich im Speicher für die temporäre Speicherung von bereits gelesenen aber noch nicht verarbeiteten Daten: Anstatt ein Byte nach dem anderen von dem Eingabegerät zu lesen, werden zunächst eine große Anzahl von Bytes gleichzeitig in den Puffer gelesen, Diese werden dann stückweise bei jeder Lese-Operation ins Programm transferiert. Definition Ausgabepuffer (output buffer): Ein Bereich im Speicher für die temporäre Speicherung von zu schreibenden Daten. Daten werden erst auf das Ausgabegerät geschrieben, wenn der Puffer voll ist (oder bei einer sogenannten flush()-operation). Puffer helfen, den Geschwindigkeitsunterschied zwischen langsamen Zugriffen auf Geräte/Dateien und schnellen Prozessoren auszugleichen. Wichtiges Konzept: Konkatenation von Strömen Die Deklarationen FileReader freader = new FileReader(fileName); BufferedReader breader = new BufferedReader(fReader); konkatenieren zwei Ströme vom Typ BufferedReader und FileReader. Das Programm kann dann breader.readline() benutzen, um Zeile für Zeile - und nicht Zeichen für Zeichen - von der Text-Datei mit Namen filename zu lesen. Interpretation: Die Daten fließen von der Text-Datei erst durch FileReader, dann durch BufferedReader zum Speicher. Speicher 0100010 0100101 1111111 1111100 1100101 0111110 1111110 BufferedReader FileReader Text Datei Herzog Grundlagen der Programmierung TUM Wintersemester 2014/15 Kapitel 10, Folie 15 Herzog Grundlagen der Programmierung TUM Wintersemester 2014/15 Kapitel 10, Folie 16

Konkatenation von Ausgabeströmen Die Deklarationen FileOutputStream fostream = new FileOutputStream (filename); PrintWriter pwriter = new PrintWriter (fostream); konkatenieren zwei Ströme FileOutputStream und PrintWriter. Das Programm kann dann die bequemen Methoden pwriter.print() und pwriter.println() benutzen. Interpretation: Die Daten fließen vom Speicher erst durch PrintWriter, dann durch FileOutputStream zur Text-Datei. Bequem: Die Methoden von PrintWriter behandeln alle Ausnahmen, die bei FileOutputStream auftreten können, und deklarieren selbst keine. Speicher 0100010 0100101 1111111 1111100 1100101 0111110 1111110 Herzog PrintWriter FileOutputStream Text Datei Grundlagen der Programmierung TUM Wintersemester 2014/15 Kapitel 10, Folie 17 Wann benutzen wir welchen Strom? Bei binärer Ein-Ausgabe: Unterklassen von InputStream und OutputStream. Bei Textueller Ein-Ausgabe: Unterklassen von Reader und Writer. Beispiel: PrintWriter ist eine Unterklasse von Writer. Sie stellt Methoden zur textuellen Ausgabe von Objekten vom Typ int, long, float, double, String und Object bereit: public void print(int i); public void println(int i); public void print(long l); public void println(long l); public void print(float f); public void println(float f); public void print(double d); public void println(double d); public void print(string s); public void println(string s); public void print(object o); public void println(object o); Herzog Grundlagen der Programmierung TUM Wintersemester 2014/15 Kapitel 10, Folie 18 Verbindung von Dateien bzw. Geräten und Strömen Jede Programmiersprache muss ein Konzept bereitstellen, um Ströme mit Dateien zu verbinden. In Java geschieht die Verbindung im Konstruktor der Strom-Klasse, die mit dem Dateinamen als Argument aufgerufen wird. Beispiel: String filename = /home/bob/src/trivial.java; Standard-Ein-/Ausgabe in Java Die Klasse System stellt in Java über Klassenvariablen Ströme bereit, die mit der Tastatur (System.in) und dem Bildschirm (System.out bzw. System.err) verbunden sind: FileWriter fwriter = new FileWriter(fileName); verbindet den Ausgabestrom fwriter mit einer Datei namens /home/bob/src/trivial.java. Herzog Grundlagen der Programmierung TUM Wintersemester 2014/15 Kapitel 10, Folie 19 Herzog Grundlagen der Programmierung TUM Wintersemester 2014/15 Kapitel 10, Folie 20

Ein Beispiel: Kopieren vom Dateien Wie wollen in einer Klasse FileUtils eine Methode copyfile() zur Verfügung stellen, die zwei Dateinamen als Parameter erhält und die eine Datei in die andere kopiert. Importieren der Klassen- import java.io.*; Bezeichner aus dem Paket class FileUtils { java.io (Siehe Kapitel 11) public static void copyfile (String inputfile, String outputfile) { // Es wird versucht, die Eingabedatei zum Lesen zu oeffnen: FileReader freader = null; try { freader = new FileReader (inputfile); catch (FileNotFoundException e) { System.out.println(Fehler: Die Datei + inputfile + konnte nicht zum Lesen geoeffnet werden.); System.exit(97); // Konkatenation von Eingabestroemen: BufferedReader breader = new BufferedReader(fReader); Herzog Grundlagen der Programmierung TUM Wintersemester 2014/15 Kapitel 10, Folie 21 Kopieren vom Dateien (cont d) // Versuch, die Ausgabedatei zum Schreiben zu oeffnen: FileOutputStream fostream = null; try { fostream = new FileOutputStream (outputfile); catch (IOException e) { System.out.println(Fehler: Die Datei + outputfile + konnte nicht zum Schreiben geoeffnet werden.); System.exit(98); // Konkatenation von Ausgabestroemen: PrintWriter pwriter = new PrintWriter (fostream); Herzog Grundlagen der Programmierung TUM Wintersemester 2014/15 Kapitel 10, Folie 22 Kopieren vom Dateien (cont d) // Der Inhalt der Eingabedatei wird zeilenweise in die // Ausgabedatei kopiert: try { String inputline; do { // Eine Zeile lesen: inputline = breader.readline(); // Beim Dateiende wird der null-pointer geliefert: if (inputline = null) // Die Zeile schreiben: pwriter.println(inputline); while (inputline = null); // Solange kein Dateiende // Schliessen der Stroeme: breader.close(); pwriter.close(); catch (IOException e) { System.out.println(Fehler: + e); System.exit(99); // copyfile() // class FileUtils Herzog Grundlagen der Programmierung TUM Wintersemester 2014/15 Kapitel 10, Folie 23 Zusammenfassung Eine Datei ist eine Sammlung von Daten, die extern auf einem Sekundärspeicher (Platte, CD, Band) gespeichert sind. Ein Strom ist ein Objekt, das Daten von anderen Objekten holt oder zu anderen Objekten liefert. Ein Eingabestrom liefert Daten von einer externen Quelle zu einem Programm. Ein Ausgabestrom liefert Daten vom Programm zu einem externen Gerät oder einer Datei. Puffer ist ein temporärer Bereich im Hauptspeicher, um Daten während der Ein- oder Ausgabe zu speichern. Java stellt eine Vielzahl von Klassen zur Implementierung von Strömen bereit. Durch Konkatenation von Strömen erhält man einen Gesamtstrom mit jeweils optimaler Schnittstelle zum Programm auf der einen Seite und zur Datei bzw. zum Gerät auf der anderen Seite. Herzog Grundlagen der Programmierung TUM Wintersemester 2014/15 Kapitel 10, Folie 24