Was ist ein Dateipfad?
Absolute und relative Pfade
Ein Pfad kann auf zweierlei Weisen angegeben werden:
- Absolute Pfade verzeichnen den Weg zu einer Datei
oder einem Verzeichnis ausgehend vom Wurzelverzeichnis des
Betriebssystems. Das Wurzelverzeichnis in unixoiden
Betriebssystemen ist '
/
', unter Windows ist dies der Laufwerksbuchstabe. - Relative Pfade geben den Weg zu einer Datei oder einem Verzeichnis an ausgehend von der Position eines Bezugspunktes innerhalb des Dateisytems.
Im Folgenden soll die Referenzierung von Dateien und Verzeichnissen über Pfade demonstriert werden, ohne dass an dieser Stelle auf die verschiedenen Verwendungszwecke eingegangen wird.
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 marc
unter /Users/marc
. Der absolute Pfad zur Datei Test.java
würde in diesem Fall lauten:
/Users/marc/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
Man beachte, dass am Anfang des relativen Pfades kein '/' steht. Wäre das der Fall, so würde dies auf die Wurzel des Dateisystems verweisen und es sich somit um einen absoluten Pfad handeln.
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 folglich:
../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/marc/Documents/workspace_4.4/Javabeginners System.setProperty("user.dir", "/Users/marc/Desktop"); System.out.println(System.getProperty("user.dir")); // /Users/marc/Desktop // Hier wird statt des Desktops weiterhin das Workspace-Verzeichnis als Arbeitsverzeichnis verwendet System.out.println(path.toAbsolutePath()); // /Users/marc/Documents/workspace_4.4/Javabeginners/src/de/javabeginners/test/Test.java System.out.println(rel.toAbsolutePath()); // /Users/marc/Documents/workspace_4.4/Javabeginners/../../../../img/wien.jpg
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.