Question Quelle est la différence entre getPath (), getAbsolutePath () et getCanonicalPath () en Java?


Quelle est la différence entre getPath(), getAbsolutePath(), et getCanonicalPath() en Java?

Et quand est-ce que je les utilise tous?


517
2017-07-08 16:53


origine


Réponses:


Considérez ces noms de fichiers:

C:\temp\file.txt - C'est un chemin, un chemin absolu et un chemin canonique.

.\file.txt - C'est un chemin. Ce n'est ni un chemin absolu ni un chemin canonique.

C:\temp\myapp\bin\..\\..\file.txt - C'est un chemin et un chemin absolu. Ce n'est pas un chemin canonique.

Un chemin canonique est toujours un chemin absolu.

La conversion depuis un chemin vers un chemin canonique le rend absolu (en général, il pointe sur le répertoire de travail actuel ./file.txt devient c:/temp/file.txt). Le chemin canonique d’un fichier "purifie" simplement le chemin, en enlevant et résolvant des choses comme ..\ et résoudre les liens symboliques (sur les unix).

Notez également l'exemple suivant avec 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());

Bien que les deux chemins se réfèrent au même emplacement, la sortie sera très différente:

C:\Windows
C:\Windows\System32\drivers

576
2017-07-08 17:11



Le meilleur moyen que j'ai trouvé pour avoir une idée de ce genre de choses est de les essayer:

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) {}
    }
}

Votre sortie sera quelque chose comme:

test\..\.\file.txt
C:\projects\sandbox\trunk\test\..\.\file.txt
C:\projects\sandbox\trunk\file.txt

Alors, getPath() vous donne le chemin basé sur l'objet File, qui peut être ou ne pas être relatif; getAbsolutePath() vous donne un chemin absolu vers le fichier; et getCanonicalPath() vous donne le chemin absolu unique vers le fichier. Notez qu'il existe un grand nombre de chemins absolus qui pointent vers le même fichier, mais un seul chemin canonique.

Quand utiliser chacun? Cela dépend de ce que vous essayez d'accomplir, mais si vous essayez de voir si deux Files pointez sur le même fichier sur le disque, vous pouvez comparer leurs chemins canoniques. Juste un exemple.


111
2017-07-08 17:16



En bref:

  • getPath() obtient la chaîne de chemin que le File objet a été construit avec, et il peut être répertoire courant relatif.
  • getAbsolutePath() obtient la chaîne de chemin après la résolution sur le répertoire courant si elle est relative, ce qui donne un chemin qualifié complet.
  • getCanonicalPath() obtient la chaîne de chemin après avoir résolu tout chemin relatif par rapport au répertoire en cours et supprime tout chemin relatif (. et ..), et tous les liens du système de fichiers pour renvoyer un chemin que le système de fichiers considère comme le moyen canonique de référencer l'objet du système de fichiers vers lequel il pointe.

En outre, chacun d'entre eux a un fichier équivalent qui renvoie le correspondant File objet.


61
2017-07-08 17:11



getPath() renvoie le chemin utilisé pour créer le File objet. Cette valeur de retour n'est pas modifiée en fonction de l'emplacement où elle est exécutée (les résultats ci-dessous sont pour les fenêtres, les séparateurs sont évidemment différents ailleurs)

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() résoudra le chemin en fonction de l'emplacement d'exécution ou du lecteur. Donc, si exécuté à partir de 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() est dépendant du système. Il va résoudre l'emplacement unique que le chemin représente. Donc, si vous avez des "." Dans le chemin, ils seront généralement supprimés.

Quant à quand les utiliser. Cela dépend de ce que vous essayez d'accomplir. getPath() est utile pour la portabilité. getAbsolutePath() est utile pour trouver l'emplacement du système de fichiers, et getCanonicalPath() est particulièrement utile pour vérifier si deux fichiers sont identiques.


34
2017-07-08 17:22



La grande chose à faire est que le File classe tente de représenter une vue de ce que Sun aime appeler "chemins hiérarchiques" (essentiellement un chemin c:/foo.txt ou /usr/muggins). C'est pourquoi vous créez des fichiers en termes de chemins. Les opérations que vous décrivez sont toutes des opérations sur ce "chemin".

  • getPath() récupère le chemin avec lequel le fichier a été créé (../foo.txt)
  • getAbsolutePath() récupère le chemin avec lequel le fichier a été créé, mais inclut des informations sur le répertoire en cours si le chemin est relatif (/usr/bobstuff/../foo.txt)
  • getCanonicalPath()  tentatives pour récupérer une représentation unique du chemin absolu vers le fichier. Cela élimine l'indirection de ".." et "." les références (/usr/foo.txt).

Remarque je dis tentatives - en formant un chemin canonique, la VM peut lancer un IOException. Cela se produit généralement car il effectue certaines opérations de système de fichiers, dont l'une peut échouer.


18
2017-07-08 17:18



Je trouve que j'ai rarement besoin d'utiliser getCanonicalPath() mais, si on lui donne un fichier avec un nom de fichier au format DOS 8.3 sous Windows, tel que le java.io.tmpdir La propriété System renvoie, puis cette méthode renvoie le nom de fichier "full".


3
2018-02-06 14:32