Ein- und Ausgabe Einführung in Java Folie 1 von 14 12. Mai 2011 Ivo Kronenberg Inhalt • Byte Streams • Character Streams • Buffern von Streams • Verketten von Streams • Streams für Konsole • Objekt-Serialisierung Ein- und Ausgabe | Ivo Kronenberg 12. Mai 2011 Folie 2 von 14 I/O Stream • Repräsentation einer Datenquelle oder Datensenke. • Unterstützung verschiedener Typen: – – – – • Unterstützung verschiedener Formate: – – – – • Dateien Geräte Andere Programme Memorydaten Bytes Primitive Datentypen Objekte Lokalisierte Texte Datenstrom ist eine Datensequenz Ein- und Ausgabe | Ivo Kronenberg 12. Mai 2011 Folie 3 von 14 Byte Streams • Basisklasse für alle Streams: – InputStream – OutputStream • Arbeiten mit den verschiedene Streams ist immer ähnlich. Lediglich Konstruktion variiert. • Dateizugriff: – FileInputStream – FileOutputStream Ein- und Ausgabe | Ivo Kronenberg 12. Mai 2011 Folie 4 von 14 Beispiel: Kopieren von Datei import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; Exception von Streams public class CopyBytes { public static void main(String[] args) throws IOException { FileInputStream in = null; FileOutputStream out = null; try { in = new FileInputStream("xanadu.txt"); Konstruktion der Streams out = new FileOutputStream("outagain.txt"); int c; while ((c = in.read()) != -1) { -1 = Ende Stream out.write(c); } } finally { if (in != null) { in.close(); } Schliessen der Streams if (out != null) { out.close(); } } } } Ein- und Ausgabe | Ivo Kronenberg 12. Mai 2011 Folie 5 von 14 Character Streams • Automatische Konversion von Encoding der Quelle / Senke nach Unicode (Java) Java Unicode • Konverter Datei ASCII Alle Charakter Ströme erweitern Klassen – Reader – Writer • Intern basieren Character Streams auf Byte Streams. Ein- und Ausgabe | Ivo Kronenberg 12. Mai 2011 Folie 6 von 14 Beispiel: Zeilen kopieren import java.io.FileReader; import java.io.FileWriter; import java.io.BufferedReader; import java.io.PrintWriter; import java.io.IOException; public class CopyLines { public static void main(String[] args) throws IOException { BufferedReader is = null; PrintWriter os = null; try { is = new BufferedReader(new FileReader(„…")); os = new PrintWriter(new FileWriter(„…")); String l; while ((l = is.readLine()) != null) { os.println(l); } } finally { if (is != null) { is.close(); } if (os!= null) { os.close(); } } } } Ein- und Ausgabe | Ivo Kronenberg Buffered Character Streams 12. Mai 2011 Folie 7 von 14 Buffern von Streams • Reduktion von vielen feingranularen Zugriffen auf Dantenquelle bzw. Datensenke. • Gewinn von Performance. • Buffern von Byte Streams: – in = new BufferedInputStream(new FileInputStream(„..“)) – out = new BufferedOutputStream(new FileOutputStream(„…“)) • Bufferen von Character Stream: – inputStream = new BufferedReader(new FileReader(„…")); – outputStream = new BufferedWriter(new FileWriter(„…")); • Flush Methode auf OutputStream nur effektiv für gebufferte Streams. • Flush erlaubt das explizite niederschreiben der Daten. Ein- und Ausgabe | Ivo Kronenberg 12. Mai 2011 Folie 8 von 14 Verketten von Streams • Streams können verkettet werden. • Reihenfolge der Verkettung ist für Verhalten entscheidend. • Typische Anwendung ist das Buffern. • Verkettung geschieht bei Konstruktion. new BufferedInputStream(new FileInputStream(„..“)) Ein- und Ausgabe | Ivo Kronenberg 12. Mai 2011 Folie 9 von 14 Stream Klassen Eingabe Byte InputStream ByteArrayInputStream ByteArrayOutputStream Obj ectInputStream Obj ectOutputStream PipedInputStream PipedOutputStream FileOutputStream FileInputStream FilterInputStream FilterOutputStream BufferedInputStream BufferedOutputStream Writer Reader CharArrayReader InputStreamReader Character Ausgabe OutputStream CharArrayWriter OutputStreamWriter StringReader StringWriter PipedReader PipedWriter FilterReader FilterWriter BufferedReader BufferedWriter Ein- und Ausgabe | Ivo Kronenberg PrintWriter 12. Mai 2011 Folie 10 von 14 Stream Typen Quelle Byte Character File FileInputStream FileOutputStream ByteArrayInputStream ByteArrayOutputStrea m FileReader FileWriter CharArrayReader CharArrayWriter Array String Pipe PipedInputStream PipedOutputStream StringReader StringWriter PipedReader PipedWriter • Pipe: Datenaustausch mittels Pipes zwischen Threads • Array: In Memory Daten Ein- und Ausgabe | Ivo Kronenberg 12. Mai 2011 Folie 11 von 14 I/O in Konsole • Datenströme Konsole nicht einheitlich: – System.out // PrintStream – System.in // InputStream – System.err // PrintStream • Einlesen von Zeile über Konsole: BufferedReader cin = new BufferedReader(new InputStreamReader(System.in)); String line = cin.readLine(); Ein- und Ausgabe | Ivo Kronenberg 12. Mai 2011 Folie 12 von 14 Objekt-Serialisierung • Status von Objekt persistieren (Datenelemente). • Persistierbare Klasse muss Marker Interface java.io.Serializable implementieren. • Persistiereung mittels ObjectOutputStream und ObjectInputStream. • Persisiterung in binärem (Datei-) Format. • Versionierung mittels serialVersionUID. • Reihenfolge Datenelemente entscheidend. Ein- und Ausgabe | Ivo Kronenberg 12. Mai 2011 Folie 13 von 14 Beispiel Objekt-Serialisierung import java.io.*; import java.util.*; Serialisierbares class Message implements Serializable { Objekt Date time = new Date(); String text; } class PostIt { public static void main(String[] args) throws Exception { Message msg = new Message(); ObjectOutputStream out; try { out = new ObjectOutputStream( new FileOutputStream(„message.ser“)); out.writeObject(msg); Objekt schreiben } finally { if(out != null) { out.close(); } } } } Ein- und Ausgabe | Ivo Kronenberg 12. Mai 2011 Folie 14 von 14