2010-07-20 10 views
0

J'ai paquet MyClassin X, également dans le paquet X il y a des paquets Y et Z comme ceci:Comment référencer des fichiers dans un Java pacakage

X - MyClass
X - Y - Certains fichiers
X - Z - Certains fichiers

Comment obtenir une liste de tous les fichiers des paquets Y et Z de MyClass?

+0

Pourquoi voulez-vous faire? – Maz

+0

Plus de fond: J'ai plusieurs fichiers que je dois faire défiler dans les méthodes de test. Certains fichiers sont dans le paquet Y et d'autres dans le paquet Z. Ce ne sont pas des fichiers de classe, ce sont juste des fichiers de données.Je veux être en mesure de parcourir tous les fichiers du paquet Y et du paquet Z. – Jon

Répondre

1

Les packages Java reflètent la structure du répertoire. Vous pouvez utiliser la classe File. En particulier, voir la méthode listFiles().

EDIT

Vous pouvez trouver dynamiquement votre position d'exécution. Voici le code d'un projet sur lequel j'ai travaillé récemment; Je voulais pouvoir trouver le répertoire depuis lequel je cours le JAR (si je cours le JAR), ou bien le répertoire de le JAR si je cours depuis les fichiers de classe. Dans mon cas, mon JAR est en <project root>/bin et mes cours sont en <project root>/classes.

final URL location; 
final String classLocation = JavaPlanner.class.getName().replace('.', '/') + ".class"; 
final ClassLoader loader = JavaPlanner.class.getClassLoader(); 

if(loader == null) 
{ 
    try { throw new ClassNotFoundException("class loaded with bootstrap loader"); } 
    catch (ClassNotFoundException cnfe) { throw new InitializationException(cnfe); } 
} 
else 
{ 
    location = loader.getResource(classLocation); 
} 

if(location.toString().startsWith("file:/")) // Line 14 
{ 
    // Running from .class file 
    String path; 
    try { path = URLDecoder.decode(location.toString().substring(6), "UTF-8"); } 
    catch(UnsupportedEncodingException uee) { throw new InitializationException(uee); } 

    // Move up package folders to root, add /bin/ 
    File package_ = new File(path).getParentFile(); 
    binPath = package_.getParentFile().getParentFile().getParentFile().getParentFile() + File.separator + "bin" + File.separator; 
} 
else // Line 25 
{ 
    // Running from .jar file 
    String jarURL = JavaPlanner.class.getResource("/" + JavaPlanner.class.getName().replaceAll("\\.", "/") + ".class").toString(); 
    jarURL = jarURL.substring(4).replaceFirst("/[^/]+\\.jar!.*$", "/"); 

    try 
    { 
     File dir = new File(new URL(jarURL).toURI()); 
     jarURL = dir.getAbsolutePath(); 
    } 
    catch(MalformedURLException mue) { throw new InitializationException(mue); } 
    catch(URISyntaxException use) { throw new InitializationException(use); } 

    binPath = jarURL; 
} 

À la ligne 14, j'ai constaté que j'utilise l'application à partir d'un fichier de classe. String path est initialement défini sur le chemin du fichier JavaPlanner (la classe contenant ma méthode main). Je sais que la structure du paquet est JavaPlanner, donc j'utilise getParentFile un nombre approprié de fois pour trouver la racine du projet, puis j'ajoute bin /.

À la ligne 25, j'ai constaté que j'utilise l'application à partir d'un fichier JAR. Le bloc obtient simplement le chemin vers le dossier contenant cet exécutable JAR.

De toute évidence, ce code n'est pas 100% adapté à votre objectif (plus précisément, j'appelle getParentFile un certain nombre de fois pour ma structure de paquet), mais je pense que cela devrait aider. L'objectif entier du code ci-dessus était de pouvoir trouver les fichiers de ressources corrects pour mon application. Dans la version de production, seul le JAR serait disponible pour l'utilisateur, mais je ne voulais pas avoir à reconstruire le JAR chaque fois que je devrais tester du code, et je ne voulais pas dupliquer mes fichiers de ressources, et Je ne voulais pas polluer mon bin/dossier avec les fichiers de classe (parce que tout dans bin/devait être envoyé à l'utilisateur).

+0

J'essaie d'éviter de coder en dur le chemin. Je voudrais trouver dynamiquement le chemin. – Jon

+0

@Jon: Voir ma modification, j'ai inclus le code que j'ai déjà utilisé pour trouver un dossier spécifique par rapport à mon emplacement d'exécution. Cela devrait aider. –

0

Cela dépend de la source de la classe. Si elles proviennent d'un fichier JAR, vous pouvez utiliser la classe JarFile pour obtenir la liste des entrées.

+0

Si elles ne sont pas dans un fichier JAR et qu'elles sont des fichiers CLASS séparés, vous devez utiliser l'idée de Brian. – Maz

+0

Ils ne sont pas dans un pot et ce sont des fichiers de données et non des fichiers java. – Jon

0
+0

Plus de fond: J'ai plusieurs fichiers que je dois faire défiler dans les méthodes de test. Certains fichiers sont dans le paquet Y et d'autres dans le paquet Z. Ce ne sont pas des fichiers de classe, ce sont juste des fichiers de données. Je veux pouvoir parcourir tous les fichiers du paquet Y et du paquet Z. – Jon