120 votes

Comment obtenir le chemin absolu d'un fichier dans le dossier /ressources de votre projet ?

Supposons une configuration maven standard.

Disons que dans votre dossier de ressources, vous avez un fichier abc .

En Java, comment puis-je obtenir le chemin absolu du fichier ?

184voto

Karol S Points 2833

La bonne méthode qui fonctionne vraiment :

URL resource = YourClass.class.getResource("abc");
Paths.get(resource.toURI()).toFile();

Peu importe maintenant où se trouve physiquement le fichier dans le classpath, il sera trouvé tant que la ressource est réellement un fichier et non une entrée JAR.

(Ce qui semble évident new File(resource.getPath()) ne fonctionne pas pour tous les chemins ! Le chemin est toujours codé en URL).

102voto

Rahul Bobhate Points 2247

Vous pouvez utiliser ClassLoader.getResource pour obtenir la bonne ressource.

URL res = getClass().getClassLoader().getResource("abc.txt");
File file = Paths.get(res.toURI()).toFile();
String absolutePath = file.getAbsolutePath();

OU

Bien que cela ne fonctionne pas toujours, une solution plus simple -

Vous pouvez créer un File et utiliser getAbsolutePath méthode :

File file = new File("resources/abc.txt");
String absolutePath = file.getAbsolutePath();

36voto

Hett Points 951

Vous devez spécifier le chemin à partir duquel vous avez commencé /

URL resource = YourClass.class.getResource("/abc");
Paths.get(resource.toURI()).toFile();

14voto

Kirit Thakrar Points 141

Créez l'instance classLoader de la classe dont vous avez besoin, puis vous pouvez accéder facilement aux fichiers ou aux ressources. Maintenant, vous accédez au chemin en utilisant getPath() de cette classe.

 ClassLoader classLoader = getClass().getClassLoader();
 String path  = classLoader.getResource("chromedriver.exe").getPath();
 System.out.println(path);

5voto

Gangnus Points 7646

Il y a deux problèmes sur notre chemin vers la voie absolue :

  1. Le placement trouvé ne sera pas l'endroit où se trouvent les fichiers sources, mais où la classe est sauvegardée. Et le dossier de ressources se trouvera presque certainement quelque part dans le le dossier des sources du projet.
  2. Les mêmes fonctions de récupération de la ressource fonctionnent différemment si la classe s'exécute dans un plugin ou dans un package directement dans l'espace de travail.

Le code suivant nous donnera tous les chemins utiles :

    URL localPackage = this.getClass().getResource("");
    URL urlLoader = YourClassName.class.getProtectionDomain().getCodeSource().getLocation();
    String localDir = localPackage.getPath();
    String loaderDir = urlLoader.getPath();
    System.out.printf("loaderDir = %s\n localDir = %s\n", loaderDir, localDir);

Ici, les deux fonctions qui peuvent être utilisées pour la localisation du dossier de ressources sont étudiées. Pour ce qui est de class Il peut être obtenu de deux manières, statique ou dynamique.


Si le projet n'est pas dans le plugin, le code, s'il est exécuté dans JUnit, s'imprimera :

loaderDir = /C:.../ws/source.dir/target/test-classes/
 localDir = /C:.../ws/source.dir/target/test-classes/package/

Ainsi, pour arriver à src/rest/resources, nous devons monter et descendre dans l'arbre des fichiers. Les deux méthodes peuvent être utilisées. Remarquez que nous ne pouvons pas utiliser getResource(resourceFolderName) pour ce dossier n'est pas dans le dossier cible. Personne ne met de ressources dans les dossiers créés, j'espère.


Si la classe est dans le paquet qui est dans le plugin, la sortie du même test sera :

loaderDir = /C:.../ws/plugin/bin/
 localDir = /C:.../ws/plugin/bin/package/

Donc, encore une fois, nous devrions aller de haut en bas de l'arbre des dossiers.


Le plus intéressant est le cas où le paquet est a lancé dans le plugin. Comme test du plugin JUnit, pour notre exemple. La sortie est :

loaderDir = /C:.../ws/plugin/
 localDir = /package/

Ici, nous pouvons obtenir le chemin absolu en combinant seulement les résultats de les deux fonctions. Et ce n'est pas suffisant. Entre les deux, nous devrions mettre le chemin local de l'endroit où se trouvent les paquets de classes, par rapport au dossier du plugin. Probablement, vous devrez insérer quelque chose comme src o src/test/resource ici.

Vous pouvez insérer le code dans le vôtre et voir les chemins que vous avez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X