93 votes

ouvert de ressources avec le chemin relatif en java

Dans mon application java j'ai besoin d'obtenir certains fichiers et répertoires.

C'est la structure du programme:

./main.java
./package1/guiclass.java
./package1/resources/resourcesloader.java
./package1/resources/repository/modules/   -> this is the dir I need to get
./package1/resources/repository/SSL-Key/cert.jks    -> this is the file I need to get

guiclass des charges de la resourcesloader classe qui se charge de mes ressources (répertoires et fichiers).

Sur le fichier, j'ai essayé

resourcesloader.class.getClass().getResource("repository/SSL-Key/cert.jks").toString()

afin d'obtenir le vrai chemin, mais ce ne l'est pas...

À propos de la dir je n'ai aucune idée de comment faire...

Des Suggestions? Merci.

185voto

Johnny Points 705

J'ai eu des problèmes avec l'aide de l' getClass().getResource("filename.txt")méthode. À la lecture de l'Java docs instructions, si la ressource n'est pas dans le même package que la classe que vous essayez d'accéder à la ressource, alors vous devez donner le chemin relatif à partir avec '/'. La stratégie recommandée est de mettre vos fichiers de ressources en vertu d'un "ressources" dossier dans le répertoire racine. Ainsi, par exemple, si vous avez de la structure:

src/main/com/mycompany/myapp

vous pouvez ensuite ajouter un dossier de ressources tel que recommandé par maven:

src/main/resources

en outre, vous pouvez ajouter des sous-dossiers dans le dossier de ressources

src/main/resources/textfiles

et dire que votre fichier s'appelle myfile.txt de sorte que vous avez

src/main/resources/textfiles/myfile.txt

Maintenant c'est ici que la bête problème de chemin d'accès. Disons que vous avez une classe dans votre com.mycompany.myapp package, et vous souhaitez accéder à l' myfile.txt le fichier depuis votre dossier de ressources. Certains disent que vous avez besoin pour donner à l':

"/main/resources/textfiles/myfile.txt" path

ou

"/resources/textfiles/myfile.txt"

ces deux sont mauvais. Après j'ai couru mvn clean compile, les fichiers et les dossiers sont copiés dans le:

myapp/target/classes 

dossier. Mais le dossier de ressources n'est pas là, seulement les dossiers dans le dossier de ressources. Donc, vous avez:

myapp/target/classes/textfiles/myfile.txt

myapp/target/classes/com/mycompany/myapp/*

si le chemin d'accès correct à donner à l' getClass().getResource("") méthode:

"/textfiles/myfile.txt"

ici, il est:

getClass().getResource("/textfiles/myfile.txt")

Ce n'est plus de retour null, mais sera de retour à votre classe. J'espère que cela aide quelqu'un. Il est étrange pour moi, que l' "resources" dossier n'est pas copié, mais seulement les sous-dossiers et des fichiers directement dans l' "resources" le dossier. Il semblerait logique pour moi que l' "resources" dossier doit aussi être trouvé sous "myapp/target/classes"

50voto

jonathan.cone Points 3776

Entrez le chemin d'accès par rapport à la chargeur de classe, et non pas la classe que vous obtenez le chargeur de. Par exemple:

resourcesloader.class.getClassLoader().getResource("package1/resources/repository/SSL-Key/cert.jks").toString();

39voto

E-rich Points 1904

Dans l'espoir de fournir de l'information supplémentaire pour ceux qui n'ont pas ce pick up aussi vite que d'autres, je tiens à donner mon scénario car il est un peu différent de l'installation. Mon projet a été mis en place avec la structure de répertoire suivante (à l'aide d'Eclipse):

Projet/
 src/ // code source de l'application
org/
myproject/
MyClass.java
 test/ // tests unitaires
 res/ // ressources
 images/ // PNG images pour les icônes
mon-image.png
 xml/ // fichiers XSD pour la validation des fichiers XML avec JAXB
mon schéma.xsd
 conf/ // par défaut .conf fichier Log4j
log4j.conf
 lib/ // bibliothèques ajouté à construire-chemin d'accès via les paramètres de projet

J'ai eu des problèmes de chargement de mes ressources de la res répertoire. Je voulais de toutes mes ressources séparé de mon code source (simplement pour la gestion/organisation). Donc, ce que j'avais à faire était d'ajouter la res répertoire à l' accumulation de chemin puis l'accès à la ressource par le biais de:

static final ClassLoader loader = MyClass.class.getClassLoader();

// in some function
loader.getResource("images/my-image.png");
loader.getResource("xml/my-schema.xsd");
loader.getResource("conf/log4j.conf");

REMARQUE: L' / est omise dès le début de la chaîne de ressource parce que je suis à l'aide du chargeur de classe.getResource(String) au lieu de la Classe.getResource(Chaîne de caractères).

10voto

nbeyer Points 644

Lorsque vous utilisez 'getResource" sur une Classe, un chemin d'accès relatif est fondée sur le package de la Classe. Lorsque vous utilisez 'getResource" sur un chargeur de classe, un chemin d'accès relatif est fondée sur le dossier racine.

Si vous utilisez un chemin d'accès absolu, à la fois "getResource" méthodes vont commencer à la racine du dossier.

10voto

Vikram Points 1363

@GianCarlo: Vous pouvez essayer d'appeler le Système de la propriété de l'utilisateur.dir qui vous donnera la racine de votre projet java puis faire ajouter ce chemin d'accès à votre chemin d'accès relatif, par exemple:

String root = System.getProperty("user.dir");
String filepath = "/path/to/yourfile.txt"; // in case of Windows: "\\path \\to\\yourfile.txt
String abspath = root+filepath;



// using above path read your file into byte []
File file = new File(abspath);
FileInputStream fis = new FileInputStream(file);
byte []filebytes = new byte[(int)file.length()];
fis.read(filebytes);

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