2010-09-16 12 views
11

J'ai besoin de lire un fichier dans mon code. Il réside physiquement ici:Comment référencer une ressource en Java?

C:\eclipseWorkspace\ProjectA\src\com\company\somePackage\MyFile.txt 

Je l'ai mis dans un paquet source de sorte que lorsque je crée un fichier jar runnable (Exporter-> fichier Runnable JAR), il sera inclus dans le pot. A l'origine je l'avais dans la racine du projet (et j'ai aussi essayé un sous-dossier normal), mais l'export ne l'incluait pas dans le pot.

Si dans mon code, je le veux

File myFile = new File("com\\company\\somePackage\\MyFile.txt"); 

le fichier jar localise correctement le fichier, mais en cours d'exécution au niveau local (Run As-> Java Application principale) jette un fichier non trouvé exception parce qu'il attend être :

File myFile = new File("src\\com\\company\\somePackage\\MyFile.txt"); 

Mais cela échoue dans mon fichier jar. Donc ma question est, comment puis-je faire fonctionner ce concept à la fois en cours d'exécution localement et dans mon fichier jar?

Répondre

33

Utilisez ClassLoader.getResourceAsStream ou Class.getResourceAsStream. La principale différence entre les deux est que la version ClassLoader utilise toujours un chemin "absolu" (dans le fichier jar ou autre) alors que la version Class est relative à la classe elle-même, sauf si vous préfixez le chemin avec /.

Donc, si vous avez une classe com.company.somePackage.SomeClass et com.company.other.AnyClass (dans la même classloader que la ressource), vous pouvez utiliser:

SomeClass.class.getResourceAsStream("MyFile.txt") 

ou

AnyClass.class.getClassLoader() 
       .getResourceAsStream("com/company/somePackage/MyFile.txt"); 

ou

AnyClass.class.getResourceAsStream("/com/company/somePackage/MyFile.txt"); 
0

Si J'ai placé un fichier dans un fichier jar, cela ne fonctionnait que si et seulement si j'utilisais

...getResourceAsStream("com/company/somePackage/MyFile.txt") 

Si j'utilisais un objet Fichier, cela ne fonctionnait jamais. J'ai aussi l'exception FileNotFound. Maintenant, je reste avec l'objet InputStream.