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

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

1. Vue d'ensemble

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

Dans cet article, nous allons examiner rapidement les différences entre eux et discuter d'un cas d'utilisation dans lequel vous pouvez choisir d'en utiliser un par rapport aux 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épertoire suivante dans le répertoire de base de l'utilisateur:

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

En termes simples,getPath() renvoie la représentationString du chemin abstrait du fichier. Il s'agit essentiellement dethe pathname passed to the File constructor.

Ainsi, si l'objetFile a été créé en utilisant un chemin relatif, la valeur renvoyée par la méthodegetPath() serait également un chemin relatif.

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

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

La variablepath 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é de la barre oblique (/), transmise au constructeur, à la barre oblique inverse (\). C'est parce quethe returned String always uses the platform’s default name-separator character.

2.2. getAbsolutePath()

La méthodegetAbsolutePath() renvoiethe pathname of the file after resolving the path for the current user directory - c'est ce qu'on appelle un chemin absolu. Ainsi, pour notre exemple précédent,file.getAbsolutePath() renverrait:

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

Cette méthode résout uniquement le répertoire en cours 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}/example:

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

La valeur de la variablepath serait:

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

La méthodegetCanonicalPath() va plus loin etresolves the absolute pathname as well as the shorthands or redundant names like “.” and “.. selon la structure du répertoire. Il a égalementresolves symbolic links sur les systèmes Unix etconverts the drive letter to a standard case sur les systèmes Windows.

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

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

Prenons un autre exemple. Étant donné le répertoire courant en tant que$\{user.home}/example et l'objetFile créé à l'aide du paramètrenew File(“bar/baz/./baz-one.txt”), la sortie pourgetCanonicalPath() serait:

/home/username/example/bar/baz/baz-one.txt     // on Unix systems
C:\Users\username\example\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,the canonical path will always be unique puisque toutes ces représentations sont résolues.

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

Par exemple, sur les systèmes Windows, si nous créons un objetFile avec l'un des caractères non autorisés, la résolution du chemin canonique lancera unIOException:

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

3. Cas d'utilisation

Supposons que nous écrivions une méthode qui prend en paramètre un objetFile et enregistre sesfully qualified name 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 utilisergetCanonicalPath().

Cependant, puisquegetCanonicalPath() 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 utilisergetAbsoultePath().

4. Conclusion

Dans ce rapide tutoriel, nous avons couvert les différences entre les trois méthodesFile 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 à une autre.

Une classe de testJunit illustrant les exemples de cet article peut être trouvéeover on GitHub.