2011-06-22 1 views
4

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.

+0

"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? –

+0

Comme le fichier CSV en lecture seule, ou est-il nécessaire d'y écrire également? –

+0

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

Répondre

1

Utilisez getResource(), comme indiqué here.

+1

Comme le note @Michael Borgwardt, vous aurez besoin de 'getResourceAsStream()'.Désolé pour le mauvais lien. – trashgod

4

Placez le fichier test.csv dans le dossier src et utiliser ceci:

Foo.class.getResourceAsStream("/test.csv") 

Pour obtenir un InputStream pour le fichier. Cela fonctionnera partout où le projet est déplacé, y compris dans un fichier JAR.

+0

Je veux conserver les fichiers de ressources dans son propre répertoire. Je ne peux pas les placer dans le répertoire qui est destiné aux fichiers source Java. – ace

+0

en jar vous ne pouvez pas modifier le fichier .. – GorillaApe

+1

@amc - vous pouvez créer un répertoire de ressources qui est également un répertoire source, il ne doit pas être juste du code java. Le point est que le fichier sera inclus dans le fichier jar et peut être recherché depuis le classpath lors de l'exécution. – Robin

2

Exemple:

ProjectX \ src \ Test.java

ressources ProjectX \ \ config.properties

Si vous avez la structure ci-dessus et que vous voulez utiliser votre fichier config.properties, ce est comment vous le faites:

Entrée InputStream = nouveau FileInputStream ("./ resources/config.projects");

Dans cet exemple, vous n'avez pas à vous préoccuper de l'empaquetage de votre source dans un fichier JAR. Vous pouvez toujours modifier votre dossier de ressources à tout moment.

Questions connexes