Java 1
  • Home
  • Tutorials
    • Hello World
      • Download
      • Installation unter Windows
      • Installation unter Linux
      • Das Hello World Programm
      • Mehr Java
    • Java Konsole
      • Java Konsole Testen
    • Basic Java
      • Java Programme
        • Die Klasse
        • Datentypen
        • Null
        • Casten
        • Operatoren
        • Kontrollstrukturen
        • Arrays
        • Aufgaben
      • Objektorientierte Konzepte
        • Hallo Fenster
        • Objekte einer Klasse
        • Vererbung
        • Interfaces
      • Alles über Klassen
        • Abstrakte Klassen
        • Methoden überschreiben
        • Super
        • Final
        • Innere Klassen
        • Anonyme Klassen
        • Enumerations
      • You're just an object
        • Sichtbarkeit
        • Druckdarstellung
        • Gleichheit
        • Klonen
        • Die Class
        • Serialisierung
    • Java Api
      • Dokumentation
      • Strings
      • Wrapper Klassen
      • System und Runtime
      • Math
      • Exceptions
      • IO
      • Sammlungsklassen
      • AWT und Swing
      • Alle Komponenten
      • Applets
      • Threads
      • Jar
      • Classpath
    • JSP und Servlets
      • Meine erste JSP
        • Downloads
        • Installation unter Windows
        • Installation unter Linux
        • Admin und Manager
        • Webapplication
      • JSP
        • Java Code in HTML einbinden
        • Das HTTP Request - Response Modell
        • Request und Response Objekte
        • Auswerten von Formulardaten
        • Aufgaben
      • Beans
        • Die Session
        • Weitere vordefinierte Objekte
        • Java-Beans
        • Beans programmieren
        • Java-Beans in JSP nutzen
        • Aufgaben
      • Servlets
        • Nutzen der Servlets
        • Servlets programmieren
        • Servlets auf dem Server einrichten
        • Servlets mit JSP
        • Servlets includen
        • Aufgaben
      • Webapplikation
        • Filter
        • Initialisierungsparameter
        • Error Pages
        • Passwortgeschützte Verzeichnisse
        • Bibliotheken nutzen
        • Eine Webapplikation deployen
        • Ausblick: Wie geht's weiter?
        • JSP-Tags Syntaxreferenz
        • Aufgaben
  • Code
    • Web
      • Datenbankverbindungen mit Tomcat
      • Texte richtig encoden
      • HTTPS mit Tomcat
      • HTML Encoden mit Javascript
    • Java
      • Print F
      • Ein generischer Poolbuilder
      • Native Bibliotheken
      • Unique Ids
    • Java FX
      • Balls
      • Hearts
      • Planner
    • Java ME
      • The Next Big Thing
    • System
      • Vi Kommandos
  • Sidemap
  • Impressum
  • Hilfe
Home > Tutorials > Java Api > IO
  • Home
  • Tutorials
    • Hello World
    • Java Konsole
    • Basic Java
    • Java Api
      • Dokumentation
      • Strings
      • Wrapper Klassen
      • System und Runtime
      • Math
      • Exceptions
      • IO
      • Sammlungsklassen
      • AWT und Swing
      • Alle Komponenten
      • Applets
      • Threads
      • Jar
      • Classpath
    • JSP und Servlets
  • Code
  • Sidemap
  • Impressum
  • Hilfe

Ein- und Ausgabe, kurz IO

Im Paket „java.io.*“ sind Klasse zusammengefasst, die für Ein- und Ausgabeoperationen zuständig sind. Da die meisten Programme irgendwie mit ihrer Umwelt kommunizieren, ist dies ein ziemlich wichtiges Thema.

File

Eine der wichtigen Klassen im Paket java.io.* ist die Klasse java.io.File. Die Klasse repräsentiert einen Dateinamen in betriebssystem unabhängiger Form. Der Dateinamen kann eine Datei, ein Verzeichnis, einen Link oder auch etwas faktisch nicht Existierendes bezeichnen, wenn wir einen Pfad übergeben, der auf der Platte keiner Datei entspricht. File ist schon eine recht alte Klasse und kann deshalb eine ganze Menge, was man heute wohl nicht mehr alles in einer Klasse unterbringen würde.

