Was ist der Unterschied zwischen getPath()
, getAbsolutePath()
y getCanonicalPath()
in Java?
Und wann verwende ich sie?
Was ist der Unterschied zwischen getPath()
, getAbsolutePath()
y getCanonicalPath()
in Java?
Und wann verwende ich sie?
Betrachten Sie diese Dateinamen:
C:\temp\file.txt
- Dies ist ein Pfad, ein absoluter Pfad und ein kanonischer Pfad.
.\file.txt
- Dies ist ein Weg. Es ist weder ein absoluter Pfad noch ein kanonischer Pfad.
C:\temp\myapp\bin\..\\..\file.txt
- Dies ist ein Pfad und ein absoluter Pfad. Es handelt sich nicht um einen kanonischen Pfad.
Ein kanonischer Pfad ist immer ein absoluter Pfad.
Die Umwandlung eines Pfades in einen kanonischen Pfad macht ihn absolut (normalerweise wird das aktuelle Arbeitsverzeichnis angehängt, z. B. ./file.txt
wird c:/temp/file.txt
). Der kanonische Pfad einer Datei "säubert" den Pfad und entfernt und löst Dinge auf wie ..\
und das Auflösen von Symlinks (auf Unixen).
Beachten Sie auch das folgende Beispiel mit nio.Paths:
String canonical_path_string = "C:\\Windows\\System32\\";
String absolute_path_string = "C:\\Windows\\System32\\drivers\\..\\";
System.out.println(Paths.get(canonical_path_string).getParent());
System.out.println(Paths.get(absolute_path_string).getParent());
Obwohl sich beide Pfade auf denselben Ort beziehen, wird die Ausgabe ganz anders aussehen:
C:\Windows
C:\Windows\System32\drivers
Der beste Weg, um ein Gefühl für solche Dinge zu bekommen, ist, sie auszuprobieren:
import java.io.File;
public class PathTesting {
public static void main(String [] args) {
File f = new File("test/.././file.txt");
System.out.println(f.getPath());
System.out.println(f.getAbsolutePath());
try {
System.out.println(f.getCanonicalPath());
}
catch(Exception e) {}
}
}
Ihre Ausgabe wird in etwa so aussehen:
test\..\.\file.txt
C:\projects\sandbox\trunk\test\..\.\file.txt
C:\projects\sandbox\trunk\file.txt
Donc, getPath()
gibt den Pfad auf der Grundlage des File-Objekts an, der relativ sein kann, aber nicht muss; getAbsolutePath()
gibt einen absoluten Pfad zu der Datei an; und getCanonicalPath()
gibt Ihnen den eindeutigen absoluten Pfad zu der Datei an. Beachten Sie, dass es eine große Anzahl absoluter Pfade gibt, die auf dieselbe Datei verweisen, aber nur einen kanonischen Pfad.
Wann sollte man sie einsetzen? Es hängt davon ab, was Sie erreichen wollen, aber wenn Sie versuchen zu sehen, ob zwei Files
auf dieselbe Datei auf der Festplatte verweisen, können Sie ihre kanonischen Pfade vergleichen. Nur ein Beispiel.
Kurz gesagt:
getPath()
erhält die Pfadzeichenfolge, die der File
Objekt erstellt wurde, und es kann das relative aktuelle Verzeichnis sein.getAbsolutePath()
ruft die Pfadzeichenfolge ab, nachdem sie gegen das aktuelle Verzeichnis aufgelöst wurde, falls sie relativ ist, was zu einem vollständig qualifizierten Pfad führt.getCanonicalPath()
liefert den Pfadstring, nachdem ein relativer Pfad zum aktuellen Verzeichnis aufgelöst wurde, und entfernt alle relativen Pfadangaben ( .
y ..
) und alle Dateisystemverknüpfungen, um einen Pfad zurückzugeben, den das Dateisystem als den kanonischen Verweis auf das Dateisystemobjekt betrachtet, auf das er zeigt.Außerdem gibt es für jede dieser Funktionen ein Datei-Äquivalent, das die entsprechende File
objeto.
Beachten Sie, dass Java IMO die Implementierung eines "absoluten" Pfades falsch verstanden hat; es sollte eigentlich alle relativen Pfadelemente in einem absoluten Pfad entfernen. Die kanonische Form würde dann alle FS-Links oder Verzweigungen im Pfad entfernen.
getPath()
gibt den Pfad zurück, der zur Erstellung der File
Objekt. Dieser Rückgabewert ändert sich nicht, je nachdem, wo er ausgeführt wird (die folgenden Ergebnisse gelten für Windows, die Trennzeichen sind anderswo offensichtlich anders)
File f1 = new File("/some/path");
String path = f1.getPath(); // will return "\some\path"
File dir = new File("/basedir");
File f2 = new File(dir, "/some/path");
path = f2.getPath(); // will return "\basedir\some\path"
File f3 = new File("./some/path");
path = f3.getPath(); // will return ".\some\path"
getAbsolutePath()
löst den Pfad auf der Grundlage des Ausführungsorts oder des Laufwerks auf. Wenn also die Ausführung von c:\test
:
path = f1.getAbsolutePath(); // will return "c:\some\path"
path = f2.getAbsolutePath(); // will return "c:\basedir\some\path"
path = f3.getAbsolutePath(); // will return "c:\test\.\basedir\some\path"
getCanonicalPath()
ist systemabhängig. Es löst den eindeutigen Ort auf, den der Pfad darstellt. Wenn Sie also irgendwelche ". "s im Pfad haben, werden diese normalerweise entfernt.
Wann sollte man sie einsetzen? Das hängt davon ab, was Sie erreichen wollen. getPath()
ist für die Portabilität nützlich. getAbsolutePath()
ist nützlich, um den Ort des Dateisystems zu finden, und getCanonicalPath()
ist besonders nützlich, um zu prüfen, ob zwei Dateien identisch sind.
Das Wichtigste dabei ist, dass die File
Klasse versucht, eine Ansicht dessen darzustellen, was Sun gerne als "hierarchische Pfadnamen" bezeichnet (im Grunde ein Pfad wie c:/foo.txt
ou /usr/muggins
). Aus diesem Grund werden Dateien in Form von Pfaden angelegt. Die Operationen, die Sie beschreiben, sind alle Operationen mit diesem "Pfadnamen".
getPath()
holt den Pfad ab, mit dem die Datei erstellt wurde ( ../foo.txt
)getAbsolutePath()
holt den Pfad, unter dem die Datei erstellt wurde, enthält aber auch Informationen über das aktuelle Verzeichnis, wenn der Pfad relativ ist ( /usr/bobstuff/../foo.txt
)getCanonicalPath()
Versuche um eine eindeutige Darstellung des absoluten Pfads zur Datei zu erhalten. Damit entfällt die Umleitung von ".."- und "."-Verweisen ( /usr/foo.txt
).Anmerkung: Ich sage Versuche - bei der Bildung eines kanonischen Pfads, kann die VM einen IOException
. Dies geschieht in der Regel, weil es einige Dateisystemoperationen durchführt, von denen jede einzelne fehlschlagen könnte.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.