Guido Krüger - JAVA 1.1 lernen - Kapitel 13

Previous Page Previous Page TOC TOC Index Next Page Previous Page



Datei- und Verzeichnis-Handling

Im Paket java.io gibt es eine Klasse File, die als Abstraktion eines Dateinamens angesehen werden kann. Im Gegensatz zu den bisher besprochenen Klassen spielt der Inhalt einer Datei in der Klasse File keine Rolle. Statt dessen abstrahiert File den Namen und Zugriffspfad einer Datei und die Eigenschaften, die im Verzeichnis, in dem die Datei liegt, über sie gespeichert sind. Neben Dateien kann ein File-Objekt auch Verzeichnisse repräsentieren.

Konstruktion eines File-Objektes

Die Klasse File besitzt drei Konstruktoren:

public File(String path);

public File(String path, String name);

public File(File dir, String name)

Wird lediglich der String path übergeben, so wird ein File-Objekt zu dem angegebenen Datei- oder Verzeichnisnamen konstruiert. Alternativ dazu kann der zweite Konstruktor verwendet werden, wenn Verzeichnis- und Dateiname getrennt übergeben werden sollen. Eine ähnliche Funktion übernimmt auch der dritte Konstruktor. Hier wird allerdings der übergebene Verzeichnisname als File-Objekt zur Verfügung gestellt.

Warnung

Bei der Übergabe von Verzeichnisnamen sollten diese nicht mit dem Separatorzeichen abgeschlossen werden, andernfalls werden Pfad- und Verzeichnisname falsch zusammengesetzt. Ähnliche Probleme gibt es auch, wenn als Verzeichnisname das Stammverzeichnis eines Laufwerks angegeben wird. Auch hier kann es zu Fehlern bei der Konstruktion der Dateinamen kommen. Außerdem ist bei der Konstruktion von Datei- und Verzeichnisnamen unter MS-DOS zu beachten, daß der Separator gleichzeitig Escape-Zeichen für Strings ist und daher in Verzeichnis- oder Dateiliteralen doppelt geschrieben werden muß. Beispiele für gültige Konstruktoraufrufe sind:

new File("Example1309.java");
new File("c:\\arc\\doku\\javacafe\\kap01.doc");
new File(".","Example1309.java");
new File("c:\\config.sys");

Zugriff auf Teile des Pfadnamens

Nachdem ein File-Objekt konstruiert ist, können die Methoden zum Zugriff auf die einzelnen Bestandteile des Dateinamens aufgerufen werden:

public String getName();
public String getPath();
public String getAbsolutePath();
public String getParent();

getName liefert den Namen der Datei oder des Verzeichnisses; eventuelle Verzeichnisinformationen sind nicht darin enthalten. getPath liefert den kompletten Namen inklusive darin enthaltener Verzeichnisinformationen.

Mit getAbsolutePath kann der absolute Pfadname für das File-Objekt ermittelt werden. Wurde das File-Objekt mit Hilfe eines absoluten Pfadnamens konstruiert, so liefert getAbsolutePath genau diesen Namen. Wurde es dagegen mit einem relativen Namen konstruiert, so stellt getAbsolutePath den Namen des aktuellen Verzeichnisses vor den Namen. Dabei werden allerdings die Namen "." und ".." nicht interpretiert, so daß leicht Pfadangaben wie "C:\ARC\DOKU\javacafe\examples\.\Example1309.java" entstehen können, die in der Mitte einen oder mehrere Punkte enthalten.

Schließlich gibt es noch die Methode getParent, die den Namen des Vaterverzeichnisses ermittelt. Ist dies nicht möglich, so liefert getParent null zurück.

Informationen über die Datei

Die Klasse File besitzt eine ganze Reihe von Methoden, um Informationen über die durch das File-Objekt bezeichnete Datei oder das Verzeichnis zu gewinnen:

public boolean exists();
public boolean canWrite();
public boolean canRead();
public boolean isFile();
public boolean isDirectory();
public boolean isAbsolute();
public long lastModified();
public long length();

Mit exists kann getestet werden, ob die Datei oder das Verzeichnis überhaupt existiert. Die Methoden canWrite und canRead ermitteln, ob ein lesender bzw. schreibender Zugriff möglich ist. Mit isFile und isDirectory kann unterschieden werden, ob es sich um eine Datei oder ein Verzeichnis handelt. isAbsolute gibt an, ob das Objekt mit Hilfe einer absoluten Pfadbezeichung konstruiert wurde.