File kann natürlich Auskunft über die eigenen Daten geben: so weiß File, ob die entsprechende Datei oder das Verzeichnis existiert (File#exists()), ob sie les- und schreibbar ist (File#canRead(), File#canWrite()), ob es eine Datei oder ein Verzeichnis ist (File#isDirectory(), File#isFile()). Die Dateigrösse sowie das Datum der letzten Änderung kann erfragt werden (File#length(), File#lastModified())., File kennt den Namen von Datei und Pfad sowie den Namen des übergeordneten Verzeichnisses (File#getParent(),File#getParentFile()).

File kann aber auch Dateien und Verzeichnisse erzeugen: File.createTempFile(..) erzeugt eine temporäre Datei in einem schreibbaren Verzeichnis, die vom System automatisch entsorgt wird. File#mkdir() und File#mkdirs() erzeugen Verzeichnisse, File#createNewFile() erzeugt eine leere Datei, falls unter dem gegebenen Dateinamen noch keine Datei existiert. File kann auch löschen (File#delete()). Kopieren und verschieben von Dateien ist nicht möglich; dazu müssen wir eine Datei lesen und wieder schreiben.

File kann auch benutzt werden, um den Inhalt von Verzeichnissen auszulesen (File#list(), File#list(FilenameFilter), File#listFiles(). Sehr nützlich ist File#listRoots(), das unter Windows die einzelnen Laufwerke des Rechners auflistetet. Unter Linux gibt es ja nur ein Systemroot.

Ausserdem kennt File das Trennzeichen bei Verzeichnispfaden (Path.separator), „/“ auf Linux, „\“ auf Windows, ebenso wie das Trennzeichen in der PATH-Umgebungsvariable (Path.pathSeparator) („;“ auf Windows, „:“auf Linux).

Das Beispiel java1.bsp.referenz.FileLister demonstriert die Verwendung der hier vorgestellten Methoden des File-Objekts. Bitte studieren Sie den Quellcode, um die Arbeit mit der File-Klasse im Zusammenhang zu sehen.

 

Lesen und Schreiben

Lese- und Schreiboperationen sind in Java Stream-basiert, d.h. wir lesen immer portionsweise aus einem irgendwann endendem Storm von Zeichen. Der bei jeder Leseoperation erhalten wir die Anzahl der gelesenen Zeichen, und wenn nichts mehr kommt, ist der Storm wohl zu Ende. Typischerweise sieht das so aus:

 

private void fromTo(Reader in, Writer out) throws IOException {
   try {
      int size = -1;
      char[] buffer = new char[1024];
      while ((size = in.read(buffer)) > -1) {
         out.write(buffer,0, size);
      }
   } finally {
      // versuche, auch bei Fehler zu schliessen
      in.close();
      out.close();
   }
}

Wie man erkennt, haben wir eine Eingabe in und eine Ausgabe out. Wir lesen die Daten von in in einen Buffer (hier ein char-Array) mit in.read(buffer). Die Methode gibt die Anzahl der gelesenen Zeichen zurück, die wir festhalten, weil wir sie zum anschliessenden Schreiben brauchen. Hier schreiben wir dann den Buffer nach out, aber natürlich nur so viele Zeichen, wie wir auch gelesen haben.

Nach Ende des Verfahrens werden die Ströme geschlossen, um eventuelle Dateisperren aufzuheben und die Ressourcen freizugeben. Während aller IO-Operationen können Fehler auftreten, die in Form der IO-Exception zu behandeln sind. Während das eigentliche Lesen und Schreiben also ziemlich simpel ist, liegt die Schwierigkeit in Java darin, herauszufinden, welcher Stream denn nun der geeignete ist. Damit wollen wir uns im folgenden Kapitel beschäftigen.

Streams

Wenn Sie sich die Dokumentation zum Paket java.io.* anschauen, so erscheinen die vielen Streams doch etwas unübersichtlich, und es wird Zeit, etwas Licht in das Dunkel dieses Paketes zu bringen. Grundsätzlich gilt:

Wenn wir Binärdaten lesen und schreiben verwenden wir Input- und Outputstreams, wenn wir Text lesen oder schreiben sind Reader und Writer angebracht. Ein InputStreamReader kann dabei die Konvertierung von Bytes nach Text leisten und mit dem entsprechenden Encoding initialisiert werden.

Für Dateien (Files) gibt es beispielsweise alle vier Varianten: den FileInputStream zum Lesen von Binärdaten (zum Beispiel Bilddaten) und den FileOutputStream zum Schreiben derselben, sowie den FileReader zum Lesen von Textdateien und den FileWriter zum Schreiben von Text in Dateien. Dasselbe finden Sie gleich daneben für die Pipe (PipedInputStream, PipedOutputStream, PipedReader, PipedWriter). Einen vollen Satz bietet ebenfalls die Buffered-Serie an, die in der Netzwerkprogrammierung sehr nützlich ist. Es sind Klassen, die um einen anderen Stream gelegt werden können, um ihn zu Puffern. Sie sind von FilterInputStream(OutputStream, Reader, Writer) abgeleitet, die Basisklassen darstellen, um eigene Filter zu implementieren. Nützliche Implementierung der Klassen sind die ZipInput(Output)- und GZIPInput(Output)- Streams aus dem Paket java.util.zip.*, die das Lesen und Schreiben von komprimierten Daten auf einfache Weise zur Verfügung stellen.

Einige weitere interessante Streams: java.io.ByteArrayInput(Output)Stream lesen und schreiben in ein / aus einem Byte-Array, das dann weiter verwendet werden kann. Sie ermöglichen also das Schreiben und Lesen aus dem Arbeitsspeicher. Dasselbe leisten CharArrayReader(Writer) für Textzeichen.

Ein DataInput(Output)Stream arbeitet mit Java-Datentypen, ein ObjectInput(Output)Stream arbeitet mit Java-Objekten. Beide können benutzt werden, um Daten zu serialisieren. Der LineNumberReader fügt Zeilennummern ein, wähernd StringReader(Writer) mit Zeichenketten arbeiten.

Insgesamt muss man ein wenig aufpassen, um von der Fülle der Streams nicht erschlagen zu werden. Sie sind aber ausgesprochen nützlich, weil man mit ihrer Hilfe ganz unterschiedliche Quellen mit ganz ähnlicher Syntax „bearbeiten" kann und so sehr flexibel bleibt. Der Code ändert sich kaum, ob wir nun beispielsweise aus einem Zip – Archiv, einer Datei oder aus dem Netzwerk lesen.

Aufgabe: BetterFileLister

Erweitern Sie die FileLister um folgende Funktionen:

  1. Falls das System mehrere Roots (=Laufwerke auf Windows) besitzt, soll der User die Möglichkeit haben, zwischen ihnen zu wählen. Implementieren Sie eine einfache Dopdown-Box (java.awt.Choice)
  2. In der Liste sollen die Verzeichnisse von den Dateien getrennt angezeigt werden. Zeigen Sie zunächst die Verzeichnisse, dann ein Trennzeichen, dann die Dateien an.
  3. Dateien sollen bei Doppelklick in SimpleNotepad geöffnet werden! Erweitern Sie dazu am beste SimpleNotepad um einen Konstruktor, der die anzuzeigende Datei aufnimmt.

Musterlösung: java1.aufg.referenz.BetterFileLister

« Exceptions
Java Api
Sammlungsklassen »
Show/Hide Footer Actions

Kommentare:

Sie müssen angemeldet sein um eine Nachricht zu erstellen. Anmelden »
© 2012 Java 1. Alle Rechte vorbehalten.
Anmelden
concrete5 - open source CMS
Theme by Site5 / Mnkras.