09.02 Die Sicht auf das Dateisystem – java.io.File

Neben den Unterschiedlichen Streams – die natürlich nicht alle etwas mit dem Dateisystem zu tun haben – sollten Sie auch die Klasse File aus dem java.io Package kennen. Diese Klasse ermöglicht es Ihnen auf das Dateisystem Ihres Computers zuzugreifen. In diesem Kapitel werden die wichtigsten Funktionen dieser Klasse vorgestellt.

Ein File erstellen

Die einfachste Möglichkeit ein File-Objekt zu erstellen, ist die Übergabe eines Strings, welcher eine Datei oder ein Verzeichnis repräsentiert, im Konstruktor der Klasse.

java.io.File myFile = new java.io.File("C:/AFile.txt");

Somit haben Sie ein Objekt erzeugt, das auf die Datei „AFile.txt“ auf dem Laufwerk „C“ verweist. Beachten Sie, dass Sie das richtige Trennzeichen zwischen Laufwerk und Dateinamen angeben, da es sich von Plattform zu Plattform unterscheiden kann (Linux verwendet z. B. den normalen Slash (/), während Windows hierzu den Backslash (\) einsetzt, aber dennoch einen normalen Slash akzeptiert). Den Datei-Separator können Sie auch ohne Probleme zur Laufzeit durch die Verwendung von

System.getProperty("file.separator");

auslesen.

Falls Sie bereits ein File-Objekt initialisiert haben, welches auf einen Ordner verweist, können Sie dieses in einem neuen File-Objekt auch erweitern. Übergeben Sie hierzu dem Konstruktor das zu erweiternde File-Objekt und die Erweiterung als String. Alternativ können Sie auch zwei Strings übergeben

String strDir = "C:/Programme/";
File progDir = new File(strDir, "MyApplication");
File logFile = new File(progDir, "log.txt");

Als letzte Alternative besteht noch die Möglichkeit, ein File-Objekt aus einer URI zu erstellen.

Selbstverständlich können Sie auch relative Pfade verwenden und müssen so nicht auf absolute Pfade zurückgreifen.

File f = new File("."); // Aktuelles Verzeichnis
File f2 = new File("aDir/aFile.txt"); // Verweis auf die Datei "aFile.txt" im Ordner
                                      // "aDir" des aktuellen Verzeichnisses

WICHTIG: Das aktuelle Verzeichnis ist nicht etwa das Verzeichnis, in welchem Ihre Klasse liegt, sondern aus welchem Ihre Klasse ausgeführt wurde. Es wird also immer vom Ausführungsverzeichnis aus der relative Pfad gebildet.

Informationen eines File-Objekts

Eine einfache Repräsentation eines Pfades ist schön und gut, aber nicht weiter nützlich. Deshalb lesen wir nun einige Informationen eines solchen Objekts aus.

Zuerst ist es wichtig zu wissen, dass ein File nicht zwingend existiert, sondern irgendetwas, was nicht mal die Form einer Datei haben muss, beinhalten kann. Folgendes lässt sich also ohne Probleme kompilieren:

new File("9:/;-?asdf#*11");

Es könnte ja eine Plattform mit JVM existieren, die eine solche Datei handhaben kann. Es ist also sinnvoll zu überprüfen, ob diese Datei oder das Verzeichnis überhaupt existiert. Dies kann mit der Methode exists überprüft werden.

File f = new File("C:/boot.ini");
if (f.exists()) {
  System.out.println("Die Datei 'boot.ini' auf der Festplatte 'C:/' existiert");
}

Des weiteren können Sie mit isDirectory testen, ob es sich um einen Ordner oder eine Datei (isFile) handelt.

File f = new File("C:/boot.ini");
if (f.exists()) {
  if (f.isDirectory()) {
    System.out.println("Das Verzeichnis existiert");
  }
  else if (f.isFile()) {
    System.out.println("Die Datei existiert");
  }
}

canRead gibt zurück, ob die Datei gelesen, canWrite, ob in sie geschrieben, und seit Java 1.6 canExecute, ob die Datei ausgeführt werden kann (siehe Kapitel A) Desktop.

File f = new File("C:/boot.ini");
if (f.exists()) {
  if (f.isDirectory()) {
    System.out.println("Das Verzeichnis existiert");
  }
  else if (f.isFile()) {
    System.out.println("Die Datei existiert");
    if (f.canRead()) {
      System.out.println("Datei kann gelesen werden");
    }
    if (f.canWrite()) {
      System.out.println("In die Datei kann geschrieben werden");
    }
    if (f.canExecute()) {
      System.out.println("Datei kann ausgeführt werden");
    }
  }
}

Mit isHidden testen Sie, ob der Pfad versteckt ist, lastModified gibt das Datum der letzten Änderung zurück und length die Größe der Datei.

File f = new File("C:/boot.ini");
if (f.exists()) {
  if (f.isDirectory()) {
    System.out.println("Das Verzeichnis existiert");
  }
  else if (f.isFile()) {
    System.out.println("Die Datei existiert");
    if (f.canRead()) {
      System.out.println("Datei kann gelesen werden");
    }
    if (f.canWrite()) {
      System.out.println("In die Datei kann geschrieben werden");
    }
    if (f.canExecute()) {
      System.out.println("Datei kann ausgeführt werden");
    }
    System.out.println("Die Datei ist " + f.length() + " Bytes groß");
  }
  if (f.isHidden()) {
    System.out.println("Das Objekt ist versteckt");
  }
  System.out.println("Das Objekt wurde zuletzt am " + f.lastModified() + " (Millisekunden) manipuliert");
}

