Vergleichen von getPath (), getAbsolutePath () und getCanonicalPath () in Java

1. Übersicht

Die Klasse java.io.File verfügt über drei Methoden - getPath () , getAbsolutePath () und getCanonicalPath () -, um den Dateisystempfad abzurufen .

In diesem Artikel werfen wir einen kurzen Blick auf die Unterschiede zwischen ihnen und diskutieren einen Anwendungsfall, bei dem Sie einen über den anderen verwenden können.

2. Methodendefinitionen und Beispiele

Lassen Sie uns zunächst die Definitionen der drei Methoden zusammen mit Beispielen durchgehen, die darauf basieren, dass die folgende Verzeichnisstruktur im Ausgangsverzeichnis des Benutzers vorhanden ist:

|-- baeldung |-- baeldung.txt |-- foo | |-- foo-one.txt | \-- foo-two.txt \-- bar |-- bar-one.txt |-- bar-two.txt \-- baz |-- baz-one.txt \-- baz-two.txt

2.1. getPath ()

Einfach ausgedrückt, getPath () gibt die String- Darstellung des abstrakten Pfadnamens der Datei zurück. Dies ist im Wesentlichen der Pfadname zu dem übergebenen Datei Konstruktor .

Also, wenn das Datei - Objekt erstellt wurde einen relativen Pfad, den zurückgegebenen Wert von getPath () Methode wäre auch ein relativer Pfad sein.

Wenn wir den folgenden Code aus dem Verzeichnis {user.home} / baeldung aufrufen :

File file = new File("foo/foo-one.txt"); String path = file.getPath();

Der Pfad - Variable würde den Wert hat:

foo/foo-one.txt // on Unix systems foo\foo-one.txt // on Windows systems

Beachten Sie, dass für das Windows-System das Name-Trennzeichen vom Schrägstrich (/), der an den Konstruktor übergeben wurde, zum Backslash-Zeichen (\) geändert wurde. Dies liegt daran, dass der zurückgegebene String immer das Standard-Trennzeichen der Plattform verwendet .

2.2. getAbsolutePath ()

Die Methode getAbsolutePath () gibt den Pfadnamen der Datei zurück, nachdem der Pfad für das aktuelle Benutzerverzeichnis aufgelöst wurde. Dies wird als absoluter Pfadname bezeichnet. In unserem vorherigen Beispiel würde file.getAbsolutePath () Folgendes zurückgeben:

/home/username/baeldung/foo/foo-one.txt // on Unix systems C:\Users\username\baeldung\foo\foo-one.txt // on Windows systems

Diese Methode löst nur das aktuelle Verzeichnis für einen relativen Pfad auf. Kurzdarstellungen (wie " ." Und " .." ) werden nicht weiter aufgelöst. Daher, wenn wir den folgenden Code aus dem Verzeichnis {user.home} / baeldung ausführen:

File file = new File("bar/baz/../bar-one.txt"); String path = file.getAbsolutePath();

Der Wert des variablen Pfads wäre:

/home/username/baeldung/bar/baz/../bar-one.txt // on Unix systems C:\Users\username\baeldung\bar\baz\..\bar-one.txt // on Windows systems

2.3. getCanonicalPath ()

Die Methode getCanonicalPath () geht noch einen Schritt weiter und löst den absoluten Pfadnamen sowie die Abkürzungen oder redundanten Namen wie “auf . ”Und“ .. gemäß Verzeichnisstruktur. Es löst auch symbolische Verknüpfungen auf Unix-Systemen auf und konvertiert den Laufwerksbuchstaben in einen Standardfall auf Windows-Systemen.

Für das vorherige Beispiel würde die Methode getCanonicalPath () Folgendes zurückgeben:

/home/username/baeldung/bar/bar-one.txt // on Unix systems C:\Users\username\baeldung\bar\bar-one.txt // on Windows systems

Nehmen wir ein anderes Beispiel. Angesichts der aktuellen Verzeichnis als $ {user.home} / baeldung und Datei - Objekt erstellt den Parameter mit neuen Datei ( „bar / baz /./ baz-eins.txt“) , wird der Ausgang für getCanonicalPath () wäre:

/home/username/baeldung/bar/baz/baz-one.txt // on Unix systems C:\Users\username\baeldung\bar\baz\baz-one.txt // on Windows Systems

Es ist erwähnenswert, dass eine einzelne Datei im Dateisystem unendlich viele absolute Pfade haben kann, da es unendlich viele Möglichkeiten gibt, Kurzdarstellungen zu verwenden. Der kanonische Pfad ist jedoch immer eindeutig, da alle derartigen Darstellungen aufgelöst werden.

Im Gegensatz zu den letzten beiden Methoden kann getCanonicalPath () eine IOException auslösen, da Dateisystemabfragen erforderlich sind.

Zum Beispiel auf Windows - Systemen, wenn wir ein erstellen Datei - Objekt mit einem der ungültigen Zeichen, den kanonischen Pfades Lösung wird einen Wurf IOException :

new File("*").getCanonicalPath();

3. Anwendungsfall

Angenommen, wir schreiben eine Methode, die ein Dateiobjekt als Parameter aufnimmt und seinen vollständig qualifizierten Namen in einer Datenbank speichert. Wir wissen nicht, ob der Pfad relativ ist oder Abkürzungen enthält. In diesem Fall möchten wir möglicherweise getCanonicalPath () verwenden .

Da getCanonicalPath () das Dateisystem liest, ist dies jedoch mit Leistungskosten verbunden. Wenn wir sicher sind, dass keine redundanten Namen oder symbolischen Links vorhanden sind und die Groß- und Kleinschreibung des Laufwerksbuchstabens standardisiert ist (wenn ein Windows-Betriebssystem verwendet wird), sollten wir getAbsoultePath () bevorzugen .

4. Fazit

In diesem kurzen Tutorial haben wir die Unterschiede zwischen den drei Dateimethoden zum Abrufen des Dateisystempfads behandelt. Wir haben auch einen Anwendungsfall gezeigt, bei dem eine Methode der anderen vorgezogen werden kann.

Eine Junit-Testklasse , die die Beispiele dieses Artikels demonstriert, finden Sie auf GitHub.