32
Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei

Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei

Embed Size (px)

Citation preview

Page 1: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei

Java-AG

Datenstreams: Dateibehandlung,

Lesen aus und schreiben in eine Datei

Page 2: Java-AG Datenstreams: Dateibehandlung, Lesen aus und schreiben in eine Datei

Ü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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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()};