11 votes

Accéder à des fichiers dans un dossier spécifique du classpath en utilisant Java

Je veux lire un groupe de fichiers texte dans le paquet com.example.resources. Je peux lire un seul fichier en utilisant le code suivant :

InputStream is = MyObject.class.getResourceAsStream("resources/file1.txt")
InputStreamReader sReader = new InputStreamReader(is);
BefferedReader bReader = new BufferedReader(sReader);
...

Existe-t-il un moyen d'obtenir la liste du fichier et de passer chaque élément à la fonction getResourceAsStream ?

EDIT : Sur la suggestion de ramsinb, j'ai modifié mon code comme suit :

BufferedReader br = new BufferedReader(new InputStreamReader(MyObject.class.getResourceAsStream("resources")));
String fileName;
while((fileName = br.readLine()) != null){ 
   // access fileName 
}

10voto

ramsinb Points 1496

Si vous transmettez un répertoire à la fonction getResourceAsStream alors il retournera une liste de fichiers dans le répertoire (ou au moins un flux de celui-ci).

Thread.currentThread().getContextClassLoader().getResourceAsStream(...)

J'ai délibérément utilisé le Thread pour obtenir la ressource, car cela me permet de m'assurer que j'obtiens le chargeur de classe parent. Ceci est important dans un environnement Java EE, mais probablement pas trop dans votre cas.

3voto

Viral Patel Points 2837

Ce fil de SO discuter de cette technique en détail. Vous trouverez ci-dessous une méthode Java utile qui liste les fichiers d'un dossier de ressources donné.

/**
   * List directory contents for a resource folder. Not recursive.
   * This is basically a brute-force implementation.
   * Works for regular files and also JARs.
   * 
   * @author Greg Briggs
   * @param clazz Any java class that lives in the same place as the resources you want.
   * @param path Should end with "/", but not start with one.
   * @return Just the name of each member item, not the full paths.
   * @throws URISyntaxException 
   * @throws IOException 
   */
  String[] getResourceListing(Class clazz, String path) throws URISyntaxException, IOException {
      URL dirURL = clazz.getClassLoader().getResource(path);
      if (dirURL != null && dirURL.getProtocol().equals("file")) {
        /* A file path: easy enough */
        return new File(dirURL.toURI()).list();
      } 

      if (dirURL == null) {
        /* 
         * In case of a jar file, we can't actually find a directory.
         * Have to assume the same jar as clazz.
         */
        String me = clazz.getName().replace(".", "/")+".class";
        dirURL = clazz.getClassLoader().getResource(me);
      }

      if (dirURL.getProtocol().equals("jar")) {
        /* A JAR path */
        String jarPath = dirURL.getPath().substring(5, dirURL.getPath().indexOf("!")); //strip out only the JAR file
        JarFile jar = new JarFile(URLDecoder.decode(jarPath, "UTF-8"));
        Enumeration<JarEntry> entries = jar.entries(); //gives ALL entries in jar
        Set<String> result = new HashSet<String>(); //avoid duplicates in case it is a subdirectory
        while(entries.hasMoreElements()) {
          String name = entries.nextElement().getName();
          if (name.startsWith(path)) { //filter according to the path
            String entry = name.substring(path.length());
            int checkSubdir = entry.indexOf("/");
            if (checkSubdir >= 0) {
              // if it is a subdirectory, we just return the directory name
              entry = entry.substring(0, checkSubdir);
            }
            result.add(entry);
          }
        }
        return result.toArray(new String[result.size()]);
      } 

      throw new UnsupportedOperationException("Cannot list files for URL "+dirURL);
  }

0voto

Anton Hell Points 53

Je pense que c'est ce que vous voulez :

String currentDir = new java.io.File(".").toURI().toString();
// AClass = A class in this package
String pathToClass = AClass.class.getResource("/packagename).toString();
String packagePath = (pathToClass.substring(currentDir.length() - 2));

String file;
File folder = new File(packagePath);
File[] filesList= folder.listFiles(); 

for (int i = 0; i < filesList.length; i++) 
{
  if (filesList[i].isFile()) 
  {
    file = filesList[i].getName();
    if (file.endsWith(".txt") || file.endsWith(".TXT"))
    {
      // DO YOUR THING WITH file
    }
  }
}

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