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.
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
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 jedesFile
-Objekt mitisFile()
überprüfen, ob es sich um eine Datei handelt.Gruß
Stefan
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
Hallo Susann,
ich kommentiere mal den Quelltext, evtl. wird es dann klarer. Ansonsten bitte konkreter fragen.
Hoffe das hat geholfen.
Gruß
Stefan