Supposons la configuration standard maven.
Dites dans votre dossier de ressources que vous avez un fichier abc
.
En Java, comment puis-je obtenir le chemin absolu du fichier s'il vous plaît?
Vous pouvez utiliser la méthode 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();
OR
Bien que cela puisse ne pas fonctionner tout le temps, une solution plus simple -
Vous pouvez créer un objet File
et utiliser la méthode getAbsolutePath
:
File file = new File("resources/abc.txt");
String absolutePath = file.getAbsolutePath();
La bonne manière qui fonctionne réellement:
URL resource = YourClass.class.getResource("abc");
Paths.get(resource.toURI()).toFile();
Peu importe maintenant où se trouve physiquement le fichier dans le chemin de classe, il sera trouvé tant que la ressource est en fait un fichier et non une entrée JAR.
(La new File(resource.getPath())
apparemment évidente _ ne fonctionne pas pour tous les chemins! Le chemin est toujours codé en URL!)
Vous devez spécifier le chemin commencé à partir de /
URL resource = YourClass.class.getResource("/abc");
Paths.get(resource.toURI()).toFile();
Créez l'instance classLoader de la classe dont vous avez besoin pour pouvoir accéder facilement aux fichiers ou aux ressources. maintenant, vous accédez au chemin en utilisant la méthode 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 le chemin absolu:
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);
Les deux fonctions pouvant être utilisées pour la localisation du dossier de ressources sont recherchées. Quant à class
, il peut être obtenu de manière statique ou dynamique.
Si le projet n'est pas dans le plugin, le code s'il est exécuté dans JUnit sera imprimé:
loaderDir = /C:.../ws/source.dir/target/test-classes/
localDir = /C:.../ws/source.dir/target/test-classes/package/
Donc, pour obtenir src/rest/resources, nous devons monter et descendre dans l’arborescence de fichiers. Les deux méthodes peuvent être utilisées. Notez que nous ne pouvons pas utiliser getResource(resourceFolderName)
, car ce dossier ne se trouve pas dans le dossier cible. J'espère que personne ne met de ressources dans les dossiers créés.
Si la classe est dans le paquet qui se trouve dans le plugin, le résultat du même test sera:
loaderDir = /C:.../ws/plugin/bin/
localDir = /C:.../ws/plugin/bin/package/
Donc, encore une fois, nous devrions monter et descendre dans l’arborescence des dossiers.
Le plus intéressant est le cas où le paquet est lancé dans le plugin. Comme test de plugin JUnit, pour notre exemple. La sortie est:
loaderDir = /C:.../ws/plugin/
localDir = /package/
Ici, nous pouvons obtenir le chemin absolu combinant uniquement les résultats de les deux fonctions. Et ce n'est pas assez. Entre eux, nous devrions placer le chemin local de l'emplacement où se trouvent les paquetages de classes, par rapport au dossier du plugin. Probablement, vous devrez insérer quelque chose comme src
ou src/test/resource
ici.
Vous pouvez insérer le code dans le vôtre et voir les chemins que vous avez.
Pour retourner un fichier ou un chemin de fichier
URL resource = YourClass.class.getResource("abc");
File file = Paths.get(resource.toURI()).toFile(); // return a file
String filepath = Paths.get(resource.toURI()).toFile().getAbsolutePath(); // return file path