Programmieren I und II



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

Programmieren 2 Selbststudium Semesterwoche 6

Programmieren in Java

Objektorientierte Programmierung

Einführung in die Java- Programmierung

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

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

Institut für Programmierung und Reaktive Systeme 26. April Programmieren II. 10. Übungsblatt

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

Große Übung Praktische Informatik 1

Der lokale und verteilte Fall

Software Engineering Klassendiagramme Assoziationen

Zählen von Objekten einer bestimmten Klasse

Übungen zur Vorlesung Einführung in die Informatik Wintersemester 2010/11

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Arbeiten mit UMLed und Delphi

Vorlesung Programmieren

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Objektorientierte Programmierung. Kapitel 12: Interfaces

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2015/16. Vorbereitende Aufgaben

Internet online Update (Mozilla Firefox)

Einführung in die Programmierung

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Scala kann auch faul sein

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

Java Kurs für Anfänger Einheit 5 Methoden

Programmieren für Ingenieure Sommer Ein Rechner. Rechner sind überall. Gerät, das mittels programmierbarer Rechenvorschriften Daten verarbeitet.

Objektorientierte Programmierung

7. Pakete Grundlagen der Programmierung 1 (Java)

Computeranwendung und Programmierung (CuP)

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Javakurs zu Informatik I. Henning Heitkötter

Viele Bilder auf der FA-Homepage

Wordpress: Blogbeiträge richtig löschen, archivieren und weiterleiten

Java: Vererbung. Teil 3: super()

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

Einführung in PHP. (mit Aufgaben)

Klausur WS 2006/07 Programmiersprache Java Objektorientierte Programmierung II 15. März 2007

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Brainfuck. 1 Brainfuck. 1.1 Brainfuck Geschichte und Umfeld. 1.2 Esoterische Programmiersprachen

5. Tutorium zu Programmieren

Anleitung über den Umgang mit Schildern

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Programmierkurs Java

I.1 Die Parrot Assemblersprache

Einführung in Javadoc

Übung: Verwendung von Java-Threads

Wie man Registrationen und Styles von Style/Registration Floppy Disketten auf die TYROS-Festplatte kopieren kann.

Studentische Lösung zum Übungsblatt Nr. 7

Folge 18 - Vererbung

Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss

Session Beans & Servlet Integration. Ralf Gitzel ralf_gitzel@hotmail.de

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Grundlagen von Python

Testklausur 1 zur Vorlesung. Modellierung und Programmierung I. Dr. Monika Meiler Zeit: 60 Minuten

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 17: 3-Schichten-Architektur 2

Folge 19 - Bäume Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Einführung in die Informatik Tools

So gehts Schritt-für-Schritt-Anleitung

1 Vom Problem zum Programm

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

Informationsblatt Induktionsbeweis

5.4 Klassen und Objekte

GITS Steckbriefe Tutorial

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Einführung in die Programmierung

Objektorientierte Programmierung mit C++ Vector und List

Dateimanagement in Moodle Eine Schritt-für

Java Input/Output System (IO)

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Erstellen der Barcode-Etiketten:

Typumwandlungen bei Referenztypen

Wie halte ich Ordnung auf meiner Festplatte?

Print2CAD 2017, 8th Generation. Netzwerkversionen

Access [basics] Rechnen in Berichten. Beispieldatenbank. Datensatzweise berechnen. Berechnung im Textfeld. Reporting in Berichten Rechnen in Berichten

Übungsblatt 3: Algorithmen in Java & Grammatiken

AutoCAD Dienstprogramm zur Lizenzübertragung

Vorkurs C++ Programmierung

Xcode/Cocoa/Objective-C Crashkurs Programmieren unter Mac OS X

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Memeo Instant Backup Kurzleitfaden. Schritt 1: Richten Sie Ihr kostenloses Memeo-Konto ein

1.3. Installation und Konfiguration von Filr Desktop

Daten-Synchronisation zwischen dem ZDV-Webmailer und Outlook ( ) Zentrum für Datenverarbeitung der Universität Tübingen

