Programmieren I Input / Output (I/O) Heusch 2. Bd. Ratz 19 Institut für Angewandte Informatik KIT – Die Forschungsuniversität in der Helmholtz-Gemeinschaft www.kit.edu Ein- und Ausgabe über Streams (1) Sämtliche Ein- und Ausgaben in Java laufen über (Daten-) Ströme (engl. Streams) ab Ein (Daten-)Strom ist eine Verbindung zwischen einem Programm und einer Datenquelle bzw. einem Datenziel. Diese Verbindung (der Strom) läuft dabei stets nur in einer Richtung (uni-direktional) Ein Strom kann an dem einem Ende Daten nur aufnehmen und am anderen Ende nur wieder abgeben 2 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Ein- und Ausgabe über Streams (2) Für Eingaben muss ein Programm zunächst einen mit der Datenquelle verbundenen Strom öffnen die ankommenden Informationen dann sequentiell lesen und nach seiner Verwendung den Strom wieder schließen Für Ausgaben gilt das Entsprechende mit einer Datensenke Java stellt zahlreiche Klassen zur Verarbeitung verschiedenartiger Datenströme bereit, die sich auch kombinieren lassen 3 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Das Input- und Outputsystem von Java Für Ein- und Ausgabe-Ströme hat Java vier Basisklassen: InputStream und OutputStream Reader und Writer InputStream und OutputStream unterstützen das Lesen und Schreiben von Bytes. Reader und Writer unterstützen das Lesen und Schreiben von Zeichen. Durch import java.io.*; werden diese Klassen eingebunden. 4 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Input und Output: Typen Input kann aus verschiedenen Quellen kommen. Solche Quellen können sein: Array von Bytes Zeichenkette Datei Pipe Andere Quellen, wie z.B. Netzwerk-, insb. Internet-Verbindungen (z.B. aus dem Package java.net) java.net.URLConnection mit Methode InputStream getInputStream() 5 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Input und Output: Typen von InputStreams Für diese verschiedenen Quellen gibt es Unterklassen von InputStream, die für diese Quellen erstellt wurden: ByteArrayInputStream Einlesen aus einem Puffer im Speicher. StringBufferInputStream Deprecated Wandelt einen String in einen Inputstream. FileInputStream Einlesen aus einer Datei. PipedInputStream Liest Daten, die durch PipedOutputStream erzeugt wurden. 6 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Input und Output: Typen von OutputStreams Für verschiedenen Senken gibt es Unterklassen von OutputStream, die für diese Senken erstellt wurden. Output kann in verschiedene Senken fließen. Solche Senken können sein: Array von Bytes Datei Pipe andere Senken, wie z.B. Internet-Verbindungen (z.B. aus dem Package java.net) java.net.URLConnection mit Methode OutputStream getOutputStream() 7 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Input und Output: Typen von OutputStream (2) ByteArrayOutputStream Ausgabe in einen Puffer im Speicher. FileOutputStream Schreiben in eine Datei. PipedOutputStream Schreibt Daten, die durch PipedInputStream gelesen werden können. Echt Schade! Dieser wirklich amüsante Beitrag darf nach den Regelungen zur elektronischen Bereitstellung von Schriftwerken für Lehre und Forschung ab dem 1.1.2017 nicht mehr angezeigt werden. Ein Witz… 8 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Input und Output: Reader und Writer Die Klassen InputStream und OutputStream sind die Basisklassen für das Lesen und Schreiben von ByteStreams. Die Klassen Reader und Writer sind zu InputStream und OutputStream identisch, allerdings Lesen und Schreiben diese beiden Klassen Zeichen (statt Bytes). Ebenso sind alle Unterklassen jeweils (mehr oder weniger) identisch. 9 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Input und Output: Beispiel (1) Anlegen eines ByteArrayInputStreams: import java.io.*; public class IODemo { public static void main(String args[]) throws IOException { byte buffer[] = new byte[80]; int test; for (int i = 0; i < buffer.length; i++){ buffer[i] = (byte) (i + 1); // Fülle buffer } InputStream s = new ByteArrayInputStream(buffer); // Testweise Lesen der ersten 10 Bytes for (int i = 0; i < 10; i++) { test = s.read(); System.out.println("Read: " + test); } s.close(); Kein Exception} Handling! } 10 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Input und Output: Beispiel (2) Mit teilweisem Exception-Handling: import java.io.*; public class IODemo { public static void main(String args[]) throws IOException { byte buffer[] = new byte[80]; int test; Verursacht for (int i = 0; i < buffer.length; i++) s.close() eine buffer[i] = (byte) (i + 1); // Fülle buffer IOException, InputStream s = new ByteArrayInputStream(buffer); wird diese „nach // Testweise Lesen der ersten 10 Bytes außen“ geworfen. try { for (int i = 0; i < 10; i++) { test = s.read(); System.out.println("Read: " + test); } } catch (IOException e) { System.err.println("IO Error!"); } finally { s.close(); } } Nur teilweises } Exception-Handling! 11 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Die Methoden von InputStream (1) int available() Liefert die Anzahl der Bytes, die gelesen oder übersprungen werden können ohne den nächsten Aufruf einer Methode dieses InputStreams zu blockieren. void close() Schließt diesen InputStream und gibt die von ihm belegten Ressourcen frei. void mark(int readlimit) Markiert die aktuelle Position in diesem InputStream. boolean markSupported() true, wenn dieser InputStream die Methoden mark und reset unterstützt. 12 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Die Methoden von InputStream (2) int read() Liest das nächste Byte von diesem InputStream. int read(byte[] b) Liest eine Anzahl von Bytes vom InputStream und schreibt sie in den Puffer b. int read(byte[] b, int off, int len) Liest len Bytes von diesem InputStream in ein ByteArray b ab dem Index off. void reset() Setzt die Leseposition dieses InputStreams wieder an die zuletzt mit der Methode mark() gekennzeichnete Stelle. long skip(long n) Überliest n Bytes dieses InputStreams. 13 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Lesen und Schreiben eines Puffers import java.io.*; public class IODemo { public static void main(String args[]) throws IOException { byte[] inBuf = new byte[10]; byte[] outBuf = new byte[8]; for (int i = 0; i < inBuf.length; i++) inBuf[i] = (byte) (i + 1); // Fülle inBuf InputStream inStream = new ByteArrayInputStream(inBuf); // Lesen von inBuf und Schreiben auf outBuf try { inStream.read(outBuf); } catch (IOException ex) { System.err.println("IO Error!"); } finally { Nur teilweises inStream.close(); Exception-Handling! } // Test durch Ausgabe von outBuf for (int i = 0; i < outBuf.length; i++) { System.out.println("outBuf[" + i + "] = " + outBuf[i]); // nur 8! } } } 14 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Die Methoden von OutputStream void write(int b) Schreibt das übergebene Byte auf diesen OutputStream. void write(byte[] b) Schreibt b.length Bytes vom Array b auf diesen OutputStream. void write(byte[] b, int offset, int len) Schreibt len Bytes vom Array b beginnend an Position offset auf diesen OutputStream. void flush() “Spült“ diesen OutputStream und schreibt alle evtl. gepufferten Inhalte. void close() Schließt diesen OutputStream und gibt die von ihm belegten Ressourcen frei. 15 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Beispiel „Lesen aus einem File“ import java.io.*; public class FileDemo { public static void main(String args[]) throws IOException { int in = 0; InputStream inStream = new FileInputStream("tmp1"); in = inStream.read(); inStream.close(); System.out.println("Test = " + in); } } Kein ExceptionHandling! 16 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Beispiel „Schreiben eines Files (zeichenbasiert)“ import java.io.*; public class FileDemo { public static void main(String args[]) { String filename = "test.txt"; try { Writer fWriter = new FileWriter(filename); fWriter.write("Testline\n"); fWriter.write("Second line\n"); fWriter.close(); } catch (IOException ex) { ex.printStackTrace(); } } } 17 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Beispiel „Schreiben und Lesen eines Files“ import java.io.*; public class FileDemo { public static void main(String args[]) { String filename = "test.txt"; try { Writer fWriter = new FileWriter(filename); fWriter.write("Testline\n"); fWriter.write("Second line\n"); fWriter.close(); } catch (IOException ex) { ex.printStackTrace(); } try { Reader fReader = new FileReader(filename); char i = (char)fReader.read(); System.out.println("Read: " + i); fReader.close(); } catch (IOException ex) { ex.printStackTrace(); } } } 18 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Die Klasse File „File“ sollte als (abstrakter) Pfadname verstanden werden. Es kann sich dabei um (existierende und nicht existierende) Verzeichnisse und Dateien handeln. Einige Konstruktoren der Klasse sind: File(File parent, String child) Erzeugt ein neues File von einem File-Objekt und einem neuen abstrakten Pfadnamen. File(String pathname) Erzeugt ein neues File durch Konvertierung des String in einen abstrakten Pfadnamen. File(String parent, String child) Erzeugt ein neues File durch Konvertierung einer Vater-Strings und eines Kind-Strings in einen Pfadnamen. Beispiel: 19 File test = new File("tmp1"); W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Methoden der Klasse File (1) boolean canRead() Testet, ob die Anwendung von dieser Datei lesen darf. boolean canWrite() Testet, ob die Anwendung in diese Datei schreiben darf. int compareTo(File pathname) Vergleicht zwei Pfadnamen lexikographisch. int compareTo(Object o) Vergleicht diesen Pfadnamen mit einem anderen Objekt. boolean createNewFile() Erzeugt eine neue, leere Datei genau dann, wenn diese Datei noch nicht existiert. Im Erfolgsfall wird true geliefert. boolean delete() Löscht die Datei bzw. das Verzeichnis. 20 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Methoden der Klasse File (2) boolean equals(Object obj) Testet den Pfad und das übergebene Objekt auf Gleichheit. boolean exists() Testet, ob eine Datei unter diesem Pfadnamen existiert. File getAbsoluteFile(),getCanonicalFile() Liefert die absolute/kanonische Form des Pfadnamens. String getAbsolutePath(),getCanonicalPath() Liefert die absolute/kanonische Form des Pfadnamens. String getName() Liefert den durch den Pfadnamen definierten Namen der Datei bzw. des Verzeichnisses. 21 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Methoden der Klasse File (3) String getParent() Liefert den Pfadnamen des „Vater-“Verzeichnisses als String oder null, wenn es kein solches gibt. File getParentFile() Liefert den Pfadnamen des „Vater-“Verzeichnisses oder null, wenn es kein solches gibt. long getFreeSpace(), getTotalSpace(), getUsableSpace() Liefert die Anzahl unbelegter/aller/aller nutzbarer Bytes der Partition, in der sich das File befindet. String getPath() Konvertiert diesen Pfadnamen in einen String. boolean isAbsolute() Testet ob der Pfadname absolut ist. 22 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Methoden der Klasse File (4) boolean isDirectory() Testet ob es sich bei diesem Pfadnamen um ein Verzeichnis handelt. boolean isFile() Testet ob es sich bei diesem Pfadnamen um eine normale Datei handelt. boolean isHidden() Testet ob es sich bei diesem Pfadnamen um eine versteckte Datei handelt. long lastModified() Liefert die Zeit, zu welcher diese Datei zuletzt geändert wurde. 23 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Methoden der Klasse File (5) long length() Liefert die Länge dieser Datei. String[] list() Liefert ein Array von Strings mit den Dateien und Verzeichnissen in diesem Verzeichnis (natürlich nur, wenn es sich um eines handelt). String[] list(FilenameFilter filter) Liefert ein Array von Strings mit den Dateien und Verzeichnissen in diesem Verzeichnis (natürlich nur, wenn es sich um eines handelt) welche dem Filter entsprechen. boolean mkdir() Erzeugt ein neues Verzeichnis mit diesem Pfadnamen. 24 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Methoden der Klasse File (6) boolean mkdirs() Erzeugt ein neues Verzeichnis mit diesem Pfadnamen inklusive aller nichtexistierenden und notwendigen „VaterVerzeichnisse“. boolean renameTo(File dest) Benennt diese Datei in den angegebenen Pfadnamen um. boolean setLastModified(long time) Setzt das die „last-modified“-Zeit für diesen Pfadnamen. boolean setReadOnly() Markiert diese Datei mit dem „nur Lesen“-Attribut, so dass für sie nur noch Lese-Operationen erlaubt sind. 25 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Methoden der Klasse File (7) boolean setReadable(boolean readable) boolean setReadable(boolean readable, boolean ownerOnly) Setzt die Attribute für Leserechte. Ebenso: setWritable, setExecutable. String toString() Liefert den Pfadnamen als String. URI toURI() // früher: toURL() @deprecated! Konvertiert diesen Pfadnamen in eine URI. static File[] listRoots() Listet alle verfügbaren Wurzeln des Dateisystems. 26 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Beispiel „Erzeugen eines Verzeichnisses und eines Files“ import java.io.*; public class FileIO { public static void main(String args[]) { File testDir = new File("/tmp/testDir"); testDir.mkdir(); File testFile = new File(testDir, "testFile"); try { testFile.createNewFile(); } catch (IOException ex) { ex.printStackTrace(); } } } 27 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Beispiel: Schreiben eines Files import java.io.*; public class FileIO { public static void main(String args[]) { File testDir = new File("/tmp/testDir"); testDir.mkdir(); File testFile = new File(testDir, "testFile"); try { testFile.createNewFile(); } catch (IOException ex) { ex.printStackTrace(); } try { Writer fWriter = new FileWriter(testFile); fWriter.write("Testline\n"); fWriter.write("Second line\n"); fWriter.close(); } catch (IOException e ) { e.printStackTrace(); } } } 28 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Beispiel: Schreiben und Lesen eines Files import java.io.*; public class FileIO { public static void main(String args[]) { File testDir = new File("/tmp/testDir"); testDir.mkdir(); File testFile = new File(testDir, "testFile"); try { testFile.createNewFile(); } catch (IOException ex) { ex.printStackTrace(); } try { Writer fWriter = new FileWriter(testFile); fWriter.write("Testline\n"); fWriter.write("Second line\n"); fWriter.close(); } catch (IOException e ) { e.printStackTrace(); } try { BufferedReader br = new BufferedReader(new FileReader(testFile)); while (br.ready()){ String s = br.readLine(); System.out.println("Read: " + s); } br.close(); } catch (IOException e ) { e.printStackTrace(); } } } 29 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Beispiel: Schreiben mit DataOutputStream import java.io.*; public class FileDataOut { Kein ExceptionHandling! public static void main(String args[]) throws IOException { DataOutputStream out = new DataOutputStream(new FileOutputStream("tmp1")); Polynom p = new Polynom(1, 0, 1); for (double x = -3.0; x <= 3.0; x += 0.5) { out.writeDouble(x); out.writeDouble(p.f(x)); } out.close(); } } Das Ergebnis steht als Bytestream in der Datei tmp1. Diese Datei ist mit einem Editor nicht lesbar. 30 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Beispiel: Alternatives Lesen DataInputStream import java.io.*; public class FileDataIn { public static void main(String args[]) throws IOException { DataInputStream in = new DataInputStream(new FileInputStream("tmp1")); double x,y; boolean eof = false; while ( !eof ){ try { x = in.readDouble(); y = in.readDouble(); EOFException System.out.println(x+";"+y); bewusst als } catch (EOFException e) { Abbruchkriterium eof = true; } verwenden. } in.close(); } Nur teilweises } Exception-Handling! 31 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Ergebnis des Beispiels Ausgabe -3.0;10.0 -2.5;7.25 -2.0;5.0 -1.5;3.25 -1.0;2.0 -0.5;1.25 0.0;1.0 0.5;1.25 1.0;2.0 1.5;3.25 2.0;5.0 2.5;7.25 3.0;10.0 32 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Echt Schade! Dieser wirklich amüsante Beitrag darf nach den Regelungen zur elektronischen Bereitstellung von Schriftwerken für Lehre und Forschung ab dem 1.1.2017 nicht mehr angezeigt werden. Ein Witz… Institut für Angewandte Informatik Beispiel: Schreiben mit FileWriter import java.io.*; public class FileWriteOut { public static void main(String[] args) throws IOException { FileWriter out = new FileWriter("tmp2"); Polynom p = new Polynom(1, 0, 1); for (double x = -3.0; x <= 3.0; x += 0.5) { String str = x + " " + p.f(x) + "\n"; out.write(str); } out.close(); } } Das Ergebnis steht als Folge von Characters in der Datei tmp2. Die Datei ist mit einem Editor lesbar. 33 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Kein ExceptionHandling! Institut für Angewandte Informatik Beispiel: Lesen mit BufferedReader (1) import java.io.*; public class FileReadIn { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new FileReader("tmp2")); try { while (br.ready()) { String line = br.readLine(); System.out.println(line); } } catch (IOException e) { // error } finally { br.close(); } } Nur teilweises Exception-Handling! } 34 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Beispiel: Lesen mit BufferedReader (2) Normalerweise werden die gelesenen Daten zur weiteren Verarbeitung natürlich in einer Datenstruktur gespeichert, z.B.: import java.util.ArrayList; // fertige Datenstruktur // ... ArrayList lines = new ArrayList(); try { while (br.ready()) { String line = br.readLine(); lines.add(line); } } catch (IOException e) { // error } // ... Die String-Daten müssen nun noch „ausgepackt“ werden. 35 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Klasse DataInputStream (1) Vererbungshierarchie: java.lang.Object | +--java.io.InputStream | +--java.io.FilterInputStream | +--java.io.DataInputStream public class DataInputStream extends FilterInputStream implements DataInput Konstruktor: DataInputStream(InputStream in) 36 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Klasse DataInputStream (2) - Methoden int read(byte[] b) int read(byte[] b, int off, int len) boolean readBoolean() byte readByte() char readChar() double readDouble() float readFloat() void readFully(byte[] b) void readFully(byte[] b, int off, int len) int readInt() 37 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Klasse DataInputStream (3) - Methoden String readLine() // @deprecated // Benutze BufferedReader long readLong() short readShort() int readUnsignedByte() int readUnsignedShort() String readUTF() static String readUTF(DataInput in) int skipBytes(int n) 38 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Klasse DataOutputStream (1) Vererbungshierarchie: java.lang.Object | +--java.io.OutputStream | +--java.io.FilterOutputStream | +--java.io.DataOutputStream public class DataOutputStream extends FilterOutputStream implements DataOutput Konstruktor: DataOutputStream(OutputStream out) 39 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Klasse DataOutputStream (2) - Methoden void flush() int size() void write(byte[] b, int off, int len) void write(int b) void writeBoolean(boolean v) void writeByte(int v) void writeBytes(String s) void writeChar(int v) void writeChars(String s) 40 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Klasse DataOutputStream (3) - Methoden void void void void void void 41 writeDouble(double v) writeFloat(float v) writeInt(int v) writeLong(long v) writeShort(int v) writeUTF(String str) W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Klasse BufferedReader (1) Vererbungshierarchie: java.lang.Object | +--java.io.Reader | +--java.io.BufferedReader Konstruktoren: BufferedReader(Reader in) BufferedReader(Reader in, int sz) sz gibt die Größe des Eingabepuffers vor. 42 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Klasse BufferedReader (2) - Methoden void close() void mark(int readAheadLimit) boolean markSupported() int read() int read(char[] cbuf, int off, int len) String readLine() boolean ready() void reset() long skip(long n) 43 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Typen von InputStreams und Readern (1) Zum Öffnen ByteArrayInputStream FileInputStream PipedInputStream BufferedInputStream DataInputStream FilterInputStream SequenceInputStream CharArrayReader FileReader PipedReader BufferedReader InputStreamReader FilterReader LineNumberReader StringReader Typisch: 44 Höherwertige Funktionen FileReader fr = new FileReader("test.txt"); BufferedReader br = new BufferedReader(fr); W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Typen von InputStreams und Readern (2) Öffnen read() FileReader fr = new FileReader("test.txt"); fr.read(); Öffnen read() Höherwertige Funktionen readLine() FileReader fr = new FileReader("test.txt"); BufferedReader br = new BufferedReader(fr); br.readLine(); 45 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Interfaces von java.io Closable // close() DataInput DataOutput Externalizable FileFilter // boolean accept(File pathname) FilenameFilter Flushable // flush() ObjectInput // Object readObject() ObjectInputValidation ObjectOutput // writeObject(Object obj) ObjectStreamConstants Stand: Java 1.8 Serializable 46 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Klassen von java.io (1) BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter Console DataInputStream DataOutputStream 47 W. Geiger, W. Süß, T. Schlachter, C. Schmitt // String readLine() // String readLine() Stand: Java 1.8 Institut für Angewandte Informatik Klassen von java.io (2) File FileDescriptor FileInputStream FileOutputStream FilePermission FileReader FileWriter FilterInputStream FilterOutputStream FilterReader FilterWriter InputStream InputStreamReader LineNumberInputStream 48 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Echt Schade! Dieser wirklich amüsante Beitrag darf nach den Regelungen zur elektronischen Bereitstellung von Schriftwerken für Lehre und Forschung ab dem 1.1.2017 nicht mehr angezeigt werden. Ein Witz… Stand: Java 1.8 // @deprecated Institut für Angewandte Informatik Klassen von java.io (3) LineNumberReader ObjectInputStream ObjectInputStream.GetField ObjectOutputStream ObjectOutputStream.PutField ObjectStreamClass ObjectStreamField OutputStream OutputStreamWriter PipedInputStream PipedOutputStream PipedReader PipedWriter Writer 49 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Stand: Java 1.8 Institut für Angewandte Informatik Klassen von java.io (4) PrintStream PrintWriter PushbackInputStream PushbackReader RandomAccessFile Reader SequenceInputStream SerializablePermission StreamTokenizer StringBufferInputStream StringReader StringWriter 50 W. Geiger, W. Süß, T. Schlachter, C. Schmitt // print, println, printf // print, println, printf // Lesen und Schreiben! // Liest Datei im C++-Stil // @deprecated Stand: Java 1.8 Institut für Angewandte Informatik Exceptions in java.io CharConversionException EOFException FileNotFoundException InterruptedIOException InvalidClassException InvalidObjectException IOException NotActiveException NotSerializableException ObjectStreamException OptionalDataException StreamCorruptedException SyncFailedException UncheckedIOException UnsupportedEncodingException UTFDataFormatException WriteAbortedException Möglicher Error: IOError (für schwerwiegende Ausnahmesituationen) Stand: Java 1.8 51 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Anmerkung: Das Paket java.nio Erweiterung der I/O-Funktionalität um: Reguläre Ausdrücke Memory-mapped I/O und Datei-Locks Zeichen-Codierer und -Decodierer Konvertierung zwischen (externen) Bytes und internen (UTF16/Unicode) Zeichen Puffer und Kanäle (Buffers, Channels) Neue I/O-Abstraktion: Pufferbasierte I/O I/O-Multiplexing / asynchrone I/O (Selector) Ereignis-orientierte I/O Im Rahmen dieser Vorlesung beschränken wir uns auf java.io 52 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Erweiterungen ab Java 1.7 Erweiterungen an java.lang.Throwable schließen die Ressourcen nach dem try-Block automatisch und unterdrücken eventuell aufgetretene Exceptions („try-with-resources“). Es lassen sich eine oder mehrere Ressourcen gleichzeitig im try-Block deklarieren. try ( InputStream fis = new FileInputStream(source); OutputStream fos = new FileOutputStream(target) ){ // Lesen und Schreiben } // Ressourcen werden automatisch geschlossen Ab Java 1.7 53 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Direkter Vergleich: Vollständiges ExceptionHandling ohne und mit try-with-resources InputStream in = null; try { in = new FileInputStream("a.txt"); // IO-Operationen } catch (IOException e) { e.printStackTrace(); } finally { try { if ( in != null ){ in.close(); } } catch (IOException e){ /* ... */ } } try (InputStream in = new FileInputStream("a.txt")){ // IO-Operationen } catch (IOException e) { e.printStackTrace(); } 54 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Bis Java 1.6 Ab Java 1.7 Institut für Angewandte Informatik Anmerkung zu Carriage Return und Line Feed (CRLF) Zeilentrenner werden in Unix/Linux, Windows und MacOS unterschiedlich behandelt. Unix/Linux Windows MacOS \n \r\n \r Stattdessen besser verwenden : String newLine = System.lineSeparator(); Liefert das/die systemabhängige/n NewLine-Zeichen Andere Möglichkeit: Klasse PrintWriter (oder PrintStream) verwenden PrintWriter pw = new PrintWriter(new FileWriter(file)); for (int i = 0; i < buffer.length; i++) { pw.println(buffer[i]); } pw.close(); 55 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik Ausgabe in Datei oder System.out PrintStream ps; boolean fileOutput = true; // ... if (fileOutput) { // Ausgabe in Datei ps = new PrintStream(new FileOutputStream(outfile)); } else { // Ausgabe nach System.out ps = System.out; } // Nun die Ausgabe für beide Fälle ps.println("Just a test..."); 56 W. Geiger, W. Süß, T. Schlachter, C. Schmitt Institut für Angewandte Informatik