web-dev-qa-db-fra.com

Comment obtenir un chemin absolu pour classer dans le dossier / resources de votre projet

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?

70
JAM

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();
37
Rahul Bobhate

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

146
Karol S

Vous devez spécifier le chemin commencé à partir de /

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

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);
11
Kirit Thakrar

Il y a deux problèmes sur notre chemin vers le chemin absolu:

  1. L'emplacement trouvé ne sera pas où se trouvent les fichiers source, mais où la classe est enregistrée. Et le dossier de ressources se situera presque sûrement quelque part dans le dossier source 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);

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.

0
Gangnus

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
0
eosimosu