Natürlich können Sie die Rückgabe von lastModified noch lesbarer Ausgeben. Dies wird aber erst in einem späteren Kapitel behandelt.

Die Attribute können größtenteils auch über die zugehörigen Setter-Methoden gesetzt werden.

Des weiteren gibt es die erwähnenswerten Methoden getParent/getParentFile, welche das übergeordnete Verzeichnis zurückgeben, isAbsolute, die testet, ob es sich um einen absoluten oder relativen Pfad handelt und getAbsolutePath/getAbsoluteFile, welche einen relativen in einen absoluten Pfad umwandeln.

Sie können auch alle Ordner und Dateien, die sich in einem Verzeichnis befinden, ganz einfach auslesen:

if (file.isDirectory()) {
  File[] files = file.listFiles();
}

Mit Java 1.6 hat java.io.File Methoden erhalten, die auf den lokalen Datenträger zugreifen. getFreeSpace, gibt den freien Speicher auf der Partition zurück, auf welcher sich der Pfad des Files befindet. Ganz ähnlich zu getUsableSpace, welche den nutzbaren Speicher zurück gibt. Den kompletten Speicher erhalten Sie mit getTotalSpace.

Manipulation des Dateisystems

Mit java.io.File haben Sie die Möglichkeit, das Dateisystem zu manipulieren. Also bspw. Dateien zu löschen, zu erstellen, zu verschieben oder umzubenennen. Sehen Sie sich hierzu folgenden Quellcode an:

File f = new File("C:/Users/Stefan/mydir/test.txt");
// Testen ob die Datei existiert, falls ja => löschen
if (f.exists()) {
  f.delete();
}
// Falls die Datei nicht exisitert, testen ob das Verzeichnis existiert
else if (!f.getParentFile().exists()) {
  // Falls nicht, erzeugen
  f.getParentFile().mkdirs();
}
// Datei erzeugen
f.createNewFile();
// Datei verschieben
f.renameTo(new File(f.getParent(), "myFile.txt"));

Sie können aber auch lediglich temporäre Dateien erzeugen. Verwenden Sie hierzu die Methode createTempFile. Diese sollten Sie beim Ende Ihres Programms unter Umständen wieder löschen. Dafür bietet sich die Methode deleteOnExit an.

4 Replies to “09.02 Die Sicht auf das Dateisystem – java.io.File”

  1. TdC

    Wie kann ich überprüfen ob in einem Verzeichnis eine Datei ist?

    Ich möchte eine überwachung eines Orders und fals eine Daten vorhanden ist möchte ich sie in ein anderes Verzeichnis kopieren.

    Gruess
    TdC

  2. Stefan Kiesel

    Hallo TdC!

    Im Kapitel wird die Methode File#listFiles() vorgestellt, mit welcher alle Dateien in einem Verzeichnis zurückgegeben werden. Man könnte nun über den Rückgabewert dieser Methode iterieren und jedes File-Objekt mit isFile() überprüfen, ob es sich um eine Datei handelt.

    File directory = new File("C:/");
    File[] files = directory.listFiles();
    int count = 0;
    for (File f : files) {
      if (f.isFile()) {
        count++;
      }
    }
    System.out.println("Es befinden sich " + count + " Dateien im Ordner");

    Gruß
    Stefan

  3. Susann

    Hallo,

    die Beschreibung ist sehr hilfreich, jedoch habe ich noch ein kleines Problem.
    Ich schreibe mal den kleinen Quelltext auf, den ich gerade versuche zu interpretieren. Vielleicht kann mir jdm. weiterhelfen.

    String teststring [] = fi.list(); // das versteh ich noch 🙂
    for (int i = 0; i<teststring.length; i++){
    System.out.print (teststring [i]);
    String fn = fi.getAbsolutPath() +"/"+teststring [i];
    File fl = new File (fn);
    System.out.println ("\t \t — Filegröße "+
    fl.length() + " Byte");
    }

    vielen Dank im Voraus
    Gruß
    Susann

  4. Stefan Kiesel

    Hallo Susann,

    ich kommentiere mal den Quelltext, evtl. wird es dann klarer. Ansonsten bitte konkreter fragen.

    String teststring [] = fi.list(); // Alle Dateien in fi in das String-Array schreiben 
    for (int i = 0; i<teststring.length; i++){ // Das String-Array durchlaufen
      System.out.print (teststring [i]); // Die "aktuelle" Datei im String-Array ausgeben
      // Den Pfad des Hauptverzeichnisses absolut (bspw. C:\Programme) mit einem "/" und dem aktuellen Wert 
      // im String-Array verknüpfen, und in die Variable "fn" schreiben
      String fn = fi.getAbsolutPath() +"/"+teststring [i]; 
      File fl = new File (fn); // Aus fn ein File machen
      System.out.println ("\t \t — Filegröße "+ fl.length() + " Byte"); // Die Größe der Datei in Byte ausgeben
    }

    Hoffe das hat geholfen.

    Gruß
    Stefan

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.