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.
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.
new File("Example1309.java");
new File("c:\\arc\\doku\\javacafe\\kap01.doc");
new File(".","Example1309.java");
new File("c:\\config.sys");
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.
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.
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.
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