使用Java访问类路径中特定文件夹中的文件

11

我想读取 com.example.resources 包中的一堆文本文件。我可以使用以下代码读取单个文件:

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

有没有一种方法可以获取文件列表,然后将每个元素传递给 getResourceAsStream

编辑: 根据 ramsinb 的建议,我改变了我的代码:

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

2
我想要访问类路径中的文件,而不是像C:\resources这样的特定文件夹。 - Akadisoft
1
也许你需要这个:https://dev59.com/6m865IYBdhLWcg3wOb5h - nwaltham
你可以修改一下代码,然后重复使用它:https://dev59.com/OXVC5IYBdhLWcg3w0EoD - CAMOBAP
3个回答

10

如果你向getResourceAsStream方法传递一个目录,它将返回该目录中文件的列表(或至少是一个流)。

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

我有意使用Thread来获取资源,因为这将确保我获得父类加载器。在Java EE环境中,这非常重要,但对于你的情况可能并不是太重要。


嗨,我正在尝试使用你的答案。你能帮助我吗:https://dev59.com/eonca4cB1Zd3GeqP9ln- ? - pstrag

3

这个 Stack Overflow 的帖子详细讨论了这种技术。下面是一个有用的 Java 方法,可以列出给定资源文件夹中的文件。

/**
   * 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);
  }

0

我认为这是你想要的:

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
    }
  }
}

你如何计划从包名字符串中获取 File 对象? - CAMOBAP
我尝试了 File folder = new File("/com/example/resources"),但它抛出了 NullPointerException。 - Akadisoft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接