Was ist ein Dateipfad?

Ein Dateipfad gibt den eindeutigen Speicherort eines Verzeichnisses oder einer Datei durch die hierarchische Auflistung der Elternverzeichnisse in einem Dateisystem an.

Absolute und relative Pfade

Ein Pfad kann auf zweierlei Weisen angegeben werden:

Im Folgenden soll die Referenzierung von Dateien und Verzeichnissen über Pfade demonstriert werden, ohne dass an dieser Stelle auf die verschiedenen Verwendungszwecke eingegangen wird.

Abbildung eines Dateipfades Die nebenstehende Abbildung zeigt den Inhalt eines Verzeichnisses in einem unixoiden Dateisystem (Mac OSX), wie es auch für z.B. Linux oder BSD-Derivate zutrifft. Auf oberster Ebene liegen hier drei Verzeichnisse und eine Datei parallel zueinander: img, META-INF, src und TODO.txt, wobei src weitere Unterverzeichnisse enthält, in dessen unterstem, test, sich die Datei Test.java befindet.

Absolute Pfadangaben

Nehmen wir an, das Verzeichnis, dessen gesamter Inhalt in der Abbildung dargestellt ist, trüge den Namen beispiel und läge im Heimatverzeichnis des Users joecze unter /Users/joecze. Der absolute Pfad zur Datei Test.java würde in diesem Fall lauten:

/Users/joecze/beispiel/src/de/javabeginners/test/Test.java

Der Pfad setzt sich somit aus einer von links nach rechts laufenden ununterbrochenen Reihe von Verzeichnisnamen ausgehend vom Wurzelverzeichnis des Rechners ('/') zusammen. Auf diese Weise verweist ein absoluter Pfad eindeutig auf das jeweilige Verweisziel. Zur Separierung der einzelnen Verzeichnisnamen wird der systemeigene Dateitrenner verwendet, hier ebenfalls ('/').

