Input / Output - KIT

Werbung
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
Herunterladen