Autor: Michael Spahn Version: 1.0 1/10 Vertraulichkeit: öffentlich Status: Final Metaways Infosystems GmbH

Programmieren in Java

FTP-Server einrichten mit automatischem Datenupload für

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Programmierparadigmen. Programmierparadigmen. Imperatives vs. objektorientiertes Programmieren. Programmierparadigmen. Agenda für heute, 4.

Übungen Programmieren 1 Felix Rohrer. Übungen

Anzeige von eingescannten Rechnungen

Transkript:

Handout zu den Vorlesungen Vorlesung Programmieren I und II Unit 4 Einfache I/O Programmierung Serialisierung von Objekten 1 Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme Raum: 17-0.10 Tel.: 0451 300 5549 Email: kratzke@fh-luebeck.de @NaneKratzke Updates der Handouts auch über Twitter #prog_inf und #prog_itd (Praktische Informatik) Fachhochschule Lübeck Fachbereich Elektrotechnik und Informatik 2 Seite 1

Units Unit 1 Einleitung und Grundbegriffe Unit 2 Grundelemente imperativer Programme Unit 3 Selbstdefinierbare Datentypen und Collections Unit 4 Einfache I/O Programmierung Unit 5 Rekursive Programmierung und rekursive Datenstrukturen Unit 6 Einführung in die objektorientierte Programmierung und UML Unit 7 Konzepte objektorientierter Programmiersprachen Unit 8 Testen (objektorientierter) Programme Unit 9 Generische Datentypen Unit 10 Objektorientierter Entwurf und objektorientierte Designprinzipien Unit 11 Graphical User Interfaces Unit 12 Multithread Programmierung Unit 13 Einführung in die Funktionale Programmierung 3 Units 2. Semester 1. Semester Unit 1 Einleitung und Grundbegriffe Unit 5 Rekursive Programmierung, rekursive Datenstrukturen, Lambdas Unit 9 Generische Datentypen Unit 2 Grundelemente imperativer Programme Unit 6 Objektorientierte Programmierung und UML Unit 10 Objektorientierter Entwurf und objektorientierte Designprinzipien Unit 3 Selbstdefinierbare Datentypen und Collections Unit 7 Konzepte objektorientierter Programmiersprachen, Klassen vs. Objekte, Pakete und Exceptions Unit 11 Graphical User Interfaces Unit 4 Einfache I/O Programmierung Unit 8 Testen (objektorientierter) Programme Unit 12 Multithread Programmierung 4 (Praktische Informatik) Fachhochschule Lübeck Fachbereich Elektrotechnik und Informatik Seite 2

Abgedeckte Ziele dieser UNIT Kennen existierender Programmierparadigmen und Laufzeitmodelle Sicheres Anwenden grundlegender programmiersprachlicher Konzepte (Datentypen, Variable, Operatoren, Ausdrücke, Kontrollstrukturen) Fähigkeit zur problemorientierten Definition und Nutzung von Routinen und Referenztypen (insbesondere Liste, Stack, Mapping) Verstehen des Unterschieds zwischen Werte- und Referenzsemantik Kennen und Anwenden des Prinzips der rekursiven Programmierung und rekursiver Datenstrukturen Kennen des Algorithmusbegriffs, Implementieren einfacher Algorithmen Kennen objektorientierter Konzepte Datenkapselung, Polymorphie und Vererbung Sicheres Anwenden programmiersprachlicher Konzepte der Objektorientierung (Klassen und Objekte, Schnittstellen und Generics, Streams, GUI und MVC) Kennen von UML Klassendiagrammen, sicheres Übersetzen von UML Klassendiagrammen in Java (und von Java in UML) Kennen der Grenzen des Testens von Software und erste Erfahrungen im Testen (objektorientierter) Software Sammeln erster Erfahrungen in der Anwendung objektorientierter Entwurfsprinzipien Sammeln von Erfahrungen mit weiteren Programmiermodellen und -paradigmen, insbesondere Mulithread Programmierung sowie funktionale Programmierung Am Beispiel der Sprache JAVA 5 Zum Nachlesen... Kapitel 19 Ein- und Ausgabe über Streams Abschnitt 19.1 Grundsätzliches zu Streams in Java Abschnitt 19.2 Dateien und Verzeichnisse Abschnitt 19.3 Ein- und Ausgabe über Character-Streams Abschnitt 19.4.2 Die Serialisierung und Deserialisierung von Objekten 6 (Praktische Informatik) Fachhochschule Lübeck Fachbereich Elektrotechnik und Informatik Seite 3

