Streams - Walther-Rathenau

Werbung
Ein- und Ausgabe in Java
Packet: java.io
16/05/2016
Walther-RathenauGewerbeschule
1
16/05/2016
Walther-RathenauGewerbeschule
2
Daten
Daten
Daten
Das Stream-Konzept in Java
•Ein Stream besteht aus einer
Quelle, der Daten an ein Ziel
überträgt
•Unter dem Begriff »Quelle« bzw.
»Ziel« versteht man alle möglichen
Ressourcen wie
•
Speicherpuffer,
•
Netzwerkverbindungen,
•
Tastatur,
•
Bildschirm
•
Drucker
•
usw..
16/05/2016
Walther-RathenauGewerbeschule
4
Datenströme in Java bearbeiten
• Die Java-Klassen für
Binärdaten enden mit:
•
..InputStream
..OutputStream
• Die Java-Klassen für Textdaten
enden mit:
•
..Reader
•
..Writer
Klassenhierachie
Verknüpfung von Streams
Low- und Highlevel-Streams
Dateien lesen und schreiben
Überblick
16.05.2016
Walther-RathenauGewerbeschule
8
Text-Dateien einlesen
Text-Dateien schreiben
Dateien byteweise einlesen
Dateien byteweise schreiben
Textdateien lesen und schreiben:
File(Reader|Writer)
16.05.2016
Walther-RathenauGewerbeschule
13
Zeilenweise lesen mit FileReader
16/05/2016
Walther-RathenauGewerbeschule
14
Zeilenweise schreiben mit FileWriter
16.05.2016
Walther-RathenauGewerbeschule
15
Auf einmal lesen mit FileReader
• Mit FileReader kann der Inhalt
von Textdateien auch
auf einmal gelesen werden.
Dazu wird der read()Methode ein char-Array
übergeben, in der die Zeichen
eingelesen werden.
• Problem: Ein Array benötigt bei
der Initialisierung immer eine
Länge. Die length()-Methode
der Klasse File liefert die Länge
der Datei. Allerdings muss
deren Rückgabewert vorher von
long in int umgewandelt
werden...
16/05/2016
Walther-RathenauGewerbeschule
16
In Datei schreiben mit PrintWriter
• PrintWriter eignet sich auch für
andere Zielorte wie z. B. Daten
über das Netzwerk verschicken.
Die println()-Methode erzeugt
nach jedem Schreiben
automatisch einen
Zeilenumbruch, so dass das
Senden von "\n" unnötig ist.
• Da PrintWriter aber manchmal
Daten zwischen-puffert bevor er
sie versendet, kann mittels der
flush()-Methode das Senden
erzwungen werden. Für den
Autoflush muss im Konstruktor
true angegeben werden.
16/05/2016
Walther-RathenauGewerbeschule
17
Noch bequemer lesen mit Scanner
• Scanner kann Zeichenketten in
sog. Tokens zerlegen. Mittels
einem regulären Ausdruck kann
der useDelimiter()-Methode
angegeben werden, auf welche
Weise die Daten getrennt
werden sollen. Standardmäßig
werden die Daten bei jedem
Leerzeichen getrennt. Die
readLine()-Methode arbeitet
analog wie BufferedReader.
• Außerdem kann Scanner über
viele Methoden wie nextInt(),
nextDouble() usw. automatisch
die Daten Konvertieren.
16/05/2016
Walther-RathenauGewerbeschule
Wortweise lesen
18
Aufgabe
●
Erstellen Sie eine Textdatei mit dem folgenden Inhalt:
Max;Mustermann;01.01.2000
Hans;Peter;31.03.2010
●
●
Lesen Sie anschließend die Daten aus der Datei
●
zeilenweise mit FileReader
●
auf einmal mit FileReader
●
wortweise mit Scanner
Schreiben Sie eine weitere Zeile dazu
●
mit FileWriter
●
mit PrintWriter
16.05.2016
Walther-RathenauGewerbeschule
19
Byteweise lesen und schreiben:
File(Inupt|Output)Stream
16.05.2016
Walther-RathenauGewerbeschule
20
Dateien byteweise einlesen und
schreiben
16.05.2016
Walther-RathenauGewerbeschule
21
Daten über das Netwerk:
Sockets
16.05.2016
Walther-RathenauGewerbeschule
22
Daten über das Netzwerk senden und
empfangen
cp1252 ist das Symbol
für das Windows-Latin-1Zeichensatz. D.h. die
empfangenen Daten
werden als Windows-Latin-1
interpretiert und automatisch
in UTF8 umkonvertiert
16/05/2016
Walther-RathenauGewerbeschule
23
Serialisierung von Objekten
16/05/2016
Walther-RathenauGewerbeschule
24
Serialiserung
• Java-Objekte können beliebig komplex sein. Ein Objekt kann intern aus
mehreren anderen Objekten (Objektgraph) bestehen.
• Möchte man nun ein Objekt über das Netzwerk verschicken oder in
einer Datei abspeichern, so ist u. U. ein ganzer Objektgraph derart zu
Serialiseren (“platt zu drücken”), dass später aus den serialiserten
Daten das ursprüngliche Objekt (-graph) ohne Datenverlust
rekonstruiert werden kann.
• Java bietet seit der Version 1 ein sehr einfaches Verfahren an, um
Objekte zu Serialiseren bzw. zu Deserialiseren.
• Die zwei Klassen die dazu benötigt werden sind:
•
java.io.ObjectOutputStream.
•
java.io.ObjectInputStream
16/05/2016
Walther-RathenauGewerbeschule
25
Serialiserung
16/05/2016
Walther-RathenauGewerbeschule
26
Serialiserung
• Serialisierbare Klassen müssen das leere Interface Serializable
implementieren.
• Ein (Pferd-)-Objekt wird mittels der writeObject-Methode eines
ObjectOutputStreams serialisiert.
• ObjectOutputStreams benötigt ein OutputStream als Ziel.
FileOutputStream wird für Serialisierung in Dateien verwendet.
Es können an dieser Stelle auch beliebig andere OutputStream's, die
Beispielsweise Ziele über das Netzwerk repräsentieren, verwendet
werden.
• Die readObject()-Methode der Klasse ObjectInputStream
de-serialisiert die empfangenen Daten wieder in Java-Objekte.
Auch ObjectInputStream ist eine sog. High-Level-Klasse. Sie kann
die Daten nur über übergebenenes InputStream (wie
FileInputStream) lesen.
16/05/2016
Walther-RathenauGewerbeschule
27
Objektgraph
Die Klasse Halter muss das leere
Interface Serializable implementieren.
16/05/2016
Walther-RathenauGewerbeschule
28
Objektgraph
16/05/2016
Walther-RathenauGewerbeschule
29
Objektgraph Serialisieren
• Ein Objekt einer Klasse kann nur dann serialisiert werden, wenn
sowohl die Klasse selbst als auch alle direkten und indirekten
Klassen, mit denen die Klasse in Beziehung steht, das SerializableInterface implementiert haben.
• Falls man nicht den Sourcecode einer Klasse heran kommt, um
nachträglich das Serializable-Interface zu implementieren, so kann
man am einfachsten eine neue Klasse von der nicht serialisierbaren
Klasse erben lassen, die neue Klasse als Serializable markieren und
statt der nicht serialisierbaren Superklasse verwenden.
16/05/2016
Walther-RathenauGewerbeschule
30
Herunterladen