2010-02-12 4 views
2

Disons que j'ai une structureComment utiliser le chemin d'accès au fichier lors du traitement du contenu des dossiers de projet?

-bin/com/abc/A.class 
-src/com/abc/A.java 
-config/info.txt 

Comment remédier au fichier info.txt d'une classe? Devrions-nous utiliser la propriété "user.dir" ou "config/info.txt" pour que cela fonctionne? Je compilerai ceci dans le pot et après que le pot sera employé du servlet, mais je ne pense pas que ce soit important parce que ce dossier est écrit et lu des méthodes de pot interne de seulement.

+0

@BalusC Je le ferai un peu plus tard, mais à coup sûr. @Romain Muller. Ils ne seront pas amovibles, donc ils sont dans le classpath – EugeneP

Répondre

1

Il suffit de le mettre dans le chemin d'accès runtime et d'utiliser ClassLoader#getResourceAsStream() pour en obtenir un InputStream. Le placer dans le fichier JAR parmi les classes, ou en ajoutant son chemin (relatif à JAR) à l'entrée Class-Path du fichier manifest.mf du JAR est plus que suffisant.

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
InputStream input = classLoader.getResourceAsStream("config/info.txt"); 
// Do your thing to read it. 

Ou si vous voulez vraiment obtenir la saveur d'un java.io.File, puis utiliser ClassLoader#getResource(), URL#toURI() et File constructor taking an URI:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
URL url = classLoader.getResource("config/info.txt"); 
File file = new File(url.toURI()); 
// Do your thing with it. 

Est-ce pas utiliser des chemins relatifs à java.io choses. Cela dépend du répertoire de travail actuel sur lequel vous n'avez aucun contrôle. C'est simplement un reçu pour des problèmes de portabilité. Faites juste usage du classpath. Cela dit, connaissez-vous le java.util.Properties API? Il semble que vous essayez d'atteindre la même chose qui est more easy to be done with propertiesfiles.

+0

@BalusC Je ne étais peut-être pas très clair sur le tout. Ce que vous conseillez est une bonne chose, mais j'ai besoin d'une solution plus simple. Le fichier sera conservé dans le pot, et je n'en ai pas besoin [maintenant, j'en aurai peut-être besoin plus tard, donc merci quand même] - je n'ai pas besoin d'extraire le fichier dans le projet externe. J'ai juste besoin de lire le propre dossier d'un projet et son contenu, c'est-à-dire un fichier. Que dirais-tu? "user.dir" ou "./"? – EugeneP

+0

Cela ne peut pas être fait plus simplement. Vous seriez alors entièrement dépendant de la plateforme sous-jacente et de la façon dont le programme est exécuté. Le fichier JAR lui-même est déjà dans le classpath runtime. Vous pouvez également mettre le fichier par rapport à celui-ci et utiliser la méthode suggérée ci-dessus. Ce n'est pas si difficile. Je peux cependant imaginer que les starters ont du mal à comprendre le phénomène "classpath" et à en tirer parti. Bonne chance. – BalusC

+0

Ou, si votre question ** réelle ** est: "comment puis-je obtenir un objet" Fichier "digne de ce nom?" (alors demandez-le), vous pouvez l'obtenir par 'new File (URI)' où 'URI' est obtenu par' ClassLoader # getResource() 'et ensuite' URL # toURI() '. – BalusC

Questions connexes