Noch mehr zum Nachlesen... Kapitel 16 Ein-/Ausgabe und Streams Abschnitt 16.2 Klassifizierung von Str. Abschnitt 16.3 Das Stream-Konzept Abschnitt 16.4 Bytestream-Klassen Abschnitt 16.5 Bytestream-Klassen Abschnitt 16.7 Ein- und Ausgabe von Objekten 7 I/O erscheint mit Java recht komplex Das Lesen und Schreiben von Daten in Dateien in Java ist nicht ganz einfach. I/O Programming wird in Java mittels sogenannter Datenströme (Streams) realisiert. Lese- und Schreiboperationen auf Dateien lassen sich in anderen Programmiersprachen häufig wesentlich einfach realisieren. In Java muss man hierzu erst einmal einige Konzepte verstehen. Dafür wird man dann aber auch mit einiger Flexibilität belohnt. 8 (Praktische Informatik) Fachhochschule Lübeck Fachbereich Elektrotechnik und Informatik Seite 4

... ist es aber nicht, wenn man über die Zusammenhänge weiß! Zugriff auf das Dateisystem erfolgt mittels File Objekten Definition von Datenquellen und senken erfolgt mittels Inputund OutputStreams Datenquellen und senken sind dabei nicht auf Dateien beschränkt Weitere Quellen und Senken können bspw. beliebige URLs oder die Systemausgabe auf einer Konsole sein. Durch objektorientierte Erweiterungen der InputStream und OutputStream Klassen lassen sich beliebige Quellen und Senken erschließen Lese- und Schreiboperationen auf diesen Streams erfolgen zeichenweise mittels Reader und Writer Objekten Lese- und Schreiboperationen lassen sich mittels BufferedReader und BufferedWriter Objekten puffern (um bspw. eine zeilenweise Verarbeitung von Textdateien zu ermöglichen) 9 Themen dieser Unit Dateien und Verzeichnisse I/O Streams Serialisierung File Objekt Dateien/ Verzeichnisse erzeugen, löschen, umbenennen Zustände von Dateien/ Verzeichnissen abfragen Das Stream Konzept Aus Quellen lesen In Senken schreiben Objektzustände speichern Objektzustände wiederherstellen 10 (Praktische Informatik) Fachhochschule Lübeck Fachbereich Elektrotechnik und Informatik Seite 5

Auf das Dateisystem aus Java zugreifen Java bietet, um auf Elemente des Dateisystems zugreifen zu können, Objekte der Klasse File an (sowohl für Dateien als auch für Verzeichnisse). File Erzeugen/löschen boolean createnewfile() boolean mkdir() boolean delete() boolean renameto(file f) File Rechte und Typ boolean canread() boolean canwrite() boolean isdirectory() boolean isfile() long length()... File Abfragen boolean exists() String getname() String getabsolutepath() File[] listfiles()... import java.io.file; File f = new File( /Users/Nane/Desktop ); 11 Beispiel: Typische Nutzung von File Objekten File f = new File("/Users/Nane"); // Anlegen und loeschen einer neuen Datei File newfile = new File(f.getAbsolutePath() + File.separator + "newfile.test"); newfile.createnewfile(); newfile.delete(); // Anlegen und loeschen eines neuen Verzeichnisses File newdir = new File(f.getAbsolutePath() + File.separator + "directory"); newdir.mkdir(); newdir.delete(); // Auflisten aller Dateien in einem Verzeichnis for (File file : f.listfiles()) { if (file.isfile()) { System.out.println(file.getAbsolutePath() + " Size: " + file.length() + " bytes"); 12 (Praktische Informatik) Fachhochschule Lübeck Fachbereich Elektrotechnik und Informatik Seite 6

