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 ?
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 ?
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).
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();
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);
Il y a deux problèmes sur notre chemin vers la voie absolue :
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 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.