© 2005 Pohlig - Taulien Datenströme Datenströme GK Informatik 1 © 2005 Pohlig - Taulien Ausgabe in eine Datei Das Schreiben in eine Datei kann man sich in drei Schritte aufgeteilt vorstellen: • Erzeuge eine FileOutputStream-Objekt und übergib ihm dabei den Namen der Datei als ein String-Objekt. • Erzeuge ein PrintWriter-Objekt und übergib ihm dabei das soeben erzeugte FileOutputStreamObjekt. • Benutze die Objekt-Methode println(String text) der Klasse PrintWriter, um eine Zeichenkette 'auf einen Rutsch' in die Datei zu schreiben und schließe das PrintWriter-Objekt. Datenströme GK Informatik 2 © 2005 Pohlig - Taulien Ausgabe in eine Datei Der letzte Schritt etwas genauer: println(String text) übergibt eine ganze Zeichenkette an das FileOutputStream-Objekt. Das Auslesen aus dieser Ausgabe-Pipeline und Schreiben in die Datei schließlich, leistet das Betriebssystem. Datenströme GK Informatik 3 © 2005 Pohlig - Taulien Ausgabe in eine Datei Ein Programm-Fragment: ... String dateiName = "Test.txt"; FileOutputStream speicherStrom = new FileOutputStream(dateiName); PrintWriter schreibeStrom = new PrintWriter(speicherStrom); schreibeStrom.println(text); schreibeStrom.close(); ... Datenströme GK Informatik 4 © 2005 Pohlig - Taulien Ausgabe auf den Bildschirm Objekte der Klasse PrintWriter kann man z.B. auch dazu benutzen, Daten an einen Bildschirm zu senden: • Erzeuge ein PrintWriter-Objekt und übergib ihm dabei den Standard-Ausgabestrom System.out. • Benutze die Objekt-Methode println(String text) der Klasse PrintWriter, um eine Zeichenkette 'auf einen Rutsch' auf den Bildschirm zu schreiben und schließe das PrintWriter-Objekt. Datenströme GK Informatik 5 © 2005 Pohlig - Taulien Ausgabe in eine Datei und auf den Bildschirm import java.io.*; public class Ausgaben { public static void main (String[] args) throws IOException { String text = "Java ist toll!"; String dateiName = "Test.txt"; FileOutputStream speicherStrom = new FileOutputStream(dateiName); PrintWriter schreibeStrom1 = new PrintWriter(speicherStrom); schreibeStrom1.println(text); schreibeStrom1.close(); PrintWriter schreibeStrom2 = new PrintWriter(System.out); schreibeStrom2.println(text); schreibeStrom2.close(); } } Datenströme GK Informatik 6 © 2005 Pohlig - Taulien PrintWriter Dem Konstruktor von PrintWriter kann sowohl eine Instanz von FileOutputStream als auch von PrintStream übergeben werden: Beide Klassen sind von OutputStream abgeleitet: Ein FileOutputStream-Objekt ist auch ein OutputStream-Objekt. Ein PrintStream-Objekt ist auch ein FilterOutputStream-Objekt und auch ein OutputStream-Objekt. Datenströme GK Informatik 7 © 2005 Pohlig - Taulien OutputStream-Objekte Die Kapselung der Daten in ein FileOutputStream- bzw. in ein PrintStream-Objekt erlaubt einen komfortablen Umgang mit Daten-Strömen. Java-Programm Grafisch lässt sich das so darstellen: OutputStream-Objekte PrintWriterObjekt System.out Bildschirm PrintWriterObjekt FileOutputStreamObjekt Festplatte Übernimmt das Betriebsystem Datenströme GK Informatik 8 © 2005 Pohlig - Taulien Lesen aus einer Datei Das Lesen aus einer Datei kann man sich in zwei Schritte aufgeteilt vorstellen: • Ein BufferedReader-Objekt liest aus einer Eingabe-Pipeline. • Die Methode readLine() aus dieser Klasse liest aus der Pipeline den ganzen Inhalt und übergibt ihn Java als Zeichenkette. Datenströme GK Informatik 9 © 2005 Pohlig - Taulien Lesen aus einer Datei import java.io.*; public class Einlesen { public static void main (String[] args) throws IOException { String dateiName = "Test.txt"; FileReader dateiLeser = new FileReader(dateiName); BufferedReader eingabe1 = new BufferedReader(dateiLeser); String text1 = eingabe1.readLine(); System.out.println(text1); InputStreamReader vonTastatur = new InputStreamReader(System.in); BufferedReader eingabe2 = new BufferedReader(vonTastatur); String text2 = eingabe2.readLine(); System.out.println(text2); } } Datenströme GK Informatik 10 © 2005 Pohlig - Taulien FileReader Dem Konstruktor von BufferedReader kann sowohl eine Instanz von FileReader als auch von InputStreamReader übergeben werden: Beide Klassen sind von Reader abgeleitet: Ein FileReader-Objekt ist auch ein Reader-Objekt. Ein InputStreamReader ist auch ein ein Reader-Objekt. Datenströme GK Informatik 11 © 2005 Pohlig - Taulien InputStreamReader • Ein InputStreamReader ist eine Brücke zwischen byte-Strömen und characterStrömen: • Er liest bytes und decodiert sie in char-Zeichen, wobei ein bestimmtes charset verwendet wird. Das verwendete charset kann entweder explizit angegeben werden oder es wird das Standardcharset der jeweiligen Plattform verwendet. Datenströme GK Informatik 12 © 2005 Pohlig - Taulien Daten an einen anderen Rechner im Netzwerk senden Die Palette von Ausgabeströmen wird erweitert. Ziel des Stromes soll ein weiterer Rechner im Netzwerk sein. Java-Programm OutputStream-Objekte PrintWriterObjekt System.out Bildschirm PrintWriterObjekt FileOutputStreamObjekt Festplatte anschluss. getOutputStream() Ein anderer Rechner im Netz PrintWriterObjekt Datenströme GK Informatik 13 © 2005 Pohlig - Taulien Senden von Daten an einen entfernten Rechner Man benötigt dazu ein Socket-Objekt, das man sich als eine Art Verbindungsstecker vorstellen kann. Der Konstruktor erwartet als Parameter die Bezeichnung des entfernten Rechners (z. B. seine IP-Adresse) und einen Port, über den die Kommunikation laufen soll. Mit der Methode getOutputStream() liefert das SocketObjekt den Ausgabestrom für den Zielrechner. Datenströme GK Informatik 14 © 2005 Pohlig - Taulien Der Client import java.net.*; //enthält die Klasse Socket import java.io.*; public class Client { } public static void main (String[] args) throws IOException, UnknownHostException { Socket anschluss = new Socket("127.0.0.1", 6000); PrintWriter schreibeStrom = new PrintWriter( anschluss.getOutputStream(), true); schreibeStrom.println("Ich gruesse Dich"); } Damit die Daten gesendet werden können, muss der entfernte Rechner empfangsbereit sein. Datenströme GK Informatik 15 © 2005 Pohlig - Taulien Daten von einem entfernten Rechner empfangen Ein anderer Rechner im Netz lauschen. getInputStream() Datenströme GK Informatik InputStreamReaderObjekt Java-Programm Um Daten von einem Rechner im Netzwerk empfangen zu können, benötigt man einen Eingabe-Strom. 16 © 2005 Pohlig - Taulien Der Server import java.net.*; import java.io.*; public class Server { } public static void main (String[] args) throws IOException{ ServerSocket anschluss = new ServerSocket(6000); while(true){ Socket lauschen = anschluss.accept(); InputStreamReader portLeser = new InputStreamReader( lauschen.getInputStream()); BufferedReader eingabe = new BufferedReader(portLeser); String text = eingabe.readLine(); System.out.println("von Client: " + text); } } Datenströme GK Informatik 17