Themen dieser Unit Dateien und Verzeichnisse File Objekt Dateien/ Verzeichnisse erzeugen, löschen, umbenennen Zustände von Dateien/ Verzeichnissen abfragen I/O Streams Das Stream Konzept Aus Quellen lesen In Senken schreiben Serialisierung Objektzustände speichern Objektzustände wiederherstellen 13 Worum geht es nun? Das Streamkonzept Beispiel: Textdatei zeilenweise schreiben Beispiel: Textdatei zeilenweise auslesen Flexibel kombinieren um Daten zu lesen und zu speichern 14 (Praktische Informatik) Fachhochschule Lübeck Fachbereich Elektrotechnik und Informatik Seite 7

Das Stream Konzept Mit Datenströmen (englisch: data streams) bezeichnet man kontinuierliche Abfolgen von Datensätzen, deren Ende nicht im Voraus abzusehen ist. Die einzelnen Datensätze sind dabei üblicherweise von beliebigem, aber festem Typ. Die Menge der Datensätze pro Zeiteinheit (Datenrate) kann variieren. Im Gegensatz zu anderen Datenquellen werden Datenströme daher nicht als ganzes, sondern fortlaufend verarbeitet. Insbesondere ist im Gegensatz zu Datenstrukturen mit wahlfreiem Zugriff (wie z. B. Arrays) nur ein sequentieller Zugriff auf die einzelnen Datensätze möglich. Datenströme werden häufig zur Interprozesskommunikation verwendet, sowohl zur Übertragung von Daten über Netzwerke als auch zur Kommunikation zwischen Prozessen auf einem Rechner. In Java werden mit diesem Konzept auch lokale Dateien verarbeitet. Quelle: Wikipedia DE (Datenstrom) 15 Das Stream Konzept in Java Quelle: (z.b. Datei, URL, Konsoleneingabe, etc.) Sink/Spring, Bridge und Processing Streamobjekte können unter Einhaltung der Ebenen beliebig kombiniert werden. Senke: (z.b. Datei, URL, Drucker, Konsolenausgabe, etc.) Spring Stream Klassen InputStream (z.b. FileInputStream) OutputStream (z.b. FileOutputStream) Sink Stream Klassen Bridge Klassen (Um Byte in Character Streams zu wandeln) InputStreamReader (z.b. für Textdateien) OutputStreamWriter (z.b. für Textdateien) nur erforderlich wenn Character Streams verarbeitet werden Processing Klassen (Erweitern zeichen-/byteweise Verarbeitung) BufferedReader (z.b. für zeilenweise Verarbeitung von Textdateien) BufferedWriter (z.b. für zeilenweise Verarbeitung von Textdateien) Es gibt bspw. auch Klassen zum Filtern, Verschlüsseln, Komprimieren, etc. 16 (Praktische Informatik) Fachhochschule Lübeck Fachbereich Elektrotechnik und Informatik Seite 8

Die wichtigsten Methoden, die diese Klassen anbieten... InputStream int read(byte[] b) close() OutputStream write(byte[] b) flush() close() Bridge Klassen InputStreamReader und OutputStreamWriter analog (nur char statt byte) BufferedReader String readline() close() BufferedWriter write(string s) newline() flush() close() 17 Worum geht es nun? Das Streamkonzept Beispiel: Textdatei zeilenweise schreiben Beispiel: Textdatei zeilenweise auslesen Flexibel kombinieren um Daten zu lesen und zu speichern 18 (Praktische Informatik) Fachhochschule Lübeck Fachbereich Elektrotechnik und Informatik Seite 9