lastModified liefert den Zeitpunkt der letzten Änderung der Datei. Die API-Referenz empfiehlt, den Rückgabewert dieser Methode nur zum Vergleich mit anderen Zeitstempeln zu verwenden und weist darauf hin, daß er systemabhängig ist und keine absolute Aussagekraft hat. Möglicherweise kann er jedoch zur Konstruktion eines Date-Objekts verwendet werden, um das tatsächliche Datum und die Uhrzeit herauszufinden, aber das ist nicht garantiert. Die Methode length liefert die Länge der Datei.

Zugriff auf Verzeichnisse

Wurde ein File-Objekt für ein Verzeichnis konstruiert, so stehen weitere Methoden zur Verfügung, um auf die zusätzlichen Funktionen eines Verzeichnisses zuzugreifen. Mit Hilfe der Methode list ist es beispielsweise möglich, den Inhalt des Verzeichnisses auszulesen:

public String[] list();

list liefert ein Array von Strings, das für jeden gefundenen Verzeichniseintrag ein Element enthält. Die Liste enthält die Namen aller Dateien und Unterverzeichnisse mit Ausnahme von "." und "..". list gibt es noch in einer zweiten Variante, bei der die Auswahl der Verzeichniseinträge eingeschränkt werden kann. Dabei muß ein Objekt übergeben werden, das das Interface FilenameFilter implementiert. Dieses besitzt eine Methode accept, die für jede gefundene Datei aufgerufen wird und entscheidet, ob sie in die Liste aufgenommen werden soll oder nicht.

Neben dem Zugriff auf die Verzeichniseinträge gibt es in der Klasse File auch Methoden, um Dateien oder Verzeichnisse zu löschen oder umzubenennen und um Verzeichnisse neu anzulegen:

public boolean mkdir();
public boolean renameTo(File dest);
public boolean delete();

Die Methode delete löscht die durch das File-Objekt bezeichnete Datei. Mit renameTo wird das File-Objekt in das als Parameter übergebene Objekt umbenannt. Durch Aufruf von mkdir wird das spezifizierte Verzeichnis angelegt. Alle Methoden geben true zurück, wenn sie ihre Aufgabe erfolgreich ausführen konnten; andernfalls geben sie false zurück.

Beispiel

Das folgende Listing zeigt die Verwendung der Klasse File und den Aufruf verschiedener Methoden:

import java.io.*;
import java.util.*;

public class Example1310 {
   public static void main(String[] args)
   {
      File fil = new File("Example1310.java");
      Example1310.printFileInfo(fil);
      fil = new File("..");
      Example1310.printFileInfo(fil);
   }

   static void printFileInfo(File fil)
   {
      System.out.println("Name= "+fil.getName());
      System.out.println("Path= "+fil.getPath());
      System.out.println("AbsolutePath= "+fil.getAbsolutePath());
      System.out.println("Parent= "+fil.getParent());
      System.out.println("exists= "+fil.exists());
      System.out.println("canWrite= "+fil.canWrite());
      System.out.println("canRead= "+fil.canRead());
      System.out.println("isFile= "+fil.isFile());
      System.out.println("isDirectory= "+fil.isDirectory());
      if (fil.isDirectory()) {
         String fils[] = fil.list();
         for (int i=0; i<fils.length; ++i) {
            System.out.println("  "+fils[i]);
         }
      }
      System.out.println("isAbsolute= "+fil.isAbsolute());
      System.out.println(
         "lastModified= "+(new Date(fil.lastModified()))
      );
      System.out.println("length= "+fil.length());
      System.out.println("");
   }
}

Ein Aufruf des Programms liefert folgende Ausgabe:

Name= Example1310.java
Path= Example1310.java
AbsolutePath= C:\ARC\DOKU\java\examples\Example1310.java
Parent= null
exists= true
canWrite= true
canRead= true
isFile= true
isDirectory= false
isAbsolute= false
lastModified= Sun Jan 05 17:15:56  1997
length= 1242

Name= ..
Path= ..
AbsolutePath= C:\ARC\DOKU\java\examples\..
Parent= null
exists= true
canWrite= true
canRead= true
isFile= false
isDirectory= true
  KAP05.DOC
  examples
  KAP12.DOC
  KAP04.DOC
  KAP06.DOC
  INDEX.DOC
  INHALT.DOC
...
  KAP02.DOC
  KAP24.DOC
isAbsolute= false
lastModified= Tue Mar 04 19:41:06 GMT+00:00 1997
length= 0


Previous Page Previous Page Page Top TOC Index Next Page Previous Page

(C) 1997 Guido Krueger, "Java 1.1 lernen", Addison-Wesley, Bonn, 1997