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

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

1. Überblick

Die Klassejava.io.File verfügt über drei Methoden -getPath(),getAbsolutePath() undgetCanonicalPath() -, um den Dateisystempfad zu erhalten.

In diesem Artikel werden die Unterschiede zwischen ihnen kurz erläutert und ein Anwendungsfall erläutert, 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:

|-- example
    |-- example.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 dieString-Darstellung des abstrakten Pfadnamens der Datei zurück. Dies ist im Wesentlichenthe pathname passed to the File constructor.

Wenn also dasFile-Objekt unter Verwendung eines relativen Pfads erstellt wurde, wäre der von dergetPath()-Methode zurückgegebene Wert auch ein relativer Pfad.

Wenn wir den folgenden Code aus dem Verzeichnis\{user.home}/exampleaufrufen:

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

Die Variablepath hätte den Wert:

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

Beachten Sie, dass das Name-Separator-Zeichen für das Windows-System von dem an den Konstruktor übergebenen Schrägstrich (/) in den umgekehrten Schrägstrich (\) geändert wurde. Dies liegt daran, dassthe returned String always uses the platform’s default name-separator character.

2.2. getAbsolutePath()

Die MethodegetAbsolutePath() gibtthe pathname of the file after resolving the path for the current user directory zurück - dies wird als absoluter Pfadname bezeichnet. Für unser vorheriges Beispiel würdefile.getAbsolutePath() also zurückgeben:

/home/username/example/foo/foo-one.txt     // on Unix systems
C:\Users\username\example\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}/example: ausführen

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

Der Wert der Variablenpath wäre:

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

2.3. getCanonicalPath()

Die MethodegetCanonicalPath() geht noch einen Schritt weiter undresolves the absolute pathname as well as the shorthands or redundant names like “.” and “.. gemäß der Verzeichnisstruktur. Es ist auchresolves symbolic links auf Unix-Systemen undconverts the drive letter to a standard case auf Windows-Systemen.

Für das vorherige Beispiel würde die MethodegetCanonicalPath()also Folgendes zurückgeben:

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

Nehmen wir ein anderes Beispiel. Bei einem aktuellen Verzeichnis als$\{user.home}/example undFile Objekt, das mit dem Parameternew File(“bar/baz/./baz-one.txt”) erstellt wurde, wäre die Ausgabe fürgetCanonicalPath():

/home/username/example/bar/baz/baz-one.txt     // on Unix systems
C:\Users\username\example\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. the canonical path will always be unique, da alle derartigen Darstellungen aufgelöst sind.

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

Wenn wir beispielsweise auf Windows-Systemen einFile-Objekt mit einem der unzulässigen Zeichen erstellen, wird beim Auflösen des kanonischen Pfads einIOException ausgelöst:

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

3. Anwendungsfall

Angenommen, wir schreiben eine Methode, die einFile-Objekt als Parameter verwendet und dessenfully qualified name in einer Datenbank speichert. Wir wissen nicht, ob der Pfad relativ ist oder Kurzschrift enthält. In diesem Fall möchten wir möglicherweisegetCanonicalPath() verwenden.

Da jedochgetCanonicalPath() das Dateisystem liest, entstehen Leistungskosten. 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 wirgetAbsoultePath()bevorzugen.

4. Fazit

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

EineJunit-Testklasse, die die Beispiele dieses Artikels demonstriert, befindet sich inover on GitHub.