Dateien, Ströme Einführung ■ Einführung und Allgemeines zum Zugriff auf Dateien ■ Sequentieller Dateizugriff ■ Die wichtigsten Java IO-Klassen ■ Lesen von Files und Schreiben in Files in Java ■ Konsolen-IO und die System-Klasse ■ Lesen von anderen Medien ■ Persistente Objekte School of Engineering Datei/File ■ ■Zugriffsrechte auf Dateien Daten im Arbeitsspeicher (RAM) gehen beim Ausschalten des Computers verloren Wir brauchen eine Möglichkeit, um diese Daten permanent zu speichern ■ J zusammengehörige Daten werden zu Dateien (Eng: File = Ablage) zusammengefasst und als eine Einheit behandelt ■ ■ ■ ■ ■ ■ Eine Folge von Bytes (Stream of Bytes) Zusammengehörige Daten werden zu Dateien zusammengefasst um diese Daten effizient auf permanente Speichermedien ablegen und wieder auslesen zu können Beliebige Arten von Daten können gespeichert werden: Text, Zahlen, Bilder, Video, Sound, Programme, Objekte... Die Interpretation der Byte-Folge in einer Datei ist Sache des entsprechenden Programms School of Engineering ■ Normalerweise hat der Benützer uneingeschränkte Zugriffsrechte auf Dateien (lesen, schreiben, umbenennen, löschen, ausführen) Die Zugriffsrechte können vom Besitzer der Datei weiter eingeschränkt werden Einhaltung der Zugriffsrechte wird vom Betriebssystem garantiert ■Applets ■ Datei ■ 2 von 50 Zugriffsrechte ■ Problem ■ © A. Meier/M. Braschler/J. Zeman/K. Rege © A. Meier/M. Braschler/J. Zeman/K. Rege 3 von 50 ■ Haben keine Zugriffsrechte auf Files des Computers, auf dem das Applet läuft J wieso? Mit einer entsprechend eingestellten Security-Policy können Applets jedoch auch auf Files zugreifen (für JNI schon gemacht). ■Java Applikationen ■ ■ Eine Java Applikation hat die Rechte des Benützers, der sie ausführt Keine weiteren Einschränkungen bezüglich Zugriffsrechten School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 4 von 50 Die Klasse File ■ Methoden, um Dateien und Verzeichnisse als Ganzes zu bearbeiten (Verzeichnisse sind auch Dateien) ■ Instanzierung/Existenzprüfung: ■ File myFile = new File(String absFileName); ■ ■ Files in Java erzeugt ein File-Object, nicht das File selbst absFileName: Filename samt absolutem Pfad ■ (\ durch \\ im String ersetzen!) ■ Methode zur Existenzprüfung ■ boolean exists() : prüft ob vorhanden ■ Methoden zur Prüfung von Eigenschaften School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 5 von 50 ■ boolean isFile() : Testest, ob Datei ■ boolean isDirectory() : Testest, ob Verzeichnis ■ boolean canRead () : Testet, ob Lesen erlaubt ■ boolean canWrite() : Testet, ob Schreiben erlaubt ■ String getName(): gibt Dateinamen zurück ■ String getPath() : gibt relativen Pfad zurück ■ String getAbsolutePath() :gibt absoluten Pfad zurück School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege Die Klasse File Standard Dialoge, z.B. JFileChooser ■ Methoden zur Verzeichnisdurchsuche ■ Erzeugt Dialog-Fenster, um ein File auszuwählen ■ String[] list() : retourniert Liste aller Dateien 6 von 50 ■ Weitere Einstellungsmöglichkeiten ■ Filter, Directory, … ■ Deklaration: ■ Methode zur Dateiumbenennung/Löschung ■ ■ private JFileChooser fc; ■ Initialisierung: boolean renameTo(File dest) : benennt File um boolean delete() : löscht Datei; true -> war vorhanden fc = new JFileChooser(); int returnVal = fc.showOpenDialog(this); oder ■ Beispiel: Auflisten von Windows Verzeichnis int returnVal = fc.showSaveDialog(this); File dir = new File("C:\\windows"); ■ Verarbeitung: String[] dirNames = dir.list(); if (returnVal == JFileChooser.APPROVE_OPTION) { ….// ok for (int i = 0; i < dirNames.length; i++) { String fn = dirNames[i]; File f = new File(fn); if (f.isDirectory()) fn = fn + " dir"; System.out.println(fn); } else {System.out.println("canceled");} ■ Ausgewähltes File: File file = fc.getSelectedFile(); ■ Pfad des ausgewählten Files: } String path = fc.getSelectedFile().getPath(); School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 7 von 50 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 8 von 50 Dateizugriff: stream oder random access? access? Zwei grundsätzliche Möglichkeiten, um auf Dateien zuzugreifen: ■Wahlfreier Zugriff, wie z.B. bei Arbeitsspeicher, HD, DVD... ■ ■ ■ Dieser Zugriff wird auch als direktadressierter Zugriff (random access) bezeichnet Zugriff erfolgt wie auf den internen Speicher über eine Adresse/Position Random Access auf Dateien wird nur in speziellen Fällen benötigt, zB bei Datenbanken Dateizugriffsströme ■ Sequentieller Zugriff: ■ ■ ■ ■ Die Daten werden wie bei einem Tonband von vorne beginnend nacheinander eingelesen Dieser Zugriff wird auch als Strom-Zugriff (stream access) bezeichnet Dies ist die häufigste Art, auf Dateien zuzugreifen Streams findet man z.B. auch bei der Datenübertragung über ein Netzwerk ■ Wir beschränken uns hier auf den Sequentiellen Zugriff School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 9 von 50 Direkter sequentieller Dateizugriff School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 10 von 50 Gepufferter sequentieller Zugriff ■Grundlegende Operationen ■ Lesen eines Files: File öffnen, Daten nacheinander lesen und intern abspeichern, File schliessen: ■ Schreiben eines Files: File öffnen, Daten nacheinander schreiben, File schliessen: ■Daten werden blockweise gelesen/ geschrieben, Zwischenspeicherung im Arbeitsspeicher ■Vorteile: ■ ■Direkter sequentieller Zugriff: ■ ■ Daten werden Byte für Byte gelesen/geschrieben J Datenstrom (Stream) Vorteil: maximale Kontrolle des Programmierers, denn Daten werden unmittelbar auf/von Datei geschrieben/ gelesen ■ ■Nachteile: ■ ■ ■ Nachteile: langsam, Applikation wird jedesmal blockiert, bis das Byte gelesen/ geschrieben ist J ev. Zeit bis R/W Kopf auf richtigem Track + Zeit bis richtiger Sektor unter R/W Kopf + Zeit bis Daten gelesen und transferiert School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege Die Applikation ist weniger blockiert durch den Dateizugriff Ermöglicht effizientes Lesen/Schreiben grösserer Einheiten (512, 1024 Bytes, etc.) ■ Auch wenn die Applikation nur ein Byte braucht, wird ein ganzer Block von der Datei gelesen Lesen der ersten Bytes dauert länger Daten werden verzögert geschrieben J inkonsistenter Zustand; ■ -> wann soll der Puffer geschrieben werden? ■Vorteile überwiegen bei weitem, Dateizugriff wird in modernen Betriebssystemen und Java-Streamklassen so gehandhabt! 11 von 50 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 12 von 50 Modell Datenstrom Eingabe und Ausgabe-Ströme Datei ■ Die Java Klassen modellieren einen Datenstrom (IO Stream) File Datenstrom ■ Im Package java.io definiert hello InputStream OutputStream FileInputStream FileOutputStream allgemein how .. Eingabe Datei Ausgabe ■ Der Datenstrom puffert die Operationen ■ FileInputStream/FileOutputStream: Klassen die Daten auf Datei-Ströme ■ InputStream/OutputStream: abstrakte Oberklassen die allgemeine Ströme beliebiger Daten repräsentieren (-> Byte Stream) beliebiger Daten repräsentieren (Byte Stream) ■ Eröffnen von Datei Eingabe Strom: Konstruktoren ■ ■ Read: es werden die benachbarten Bytes (Datenblock) ebenfalls gelesen ■ fs = new FileInputStream(String name); fs = new FileInputStream(File file); ■ Methode zum Schliessen von Strom (Schreiben aller Buffer auf Disk) ■ ■ Write: es wird erst geschrieben wenn z.B. der Buffer voll ist School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 13 von 50 close(); // wichtig beim Schreiben School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 14 von 50 FileInputStream/ FileInputStream/FileOutputStream Datei ■ Konkrete Klasse File ■ Erlaubt Lesen/Schreiben einzelner (oder mehrerer) Bytes von/zu einer Datei Datenstrom hello how .. ■ Verschiedene read() und write() Interpretation von Datenströmen Zeichenkodierung Methoden für Bytes ■ werden aber eher selten direkt verwendet ■ Constructor verlangt den Pfadnamen des Files oder ein File Objekt School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 15 von 50 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 16 von 50 Byte- und Zeichenströ Zeichenströme UTF-8 ■ UTF-8-Code: Viele Texte (auch Java-Quellcode) bestehen meist nur aus Latin-1 Zeichen ■Objekte vom Byte-Stream-Klassen schreiben und lesen Bytes ■Objekte vom Zeichen-Stream-Klassen schreiben und lesen Zeichen ■ ■In älteren Programmiersprachen ist 1 char = 1 byte! ■ ■ 16-Bit-Unicode: Platzverschwendung UTF-8-Code: Kompakt für Latin-1 7-Bit-ASCII-Code oder 8-Bit ISO 8859-1 (Latin-1) ■ Vorteile ■In Java ist char intern immer im 16-Bit UNICODE-Format kodiert Æ Internet-Sprache! ■ ■ ■8-Bit ISO 8859-1 Zeichensatz ist ein Subset von Unicode (erste 256 Zeichen, oberes Byte = 0) ■ ■ Erste 256 Zeichen in Unicode ■ Problem: ■ 0 8-Bit ISO 8859 - Code Upper-Byte Es können alle UNICODE-Zeichen dargestellt werden ASCII Dateien können ebenfalls problemlos gelesen und geschrieben werden häufig benutzte Latin-1-Zeichen: nur 1 Byte-Code selten benutzte Zeichen bis 3 Bytes Umwandlung Byte Stream in Zeichen Strom nicht mehr so einfach ■ es müssen 1-3 Bytes pro Zeichen gelesen/geschrieben werden lower-Byte ■ Lösung: Reader/Writer interpretiert den Byte-Strom und wandelt in ZeichenStrom um School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 17 von 50 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 18 von 50 Lesen/Schreiben über Reader/Writer Datei Verzeichnis File Datenstrom hello InputStream Reader und Writer auf Zeichenströmen FileInputStream OuputStream FileOutputStream how .. Lese/Schreibkopf Reader InputStream Reader FileReader Writer OutputStream Writer FileWriter ■ Daten werden nicht direkt gelesen und geschrieben sondern über Reader/Writer School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 19 von 50 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 20 von 50 Reader, InputStreamReader, FileReader Writer, OutputStreamWriter FileWriter Oberklasse Oberklasse Reader allgemein Datei InputStreamReader Writer allgemein Datei OutputStreamWriter FileWriter FileReader Filter Zeilenweise Filter PrintWriter BufferedReader ■ Writer Schreiben von Zeichen-Streams ■ Reader Lesen von Zeichen-Streams (Zeichenströme) ■ ■ InputStreamReader liest Bytes von einem InputStream und wandelt sie in Zeichen um ■ FileReader liest Zeichen-Streams von einem File BufferedReader gepuffertes Lesen, ermöglicht zeilenweises Lesen ■ OutputStreamWriter wandelt Zeichen in Bytes und gibt sie über einen OutputStream aus ■ ■ FileWriter schreibt Zeichen-Streams auf ein File PrintWriter gepuffertes Schreiben, ermöglicht zeilenweises Schreiben School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 21 von 50 InputStreamReader/ InputStreamReader/OutputStreamWriter School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 22 von 50 Beispiel ■ Beispiel Lesen über Streams: ■ Erlauben die Umwandlung von ByteStreams in Zeichen-Streams String fileName = "C:\\test.txt"; char zeichen; FileInputStream stream = new FileInputStream(fileName); InputStreamReader inFile = new InputStreamReader (stream); while ((zeichen = (char)inFile.read()) != -1) { // do something... } stream.close(); ■ Die bei der Umwandlung verwendete Codierung kann gewählt werden (Default: lokale Codierung, bei uns ISO8859-1) ■ Constructor verlangt einen (File-) InputStream/OutputStream J erst Lesen/Schreiben von Bytes, dann Umwandlung in Zeichens ■ Zeichenkodierung ... = new InputStreamReader (stream,"US-ASCII"); ■ Werden auch für Zugriff auf andere Medien verwendet, z.B. Tastatur, Bildschirm, Internet (zB Webseiten) School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege ... = new InputStreamReader (stream,"ISO-8859-1"); ... = new InputStreamReader (stream,"UTF-8"); 23 von 50 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 24 von 50 FileReader FileWriter ■ Dateien können zeichenweise geschrieben werden ■"Convenience" Klasse ■ es muss kein Strom erzeugt werden ■ FileWriter Klasse zum Schreiben von beliebigen Daten auf Datei-Ströme ■FileReader ■ ■ ■ (FileStream) erben von InputReader zusätzliche Konstruktoren ■ FileReader(File file); erstelle Datei Leser ■ FileReader(String name); erstelle Datei Leser close(); Methode schliesst Datei & Leser ■ FileWriter(File file); erstelle Datei Schreiber ■ FileWriter(String name); erstelle Datei ■ FileWriter(String name, boolean app); erstelle Datei Schreiber um an Datei anzuhängen. ■ flush(); Methode schreibt Daten auf Disk close(); Methode schliesst Datei Schreiber & Datei ■ ■Dateien können zeichenweise gelesen werden ■ Beispiel: String fileName = "C:\test.txt"; char zeichen; FileReader inFile = new FileReader(fileName); while ((zeichen = (char)inFile.read()) != -1) { // do something... } inFile.close(); School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 25 von 50 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 26 von 50 Text Strö Ströme ■Die häufigste Art von Dateien, die gelesen und geschrieben werden, sind Textdateien ■Texte haben Zeilenstruktur ■ Reader und Writer auf Textströmen Zeilenumbruchszeichen ist Plattformabhängig ■Kann zwar erfragt werden String cr = System.getProperty("line.separator"); ■Verwendung ist aber mühsam und fehleranfällig ■Lösung -> Reader/Writer die Zeichenstrom weiter "veredeln" School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 27 von 50 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 28 von 50 BufferedReader/ BufferedReader/PrinterWriter Reader/Writer Klassen für Texte Datei Verzeichnis Zeilenweises Lesen und Schreiben, meist effizienter: File ■ Lösung -> Reader/Writer die Zeichenstrom weiter "veredeln" Datenstrom hello ■ Der Gebrauch dieser Klassen ist bei Textdateien eigentlich immer sinnvoll! how .. ■ Textdateien (und andere Medien) können gepuffert/zeilenweise gelesen und geschrieben werden mit den Klassen BufferedReader und PrintWriter Lese/Schreibkopf Reader InputStream Reader FileReader Writer OutputStream Writer ■ Zeilenumbruch wird transparent gehandhabt FileWriter Lese/Schreiblogik, Filter, "Dekorierer" BufferedReader School of Engineering PrintWriter © A. Meier/M. Braschler/J. Zeman/K. Rege 29 von 50 BufferedReader © A. Meier/M. Braschler/J. Zeman/K. Rege 30 von 50 BufferedReader Beispiel 2 ■BufferedReader: gepuffertes Lesen von Zeichens aus einer Textdatei (auch andere Medien), einzelne/mehrere Zeichen oder zeilenweise BufferReader(Reader rdr); erstelle Leser BufferReader(Reader rdr, int sz);Buffer Grösse ■ integer read() ; lese einzelnes Zeichen ■ String readLine(); lese Zeile ■ close(); schliesse Leser ■ ■ ■Beispiel: String fileName = "C:\\test.txt"; String line; BufferedReader inFile = new BufferedReader(new FileReader(fileName)); while((line = inFile.readLine()) != null) { // do something... } inFile.close(); School of Engineering School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 31 von 50 public void actionPerformed(ActionEvent evt) { String fileName; String line; if (evt.getSource() == loadButton) { fileName = nameField.getText(); // File-Name vom Textfeld try { inFile = new BufferedReader(new FileReader(fileName)); inputTextArea.setText(""); // clear the input area while( ( line = inFile.readLine() ) != null) { inputTextArea.append(line+"\n"); } inFile.close(); } catch (IOException e) { System.err.println("Error in file " + fileName + ": " + e.toString() ); System.exit(1); } } } School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 32 von 50 PrintWriter ■ PrintWriter: gepuffertes Schreiben von Zeichen in eine Textdatei (auch andere Medien), einzelne/mehrere Zeichen oder zeilenweise ■ PrintWriter(Writer wrt); erstelle Schreiber PrintWriter(OutputStream str); ■ print(String s) ; Schreibe String ■ println(String s) ; Schreibe String & neue Zeile ■ flush(); Methode schreibt Daten auf Disk ■ close(); Methode schliesst Datei Schreiber ■ Serialisierung von Objekten ■ Beispiel public void actionPerformed(ActionEvent evt) { if (evt.getSource() == saveButton ) { try{ outFile = new PrintWriter(new FileWriter("testout.txt"), true); outFile.print(inputTextArea.getText()); outFile.close(); } catch (IOException e) { ... } } School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 33 von 50 Serialization von Objekten School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 34 von 50 Serialization ■Oft besteht das Bedürfnis, den aktuellen Zustand der Applikation abspeichern zu können ■Bei der Serialisierung eines Objekts werden alle Attribute in einen Byte-Strom verpackt ■Beispiel: Anmelde Anwendung aus dem Praktikum J abspeichern der Anmeldung ■Falls ein Attribut eine Referenz auf ein weiteres Objekt darstellt, so wird auch dieses Objekt serialisiert und in den Byte-Strom gepackt ■Java: Zustand ist dezentral in Objekten gespeichert J Objekte sollten persistent abgespeichert und wieder geladen werden können ■Serialisierung dient nicht nur zur Speicherung; es können z.B. auch Objekte zwischen Applikationen über Kommunikationsleitungen ausgetauscht werden Dies nennt man serialization/ deserialization: ■Java bietet die Möglichkeit, Objekte in einen Byte- oder XML-Strom zu verwandeln, der dann zum Beispiel in eine Datei gespeichert werden kann J Serialisierung (serialization) eines Objekts ■Der abgespeicherte Byte-Strom kann später wieder eingelesen und daraus wieder ein identisches Objekt erzeugt werden J Deserialisierung (deserialization) School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 35 von 50 ■Klassen/Methoden: ■ Klasse ObjectOutputStream, Methode writeObject(Object obj) um ein Objekt zu serialisieren ■ Klasse ObjectInputStream, Methode Object readObject() um ein serialisiertes Objekt einzulesen ■Damit ein Objekt serialisierbar ist, muss es das Interface Serializable implementieren (enthält keine Methoden, zeigt nur an, dass ein Objekt serialisierbar ist) School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 36 von 50 Konsolen-IO "Once upon a time, in the very beginning of the computer era…" Historische Entwicklung von User-Interfaces: ■Am Anfang gab es nur Konsolen/Terminals ■ ■ Konsolen-IO ■ Ein-/Ausgabe war nur textbasiert möglich Eingabe per Lochkarte oder Keyboard Ausgabe auf Lineprinter/Bildschirm ■Später: einfache, textuelle Menüs; Auswahl aus einer Befehls-Liste via CursorTasten ■Erst später: graphische Benützerschnittstellen (GUI) mit Eingabe per Maus School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 37 von 50 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 38 von 50 System-Klasse Konsolen-IO ■Software mit Kommandozeilen-Interface sind aber auch heute noch sehr verbreitet (Linux, UNIX, teilweise auch Windows) ■ Stellt eine plattformunabhängige Schnittstelle zu einigen Betriebssystemfunktionen zur Verfügung ■Diverse Vorteile im Vergleich zu GUIs: ■ ■ ■ Sehr effizient bedienbar (wenn man „drauskommt“...) Piping: der Output von einem Programm wird in einem anderen als Input verwenden: ls –la | grep demo Ausführen von Skripts und damit das Automatisieren von sich wiederholenden Tasks (z.B. Online Backup einer Oracle DB) ■ Sie enthält nur Klassenvariablen und Klassenmethoden ■ Sie kann nicht instanziert werden Konsolen-IO: Eingabe/Ausgabe von Programmen über die Konsole ■Sie stellt unter anderem 3 Streams zur Verfügung: ■Aus Sicht der Applikation 3 wichtige „Ein-/Ausgabekanäle“: ■ ■ Standard Input, Output und Error Per Default alles auf der Konsole, können umgeleitet werden ■ stdout stdin Programm (Kanal Nr. 0) ■ (Kanal Nr.1) ■ stderr System.in System.out System.err (= Standard Input) (= Standard Output) (= Standard Error) (Kanal Nr.2) ■In Java sind Kommandozeilen-Interfaces einfach realisierbar mit speziellen Streams, die in der System-Klasse bereits vordefiniert sind School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 39 von 50 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 40 von 50 System.out System.in ■ System.out ■System.in ■ ist ein PrintStream (Klasse wurde ab Java 1.1 ersetzt durch PrintWriter): ähnliche Schnittstelle wie PrintWriter ■ Methoden ■ ■ ■ ■ print(String str) println(String str) ■ kein keinflush! flush! analoge Methoden für int, float, ..., System.out.flush() leert Puffer nach print. ■ Erlaubt nur byteweises einlesen von Daten J komfortabler mit einem BufferedReader: ■ Für Einfache- und Testausgabe ■ BufferedReader keyboard; System.out.print(message); System.out.flush(); keyboard = new BufferedReader( new InputStreamReader(System.in), 1); String line = keyboard.readLine(); System.out.println("Ausgabe"); ■ Für Programm-Prompts mit Benützereingabe auf der gleichen Zeile. ■ muss nicht mit new erzeugt werden, er existiert schon ■ School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege Ein InputStream-Objekt ■ Wird für das direkte Einlesen von Tastatureingaben oder dem Einlesen des Outputs eines anderen Programms (via Piping) verwendet 41 von 50 System.err System.err / System.exit System.exit Puffergrösse wird hier auf 1 gesetzt, damit keine Verzögerungen bei einem readLine() entstehen School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 42 von 50 Umleiten/Redirecting Umleiten/Redirecting System.err ■Wird gebraucht zur Ausgabe von Fehlermeldungen auf die Konsole, Piping funktioniert nicht mit System.err ■Prinzipiell wie System.out, aber dieser Strom kann nicht mit Piping verwendet ■Funktioniert für alle Command-LineTools/Programme (nicht nur Java) ■Das Programm selbst „merkt nichts davon“ werden Geräte Gerätefür fürdie die Standard-IO-Kanäle Standard-IO-Kanäle ■Standard Input, Output und Error können umgeleitet werden stderr Tastatur Datei in.dat stdin <in.dat Programm Programm myprog.exe myprog.exe stdout >out.dat Bildschirm Datei out.dat ■Beispiel mit Java-Programm Programm: ■ System.exit java java ■ java ■ java ■ ■Methode System.exit(int errorCode) beendet eine Applikation sofort und gibt errorCode an das Betriebssystem zurück ■Konvention für errorCode: ■ System.exit(0); // 0 Normale Beendigung ■ System.exit(2); // <>0 Abbruch nach Fehler © A. Meier/M. Braschler/J. Zeman/K. Rege // Alles über Konsole // Output ins File output.txt // Fehler ins File error.txt // Input aus File input.txt ■Macht Programme enorm flexibel: eine Personenliste kann z.B. eingegeben werden oder aus einem File gelesen werden J das Programm wird unabhängig davon entwickelt ■Ist Voraussetzung für Piping: die Personenliste kann damit auch von einem anderen Programm kommen: ■ School of Engineering Programm Programm > output.txt Programm 2> error.txt programm < input.txt 43 von 50 java Personenliste | java Programm School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 44 von 50 Remote Lesen von HTML Dokumenten ■ Lesen von Dateien über das Internet analog lokalen Dateien ■ Klasse URL ■ ■ ■ Ströme von Daten über HTTP Klasse die URL repräsentiert (entspricht "Verzeichnis") Konstruktor ■ URL(String urlString) Beispiel ■ URL url= new URL("http://www.zhaw.ch"); ■ Klasse URLConnection (entspricht "Datei") ■ URLConnection link; ■ wird von URL zurückgegeben ■ link = url.openConnection(); ■ liefert InputStream ■ inputStream inStream; ■ inStream = link.getInputStream(); ■ diese Klassen brauchen zusätzlich ■ School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 45 von 50 Bsp: Lesen der ZHAW Homepage try { ■ Klassen von "Medien" sind: ■ File ■ URLConnection Deklaration und Instanziierung Deklaration und Instanziierung Stream & Reader InputStream inStream = link.getInputStream(); Stream & Reader URLConnection link = url.openConnection(); = new InputStreamReader(inStream); ■ Klassen von Strömen sind ■ InputStream, FileInputStream ■ OutputStream, FileOutputStream BufferedReader inRdr = new BufferedReader(inStrRrd); Lesen Lesen String line; while ((line = inRdr.readLine()) != null) { ■ Klassen von Lesern ■ Reader, InputStreamReader, FileReader System.out.println(line); } inRdr.close(); ■ Klassen von Schreibern ■ Writer, OutputStreamWriter, FileWriter Schliessen der Verbindung Schliessen der Verbindung } catch(IOException ex) {System.out.println(ex.getMessage());} ■ Klassen von "veredelten" Lesern/Schreibern sind ■ BufferedReader, PrintWriter catch(Exception ex) {System.out.println(ex.getMessage());} School of Engineering 46 von 50 ■ in Java wird zwischen Trägern, Strömen, Lese/Schreibern und Filtern unterschieden URL url = new URL("http://www.zhaw.ch"); InputStreamReader inStrRrd © A. Meier/M. Braschler/J. Zeman/K. Rege Zusammenfassung Ströme Deklaration Deklarationund undInstanziierung Instanziierungvon von URL URLund undURLConnection URLConnection import java.net.*; ... import java.net.*; School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 47 von 50 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 48 von 50 Anhang: Einlesen von einem File Anhang: einer Ausgabe auf eine Datei import java.io.*; …... Deklaration Deklaration&&Erzeugung Erzeugungder derReader Reader String fileName = "datei.txt"; try { FileReader inFileReader = new FileReader(fileName); BufferedReader inReader = new BufferedReader( inFileReader ); String line; while((line = inReader.readLine()) != null) { Zeilenweise Einlesen Zeilenweise Einlesen System.out.println(line); null-> Dateiende null-> Dateiende } inReader.close(); Schliessen des Readers Schliessen des Readers } catch (IOException e) { System.err.println("Error in file " + fileName + ": " + e.getMessage() ); Fehlerbehandlung Fehlerbehandlung } } …... import java.io.*; School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege Deklaration Deklaration&&Erzeugung Erzeugungder derSchreiber Schreiber try{ FileWriter fWrt=new FileWriter("testout.txt"); PrintWriter outWrt=new PrintWriter(fwrt); for (int i = 0; i < 10; i++) { outWrt .println( "Zeile " + i); } Schliessen Schliessendes desSchreibers Schreibers outWrt .close(); } catch (IOException e) { Fehlerbehandlung Fehlerbehandlung System.err.println("File Error: " + e.getMessage() ); } 49 von 50 School of Engineering © A. Meier/M. Braschler/J. Zeman/K. Rege 50 von 50