Supposons que j'ai une classe Java qui a besoin d'accéder à un fichier avec chemin absolu /home/gem/projects/bar/resources/test.csv:Comment spécifier le chemin de fichier relatif dans le fichier Java afin qu'il puisse toujours fonctionner après que le fichier est mis dans le fichier jar?
package com.example
class Foo {
String filePath = ????? // path to test.csv
String lines = FileInputStream(new File(filePath).readAllLines();
}
Lorsque le chemin de Foo.java est/home/gem/projects/bar/src/com/exemple.
Bien sûr, je ne peux pas spécifier le chemin absolu vers le fichier de ressources. C'est parce que le fichier jar sera distribué en tant que bibliothèque pour les clients à utiliser dans leurs propres environnements.
Supposons que le fichier de ressources comme test.csv se trouve toujours dans le même chemin que la racine du projet. Lorsqu'un pot contenant Foo.class est créé, ce fichier contient également test.csv dans le même chemin relatif (par rapport à la racine du projet).
Quelle est la manière de spécifier le chemin relatif qui fonctionnerait peu importe où la barre de projet est déplacée? Aussi, comment puis-je créer un fichier jar (qui peut être dans n'importe quel emplacement) afin que le chemin vers le fichier de ressources test.csv soit toujours correct.
Pour simplifier les choses, j'ai utilisé une API Java invalide (readAllLines() qui lit toutes les lignes et renvoie une chaîne contenant tout le contenu du fichier, sans utiliser try/catch). Supposons que le fichier csv peut être lu et écrit dans le fichier. Csv.
J'espère que cela le rend clair maintenant.
"un chemin relatif qui fonctionnerait peu importe où le projet est déplacé" est une contradiction dans les termes - sauf si vous déplacez le fichier de ressources de la même manière (c'est-à-dire que la ressource fait partie du projet). Je suppose que c'est le cas pour vous, cependant. Pourquoi ne pouvez-vous pas "bien sûr" spécifier un chemin absolu? Êtes-vous en train de créer un fichier JAR ou simplement d'exécuter des fichiers de classe? Quelle commande utilisez-vous pour exécuter le programme (y compris classpath), et à partir de quel répertoire de départ? –
Comme le fichier CSV en lecture seule, ou est-il nécessaire d'y écrire également? –
Je ne comprends pas la question. Le csv doit-il être à l'intérieur du pot, dans le même répertoire que le pot ou l'un d'entre eux? – aalku