Befände sich das Verzeichnis beispiel auf einem Windows-Rechner, direkt im Wurzelverzeichnis des Laufwerks C:, so ergäbe sich auf Grund des anderen Dateitrenners ('\') der folgende absolute Pfad:

C:\beispiel\src\de\javabeginners\test\Test.java

Relative Pfadangaben

Eine relative Pfadangabe gibt den Weg zu einer Datei oder zu einem Verzeichnis nicht ausgehend vom Wurzelverzeichnis des Systems an, sondern ausgehend von einem Bezugspunkt, d.h. einer anderen Datei oder einem anderen Verzeichnis.
Liegt eine zu referenzierende Datei dabei weiter unten in der Hierarchie des Dateisystems, so wird für einen relativen Pfad einfach die Verzeichnisstruktur ausgehend von der referenzierenden Datei aus notiert. Soll z.B. in Utils.java eine Referenz auf Test.java erfolgen, so lautet der relative Pfad ausgehend von Utils.java zu Test.java:

test/Test.java

Erklärung:
Das Verzeichnis test und die Datei Utils.java liegen auf gleicher Ebene parallel zueinander im Verzeichnis javabeginners. Um zu Test.java zu gelangen, muss somit ausgehend von Utils.java das Verzeichnis test betreten werden, in dem sich dann Test.java befindet.

Ausgehend von TODO.txt ergäbe sich zu Test.java der folgende relative Pfad:

src/de/javabeginners/test/Test.java

Soll eine vom Bezugspunkt aus in der Dateihierarchie weiter oben gelegene Datei referenziert werden, so kennzeichnet die Zeichenfolge .. den Aufstieg auf die nächst höhere Ebene.
Soll in Test.java die Datei Utils.java durch einen relativen Pfad angesprochen werden, so lautet dieser:

../Utils.java

Erklärung:
Von der Ebene, in der sich Test.java befindet, also von innerhalb des Verzeichnisses test, gehe eine Ebene nach oben (in das Verzeichnis javabeginners) und finde dort die Datei Utils.java.

Soll die Datei wien.jpg ausgehend von Test.java referenziert werden, so muss zunächst über javabeginners, de und src bis in das in der Abbildung oberste Verzeichnis beispiel aufgestiegen und von dort aus in das Verzeichnis img abgestiegen werden. Der Pfad lautet dann:

../../../../img/wien.jpg

Pfadangaben in Java

Java-Programme sind plattformübergreifend lauffähig. Dies hat auch Auswirkungen auf die Pfadangaben. Zum Einen sollte auf absolute Pfadangaben i.A. verzichtet werden, zum Anderen gilt es, den Dateitrenner dynamisch anzupassen. Hierzu kann in Java die entsprechende Eigenschaft der System-Properties verwendet werden:

String fs = System.getProperty("file.separator");

Der o.a. relative Pfad auf wien.jpg ließe sich somit folgendermaßen aufbauen:

String fs = System.getProperty("file.separator");
String pu = ".." + fs;
String path = pu + pu + pu + pu + "img" + fs + "wien.jpg";

Auf diese Weise wird sichergestellt, dass auf allen Systemen, auf denen ein JRE läuft, auch der korrekte Pfad angegeben wird.

Das Interface java.nio.file.Path und die Klasse java.nio.file.Paths v.7.0

Zur Verwaltung von Pfaden stellt Java ab der Version 7.0 das Interface Path und die Klasse Paths bereit. Ein Objekt des Typs Path kann z.B. über den Umweg der Ermittlung des aktuellen Betriebssystems und die Angabe der im Pfad vorliegenden Verzeichnisse konstruiert werden. Hierzu steht die Methode FileSystem#getPath() bereit. Der erzeugte Pfad muss auf dem System nicht wirklich existieren. Ein entsprechender Test ist bei der Weiterarbeit somit unabdingbar.

// path speichert: src/de/javabeginners/test/Test.java
Path path = FileSystems.getDefault().getPath("src", "de", "javabeginners", "test", "Test.java");

Die Methode erwartet als ersten Parameter das Wurzelverzeichnis des Pfades als String und als zweiten eine variable Anzahl an in der Pfadhierarchie aufeinanderfolgenden Verzeichnisnamen.
Eine weitere Möglichkeit, ein Path-Objekt zu erzeugen, besteht darin, den Pfad als String der statischen Methode Paths.get() zu übergeben.

Path abs = Paths.get("src/de/javabeginners/test/Test.java");

Die Methode ist überladen und kann auch ein URI-Objekt als Parameter übergeben bekommen.

Die Konstruktion relativer Pfade fällt mit Hilfe von Path-Objekten sehr leicht: Die Methode Path#relativize() ist geeignet, ausgehend von einem Basispfad und einem Zielpfad einen relativen Pfad zu ermitteln:

Path abs = Paths.get("beispiel/img/wien.jpg");
Path base = Paths.get("beispiel/src/de/javabeginners/test/");
Path rel = base.relativize(abs);
System.out.println(rel); // ../../../../img/wien.jpg

Umgekehrt kann, ausgehend vom aktuellen Arbeitsverzeichnis, durch die Methode toAbsolutePath() aus einem relativen auch ein absoluter Pfad erstellt werden. Diese Möglichkeiten sind jedoch begrenzt, da der relative Pfad an den Pfad zum Arbeitsverzeichnis lediglich 'angehängt' wird. Auch wird ein Neueintrag des Arbeitsverzeichnisses in die System-Eigenschaften nicht akzeptiert. Unter Verwendung der obigen Variablenbelegungen ergibt sich:

System.out.println(System.getProperty("user.dir")); // /Users/joecze/Documents/workspace_4.4/Javabeginners
System.setProperty("user.dir", "/Users/joecze/Desktop");
System.out.println(System.getProperty("user.dir")); // /Users/joecze/Desktop
// Hier wird statt des Desktops weiterhin das Workspace-Verzeichnis als Arbeitsverzeichnis verwendet
System.out.println(path.toAbsolutePath()); // /Users/joecze/Documents/workspace_4.4/Javabeginners/src/de/javabeginners/test/Test.java
System.out.println(rel.toAbsolutePath()); // /Users/joecze/Documents/workspace_4.4/Javabeginners/../../../../img/wien.jpg