java-ag datenstreams: dateibehandlung, lesen aus und schreiben in eine datei
TRANSCRIPT
![Page 1: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/1.jpg)
Java-AG
Datenstreams: Dateibehandlung,
Lesen aus und schreiben in eine Datei
![Page 2: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/2.jpg)
Übersicht
• Was sind Datenstreams?• Lesen von Daten• Schreiben von Daten• Rückblick „Fehlerbehandlung“
![Page 3: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/3.jpg)
Was sind Datenstreams?• Kommunikationpfad zwischen Quelle
und Ziel eines Informationsblocks• Informationsblock selbst bleibt
zunächst uninterpretiert, daher beliebige Zeichenfolge möglich
• Einfachstes Beispiel: Array im Speicher• Wichtigste Anwendung: Zugriff auf
Dateien
![Page 4: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/4.jpg)
Verwendung von Datenstreams
• alle Klassen (sowohl zum Lesen als auch zum Schreiben von Daten) benötigen das Paket java.io; es sollte daher am Anfang des Programms importiert werden:
import java.io.*;
![Page 5: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/5.jpg)
Verwendung von Datenstreams
• wenn Dateien über das Internet angesprochen werden sollen, wird die Klasse URL benötigt, sie liegt im Paket java.net, das gegebenenfalls importiert importiert werden muß:
import java.net.*;
![Page 6: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/6.jpg)
Lesen von Dateien
• Generell erfolgt das Lesen von Byte-Streams durch zwei abstrakte Klassen: Reader und InputStream
• Methoden bei Reader und InputStream im wesentlichen gleich
![Page 7: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/7.jpg)
Methoden zum Lesen von Dateien
• InputStream liefert eine Folge von Bytes (byte), dabei liegt der Zeichencode „Unicode“ (16 bit pro Zeichen) zugrunde
• Reader liest eine Folge von Zeichen (char), hierbei wird der Zeichensatz des Rechnersystems genutzt (z.B. ISO-8859-1 in Westeuropa)
![Page 8: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/8.jpg)
Methoden zum Lesen von Dateien
• wichtigste Methode zum Lesen: read ()
• Parameter: Ziel, Offset, Länger.read(cbuffer, 100, 200);
liest aus dem Objekt cbuffer die Zeichen 100 bis 299
![Page 9: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/9.jpg)
Weitere Methoden zum Lesen von Dateien
• Überspringen von Zeichen:skip (long)
• Status des Datenstreams abfragen: ready ()
• Länge des Streams bestimmen: available ()
![Page 10: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/10.jpg)
Weitere Methoden zum Lesen von Dateien
• Nach Ende des Lesevorgangs Stream schließen, um die Nutzung der Quelle durch andere Ressourcen zu ermöglichen:
close ()
![Page 11: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/11.jpg)
Lesen aus einem Array
• Zu verwendende Variante abhängig vom gewünschten Datentyp:
ByteArrayInputStream ()
CharArrayReader ()
![Page 12: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/12.jpg)
BufferedInputStream• Steigerung der Effizienz durch
Vermeidung unnötiges Hardware-Zugriffe:
• new BufferedInputStream (Ziel)für einen Puffer mit Standardgröße
• mit (Ziel, int) kann die Größe des Puffers angepaßt werden
![Page 13: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/13.jpg)
Spezielle Input-Streams
• Lesen von Daten aus binären Datenfiles:
new DataInputStream (Ziel)• Interessant: die speziellen Methoden
boolean readBoolean(), byte readByte(), float readFloat(), usw.
![Page 14: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/14.jpg)
ObjectInputStream• Lesen von Objekten mit ObjectInputStream
• Methoden analog zu DataInputStream, zusätzlich
Object readObject()für Objekte• Diese müssen allerdings in den
richtigen Typ umgewandelt werden, z.B.
d = (Date) in.readObject();
![Page 15: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/15.jpg)
Lesen vom Web-Server
• Zugriff durch Klasse URL:URL url;try {url = new url („http....“);in =new BufferedInputStream (url.openStream() );....} catch ...
![Page 16: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/16.jpg)
OutputStream
• Öffnen des OutputStreams:new FileOutputStream
(filename, true/false);• zusätzliche Option Appendmode
(true/false) ab JDK 1.1, wobei false eine neue Datei erzeugt und true die Informationen an eine bereits existierende Datei anhängt
![Page 17: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/17.jpg)
Methoden des OutputStreams
• write(int); schreibt ein Byte mit angegebenem Wert
• write(byte[]); write(byte[], offset, length);schreibt alle im byte-Array bzw. im Teilbereich des byte-Array enthaltenen Bytes
![Page 18: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/18.jpg)
Methoden des OutputStreams
• flush()sorgt dafür, daß alle eventuell noch im Puffer wartenden Bytes tatsächlich in die Datei geschrieben werden
• Sollte immer vor close()
oder einem Abbruch des Programms aufgerufen werden
![Page 19: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/19.jpg)
Spezielle OutputStreams• BufferedOutputStream (Ziel)
funktioniert analog zu BufferedInputStream.
Auch hier ist die Angabe der Puffergröße als int möglich.
![Page 20: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/20.jpg)
Spezielle OutputStreams• DataOutputStream (Ziel)
zum Schreiben von binären Datenfiles• Plattformunabhängig• Daten für DataInputStream nutzbar• Methoden:
writeBoolean(boolean); writeByte(int); writeBytes(String); etc.
![Page 21: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/21.jpg)
Spezielle OutputStreams• ObjectOutputStream (Ziel)
wie DataOutputStream, zusätzlich writeObject(Object)
• Auch hier: Object ist Superklasse für alle Klassen, Object kann also beliebig sein
• Bsp: Date d; ...Out.writeObject(d);
![Page 22: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/22.jpg)
Writer• Analog zu FileReader, BufferedReader, und InputStreamReader existieren FileWriter, BufferedWriter und OutputStreamWriter
• PrintWriter enthält zusätzlich Methoden zur Umwandlung von Zahlen und Objekten für print und println
![Page 23: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/23.jpg)
RandomAccessFile• RandomAccessFiles erlauben neben
den üblichen Stream-Methoden (read, write, flush, close) auch das „Springen“ an bestimmte Stellen innerhalb des Files.
![Page 24: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/24.jpg)
RandomAccessFile• long getFilePoint()
liefert die aktuelle Position während des Lesens/Schreibens innerhalb des Files
• long lenght() Liefert die Länge des Files
• seek (long) setzt den FilePointer auf eine bestimmte Stelle für das nächste read oder write
![Page 25: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/25.jpg)
Exceptions
• alle Fehler bei Dateizugriffen sollten mit
try {...}catch {...}finally {Streamname.close()}
abgefangen werden, um Probleme bei späteren Dateizugriffen zu vermeiden
![Page 26: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/26.jpg)
EOFException• Fast alle read-Methoden werfen am
Ende des Files ein EOFException aus:try {while (true) {..Streamname.read..}catch {EOFException e}finally {Streamname.close()}
![Page 27: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/27.jpg)
Exceptions• auch beim Erzeugen des Datenstreams
sollte man auf Nummer sicher gehen:Reader r =
tryToMakeNewReader ();if (r != null)
try {...}catch {...}finally {r.close()}
![Page 28: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/28.jpg)
Aufgabe Schreibt ein kurzes Programm, daß die Datei index.html im
Verzeichnis/HOWTO/HOWTO-INDEX auf dem HTTP-Server www.linuxdoc.org einliest.
![Page 29: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/29.jpg)
LösungZunächst werden die Pakete importiert:import java.io.*;import java.net.*;
Danach werden die Variablen deklariert:URL url;RandomAccessFile einlesen;
![Page 30: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/30.jpg)
Lösung (2)In der äußeren TRY/CATCH-Anweisung wird dieZieladresse geöffnet:try {url = new url(„http://www.linuxdoc.org/HOWTO/HOWTO-INDEX/index.html“);
Dann wird der Datenstrom geöffnet:einlesen = new RandomAccessFile(url.openStream() );
![Page 31: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/31.jpg)
Lösung (3)Die innere TRY/CATCH-Anweisung schütztden eigentlichen Lese-Vorgang:try {while (true){einlesen.read()}
}Fehler werden abgefangen, in jedem Fall wird der Lese-Vorgang abgeschlossen:catch (EOFException e) {System.out.println("error "+e) }finally {einlesen.close()} }
![Page 32: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei](https://reader035.vdocuments.site/reader035/viewer/2022062306/570491c31a28ab14218d9cb7/html5/thumbnails/32.jpg)
Lösung (4)Jetzt wird noch die äußere CATCH-
Anweisungausgewertet und zu Ende gebracht:catch (Exception e) {System.out.println("error "+e);}Und der Datenstrom geschlossen:finally {url.closestream()};