Comparaison de getPath (), getAbsolutePath () et getCanonicalPath () en Java

1. Vue d'ensemble

La classe java.io.File a trois méthodes - getPath () , getAbsolutePath () et getCanonicalPath () - pour obtenir le chemin du système de fichiers.

Dans cet article, nous examinerons rapidement les différences entre eux et discuterons d'un cas d'utilisation dans lequel vous pouvez choisir d'en utiliser l'un sur les autres.

2. Définitions et exemples de méthodes

Commençons par passer en revue les définitions des trois méthodes, ainsi que des exemples basés sur la présence de la structure de répertoires suivante dans le répertoire personnel de l'utilisateur:

|-- 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 ()

En termes simples, getPath () renvoie la représentation String du chemin abstrait du fichier. Il s'agit essentiellement du chemin passé au constructeur File .

Ainsi, si l' objet File a été créé à l'aide d'un chemin relatif, la valeur renvoyée par la méthode getPath () serait également un chemin relatif.

Si nous appelons le code suivant à partir du répertoire {user.home} / baeldung :

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

La variable path aurait la valeur:

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

Notez que pour le système Windows, le caractère séparateur de nom est passé du caractère barre oblique (/), qui a été passé au constructeur, au caractère barre oblique inverse (\). En effet, la chaîne renvoyée utilise toujours le caractère séparateur de nom par défaut de la plate-forme .

2.2. getAbsolutePath ()

La méthode getAbsolutePath () retourne le chemin du fichier après avoir résolu le chemin du répertoire utilisateur courant - c'est ce qu'on appelle un chemin absolu. Ainsi, pour notre exemple précédent, file.getAbsolutePath () renverrait:

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

Cette méthode résout uniquement le répertoire actuel pour un chemin relatif. Les représentations abrégées (telles que « Et « ..» ) ne sont pas résolues davantage. Par conséquent, lorsque nous exécutons le code suivant à partir du répertoire {user.home} / baeldung:

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

La valeur du chemin de la variable serait:

/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 ()

La méthode getCanonicalPath () va encore plus loin et résout le chemin absolu ainsi que les noms abrégés ou redondants comme « . »Et« .. » selon la structure du répertoire. Il résout également les liens symboliques sur les systèmes Unix et convertit la lettre de lecteur en un cas standard sur les systèmes Windows.

Ainsi, pour l'exemple précédent, la méthode getCanonicalPath () renverrait:

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

Prenons un autre exemple. Étant donné le répertoire courant comme $ {user.home} / baeldung et l' objet File créé à l'aide du paramètre new File ("bar / baz /./ baz-one.txt") , le résultat de getCanonicalPath () serait:

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

Il convient de mentionner qu'un seul fichier sur le système de fichiers peut avoir un nombre infini de chemins absolus car il existe un nombre infini de façons d'utiliser les représentations abrégées. Cependant, le chemin canonique sera toujours unique puisque toutes ces représentations sont résolues.

Contrairement aux deux dernières méthodes, getCanonicalPath () peut lancer une exception IOException car elle nécessite des requêtes sur le système de fichiers.

Par exemple, sur les systèmes Windows, si nous créons un objet File avec l'un des caractères non autorisés, la résolution du chemin canonique lèvera une IOException :

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

3. Cas d'utilisation

Disons que nous écrivons une méthode qui prend un objet File comme paramètre et enregistre son nom complet dans une base de données. Nous ne savons pas si le chemin est relatif ou contient des raccourcis. Dans ce cas, nous souhaitons peut-être utiliser getCanonicalPath () .

Cependant, comme getCanonicalPath () lit le système de fichiers, cela a un coût en termes de performances. Si nous sommes sûrs qu'il n'y a pas de noms ou de liens symboliques redondants et que la casse des lettres de lecteur est normalisée (si vous utilisez un système d'exploitation Windows), alors nous devrions préférer utiliser getAbsoultePath () .

4. Conclusion

Dans ce tutoriel rapide, nous avons couvert les différences entre les trois méthodes File pour obtenir le chemin du système de fichiers. Nous avons également montré un cas d'utilisation où une méthode peut être préférée à l'autre.

Une classe de test Junit illustrant les exemples de cet article est disponible à l'adresse over sur GitHub.