getResources()仅返回枚举1个对象

问题描述:

我尝试从classpath(web-inf/classes/dir)获取文件列表。getResources()仅返回枚举1个对象

Enumeration<URL> en = getClass().getClassLoader().getResources("dir"); 

但是,而不是此文件夹中的元素,唯一的元素是文件夹本身。有没有一种方法可以获取文件列表,或者唯一的方法是逐个访问文件。因为当我尝试引用同一文件夹中的某个文件时,我可以轻松访问其内容。

+0

这是正确的,你应该从枚举中获得'URL',构造一个“'File'”。然后调用'file.listFiles();' –

您无法以递归方式浏览类路径上的目录。

看到这个职位:How to use ClassLoader.getResources() correctly?

如果你知道无论你正在寻找一个JAR文件,可以直接打开它作为存档和浏览文件。

有人想出了这个问题的一个有用的答案:Get all of the Classes in the Classpath

你可以适应这个代码在所有JAR文件和目录在classpath中浏览和应用一些过滤器为您的目录名称自己。这个例子将列出所有类从gnu.trove *包:

import java.io.File; 
import java.util.Enumeration; 
import java.util.jar.JarEntry; 
import java.util.jar.JarFile; 

public class Test 
{ 

    public static void main(String[] args) 
    { 
     final String dirname = "gnu.trove."; 

     findClasses(new Visitor<String>() { 

      @Override 
      public boolean visit(String classname) 
      { 
       if (classname.startsWith(dirname)) { 
        System.out.println(classname); 
       } 
       return true; 
      } 
     }); 
    } 

    public interface Visitor<T> 
    { 
     public boolean visit(T t); 
    } 

    public static void findClasses(Visitor<String> visitor) 
    { 
     String classpath = System.getProperty("java.class.path"); 
     String[] paths = classpath.split(System.getProperty("path.separator")); 

     String javaHome = System.getProperty("java.home"); 
     File file = new File(javaHome + File.separator + "lib"); 
     if (file.exists()) { 
      findClasses(file, file, true, visitor); 
     } 

     for (String path : paths) { 
      file = new File(path); 
      if (file.exists()) { 
       findClasses(file, file, true, visitor); 
      } 
     } 
    } 

    private static boolean findClasses(File root, File file, 
      boolean includeJars, Visitor<String> visitor) 
    { 
     if (file.isDirectory()) { 
      for (File child : file.listFiles()) { 
       if (!findClasses(root, child, includeJars, visitor)) { 
        return false; 
       } 
      } 
     } else { 
      if (file.getName().toLowerCase().endsWith(".jar") && includeJars) { 
       JarFile jar = null; 
       try { 
        jar = new JarFile(file); 
       } catch (Exception ex) { 

       } 
       if (jar != null) { 
        Enumeration<JarEntry> entries = jar.entries(); 
        while (entries.hasMoreElements()) { 
         JarEntry entry = entries.nextElement(); 
         String name = entry.getName(); 
         int extIndex = name.lastIndexOf(".class"); 
         if (extIndex > 0) { 
          if (!visitor.visit(name.substring(0, extIndex) 
            .replace("/", "."))) { 
           return false; 
          } 
         } 
        } 
       } 
      } else if (file.getName().toLowerCase().endsWith(".class")) { 
       if (!visitor.visit(createClassName(root, file))) { 
        return false; 
       } 
      } 
     } 

     return true; 
    } 

    private static String createClassName(File root, File file) 
    { 
     StringBuffer sb = new StringBuffer(); 
     String fileName = file.getName(); 
     sb.append(fileName.substring(0, fileName.lastIndexOf(".class"))); 
     file = file.getParentFile(); 
     while (file != null && !file.equals(root)) { 
      sb.insert(0, '.').insert(0, file.getName()); 
      file = file.getParentFile(); 
     } 
     return sb.toString(); 
    } 

} 

这里是忽略JAR文件和刚刚通过的文件回事目录在classpath一些代码:

import java.io.File; 

public class Test 
{ 

    public static void main(String[] args) 
    { 
     findClasses(new Visitor<String>() { 

      @Override 
      public boolean visit(String classname) 
      { 
       // apply your filtering here 
       System.out.println(classname); 
       return true; 
      } 
     }); 
    } 

    public interface Visitor<T> 
    { 
     public boolean visit(T t); 
    } 

    public static void findClasses(Visitor<String> visitor) 
    { 
     String classpath = System.getProperty("java.class.path"); 
     String[] paths = classpath.split(System.getProperty("path.separator")); 

     for (String path : paths) { 
      File file = new File(path); 
      // Ignore JAR files, just go through directories on the classpath 
      if (file.isFile()) { 
       continue; 
      } 
      findFiles(file, file, visitor); 
     } 
    } 

    private static boolean findFiles(File root, File file, 
      Visitor<String> visitor) 
    { 
     if (file.isDirectory()) { 
      for (File child : file.listFiles()) { 
       if (!findFiles(root, child, visitor)) { 
        return false; 
       } 
      } 
     } else { 
      if (!visitor.visit(createRelativePath(root, file))) { 
       return false; 
      } 
     } 

     return true; 
    } 

    private static String createRelativePath(File root, File file) 
    { 
     StringBuffer sb = new StringBuffer(); 
     sb.append(file.getName()); 
     file = file.getParentFile(); 
     while (file != null && !file.equals(root)) { 
      sb.insert(0, '/').insert(0, file.getName()); 
      file = file.getParentFile(); 
     } 
     return sb.toString(); 
    } 

} 
+0

我需要更基本的东西。我只有一套我放在资源文件夹中的文件。我只希望我的代码能够搜索它们并将其中的一个作为输出(基于搜索条件)。 – Andrei

+0

那么上面的代码也会查看资源目录。如果您不关心类路径中的JAR,则可以删除浏览其内容的代码。另外,如果你对* .class文件不感兴趣,你可以根据需要修改过滤器'endsWith(“。class”)'。 – sebkur