Beispiel: Datei zeilenweise einlesen /** * Öffnet eine Textdatei und gibt diese auf der Konsole zeilenweise aus. * Z.B. durch den Aufruf printfile("/desktop/test.txt"); * @param path Zu öffnende Datei */ public static void printfile(string path) throws Exception { InputStream is = new FileInputStream(path); // Spring Stream InputStreamReader bridge = new InputStreamReader(is); // Bridge Stream BufferedReader reader = new BufferedReader(bridge); // Processing Stream // Stream mittels Processing Stream auslesen String line = ""; while ((line = reader.readline())!= null) { System.out.println(line); // Schließen der Streams nicht vergessen reader.close(); bridge.close(); is.close(); import java.io.*; 19 Worum geht es nun? Das Streamkonzept Beispiel: Textdatei zeilenweise schreiben Beispiel: Textdatei zeilenweise auslesen Flexibel kombinieren um Daten zu lesen und zu speichern 20 (Praktische Informatik) Fachhochschule Lübeck Fachbereich Elektrotechnik und Informatik Seite 10

Beispiel: Datei zeilenweise schreiben /** * Schreibt einhundert mal "Hallo mein Name ist Hase {x" in eine Textdatei. * Z.B. durch den Aufruf writefile("/desktop/test.txt"); * @param path Pfad der Datei in die geschrieben werden soll */ public static void writefile(string path) throws Exception { OutputStream os = new FileOutputStream(path); // Sink Stream OutputStreamWriter bridge = new OutputStreamWriter(os); // Bridge Stream BufferedWriter writer = new BufferedWriter(bridge); // Writer Stream // Stream mittels Processing Stream befüllen for (int i = 1; i <= 100; i++) { writer.write("hallo mein Name ist Hase " + i + "\n"); // Schließen der Streams nicht vergessen writer.close(); bridge.close(); os.close(); import java.io.*; 21 Worum geht es nun? Das Streamkonzept Beispiel: Textdatei zeilenweise schreiben Beispiel: Textdatei zeilenweise auslesen Flexibel kombinieren um Daten zu lesen und zu speichern 22 (Praktische Informatik) Fachhochschule Lübeck Fachbereich Elektrotechnik und Informatik Seite 11

Kann man damit auch aus dem Internet lesen? Streams sind Datenströme, die aus beliebigen Datensenken und quellen entstammen können. Es müssen also nicht immer nur Dateien seien, aus denen man Daten einliest oder hinein schreibt. Sie sollen jetzt den HTML Code der Website der Fachhochschule Lübeck (http://www.fh-luebeck.de) auslesen und in einer Datei speichern. Tipp: Einen Sink Stream von einer über einer URL addresierbare Remote Quelle können Sie wie folgt erzeugen. import java.net.url; URL url = new URL( http://www.fh-luebeck.de ); InputStream i = url.openstream(); 23 Beispiel: HTML der FH-Lübeck speichern /** * Liest den Inhalt von einer Url (bspw. Webseite) und kopiert diesen in eine Datei. * Z.B. durch Aufruf von * copyfromurltofile("http://www.fh-luebeck.de", "/Users/Nane/Desktop/fhl.html"); */ public static void copyfromurltofile(string src, String to) throws Exception { URL url = new URL(src); // Diesmal bauen wir die Stream Kaskaden jeweils in einer Zeile auf BufferedReader input = new BufferedReader(new InputStreamReader(url.openStream())); BufferedWriter output = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(to) )); // Input Stream in Output Stream kopieren String line = ""; while ((line = input.readline())!= null) { output.write(line + "\n"); // Schließen der Streams nicht vergessen input.close(); output.close(); import java.io.*; import java.net.url; 24 (Praktische Informatik) Fachhochschule Lübeck Fachbereich Elektrotechnik und Informatik Seite 12

Beispiel: HTML der FH-Lübeck speichern /** * Liest den Inhalt von einer Url (bspw. Webseite) und kopiert ihn in eine Datei. * Z.B. durch Aufruf von * copyfromurltofile("http://www.fh-luebeck.de", "/Users/Nane/Desktop/fhl.html"); */ public static void copyfromurltofile(string src, String to) throws Exception { URL url = new URL(src); Was müssen wir ändern, wenn wir die Quelle auf der Konsole ausgeben wollen? // Diesmal bauen wir die Stream Kaskaden jeweils in einer Zeile auf BufferedReader input = new BufferedReader(new InputStreamReader(url.openStream())); BufferedWriter output = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(to) System.out )); // Input Stream in Output Stream kopieren String line = ""; while ((line = input.readline())!= null) { output.write(line System.out.println(line); + "\n"); Hat denselben Effekt wie... // Schließen der Streams nicht vergessen input.close(); output.close(); import java.io.*; import java.net.url; 25 Fazit: Durch die Trennung von Sink und Spring Streams (Quelle und Ziel) Bridge Streams (Zeichen oder Bytes) und Processing Streams (Inhalt) hat man sehr flexible Möglichkeiten um Datenströme definieren zu können. Das tatsächliche Speicher-, Transfer- oder Ausgabemedium kann erst sehr spät festgelegt und auch jederzeit geändert werden, ohne den Rest der Logik anpassen zu müssen J Dafür ist das einfache Öffnen und Auslesen einer Datei leider etwas komplizierter als in anderen Sprachen üblich L 26 (Praktische Informatik) Fachhochschule Lübeck Fachbereich Elektrotechnik und Informatik Seite 13

Themen dieser Unit Dateien und Verzeichnisse File Objekt Dateien/ Verzeichnisse erzeugen, löschen, umbenennen Zustände von Dateien/ Verzeichnissen abfragen I/O Streams Das Stream Konzept Aus Quellen lesen In Senken schreiben Serialisierung Objektzustände speichern Objektzustände wiederherstellen 27 (De-)serialisierung Serialisierung bezeichnet eine Abbildung von strukturierten Daten auf eine sequenzielle Darstellungsform. Serialisierung wird hauptsächlich für die Speicherung von Objektzuständen in Dateien und für die Übertragung von Objektzuständen über das Netzwerk verwendet. Hierzu wird der komplette Zustand des Objektes, inklusive aller referenzierten Objekte, in einen speicherbaren Datenstrom umgewandelt. Die Umkehrung der Serialisierung, also die Umwandlung eines Datenstroms in Objekte, wird als Deserialisierung bezeichnet. Quelle: Wikipedia DE (Serialisierung) 28 (Praktische Informatik) Fachhochschule Lübeck Fachbereich Elektrotechnik und Informatik Seite 14

(De-)serialisierung in Java In Java ist es sehr einfach Objekte zu serialisieren. Hierdurch können Objektzustände nicht nur im Hauptspeicher (also zur Laufzeit eines Programms) existieren, sondern auch persistent in Streams geschrieben, bzw. aus diesen gelesen werden. Hierzu existieren die beiden Bytestrom basierten Processing Streams ObjectInputStream ObjectOutputStream Sie lassen sich gem. der gezeigten Stream Systematik einsetzen, um Objektzustände zu speichern und wiederherstellen zu können. Alle Objekte von Klassen, die die Schnittstelle Serializable implementiert haben, lassen sich auf diese Weise persistent speichern. 29 Beispiel einer serialisierbaren Klasse public class Person implements Serializable { // Diese UID wird benoetigt, um Objekte wiederherzustellen. // Sie sollte geändert werden, wenn sich Datenfelder einer Klasse ändern. private static final long serialversionuid = -9006175784695176582L; public String vorname = ""; public String nachname = ""; public int alter; public Person(String vn, String nn, int a) { this.vorname = vn; this.nachname = nn; this.alter = a; public String tostring() { return vorname + " " + nachname + " (" + alter + ")"; 30 (Praktische Informatik) Fachhochschule Lübeck Fachbereich Elektrotechnik und Informatik Seite 15

Ausnehmen von Datenfelder aus dem Serialisierungsprozess Ggf. soll bei Objekten, nicht der komplette Objektzustand serialisiert werden (z.b. weil Passwortinformationen nicht im Klartext in Dateien gespeichert werden sollen). Dann können diese Datenfelder als transient markiert werden, um sie aus dem Serialisierungsprozess auszunehmen. Bei der Deserialisierung werden diese Datenfelder mit der Default-Initialisierung belegt. public class Person implements Serializable { public String vorname = ""; public String nachname = ""; public transient String password = ""; public int alter; [...] 31 Serialisieren von Objekten Folgender Code erzeugt 100 zufällige Personen zufälligen Alters und speichert diese in einer Datei. Random rand = new Random(); String[] vornamen = { "Maren", "Max", "Moritz", "Magda", "Momme" ; String[] nachnamen = { "Mustermann", "Musterfrau", "Mommsen", "Meier", "Müller" ; ObjectOutputStream out = new ObjectOutputStream( ); new FileOutputStream("/Users/Nane/Desktop/personen.ser") for (int i = 1; i <= 100; i++) { String vn = vornamen[rand.nextint(vornamen.length)]; String nn = nachnamen[rand.nextint(nachnamen.length)]; Person p = new Person(vn, nn, rand.nextint(100)); out.writeobject(p); out.close(); 32 (Praktische Informatik) Fachhochschule Lübeck Fachbereich Elektrotechnik und Informatik Seite 16

Deserialisieren von Objekten Folgender Code liest in einer Datei gespeicherte Personen ein und gibt diese aus. ObjectInputStream in = new ObjectInputStream( ); new FileInputStream("/Users/Nane/Desktop/personen.ser") Person p; while ((p = (Person)in.readObject())!= null) { System.out.println(p); in.close(); De-/Serialisierung funktioniert, dabei nicht nur auf Einzelobjektebene, sondern auch komplexe Objektabhängigkeiten lassen sich serialisieren. Beim Serialisieren eines Objekts werden dabei Referenzen auf Objekte rekursiv durchlaufen. Beim deserialisieren entsprechend anders herum. Zum Beispiel sind Collection Klassen in Java serializable. 33 Serialisieren von Collections Folgender Code erzeugt 100 zufällige Personen zufälligen Alters und speichert diese in einer Datei als Collection. Random rand = new Random(); String[] vornamen = { "Maren", "Max", "Moritz", "Magda", "Momme" ; String[] nachnamen = { "Mustermann", "Musterfrau", "Mommsen", "Meier", "Müller" ; ObjectOutputStream out = new ObjectOutputStream( ); new FileOutputStream("/Users/Nane/Desktop/personen.ser") List<Person> personen = new LinkedList<Person>(); for (int i = 1; i <= 100; i++) { String vn = vornamen[rand.nextint(vornamen.length)]; String nn = nachnamen[rand.nextint(nachnamen.length)]; personen.add(new Person(vn, nn, rand.nextint(100))); out.writeobject(personen); out.close(); 34 (Praktische Informatik) Fachhochschule Lübeck Fachbereich Elektrotechnik und Informatik Seite 17

Deserialisieren von Collections Folgender Code liest diese mittels einer Collection in einer Datei gespeicherten Personen ein und gibt diese aus. ObjectInputStream in = new ObjectInputStream( ); new FileInputStream("/Users/Nane/Desktop/personen.ser") List<Person> personen = (List<Person>)in.readObject(); in.close(); for (Person p : personen) { System.out.println(p); Es lassen sich somit auch komplexe Objektstrukturen sehr einfach einer Serialisierung unterwerfen. 35 Zusammenfassung File Objekt Zugriff auf das Dateisystem Erzeugen und Zugreifen auf Dateien und Verzeichnisse Streams Datenströme sequentiell erzeugen/verarbeiten Sink und Spring Streams Bridge Streams Processing Streams Flexibel kombinieren Objekte Serialisieren Schnittstelle Serializable Serialisieren (Objektzustand/Collections speichern) Deserialisierungen (Objektzustand/Collections wiederherstellen) 36 (Praktische Informatik) Fachhochschule Lübeck Fachbereich Elektrotechnik und Informatik Seite 18