Accessing files in specific folder in classpath using Java

后端 未结 3 1842
我寻月下人不归
我寻月下人不归 2020-12-16 18:04

I want to read a bunch of text files in com.example.resources package. I can read a single file using the following code:

InputStream is = MyObject.class.get         


        
相关标签:
3条回答
  • 2020-12-16 18:43

    If you pass in a directory to the getResourceAsStream method then it will return a listing of files in the directory ( or at least a stream of it).

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

    I purposely used the Thread to get the resource because it will ensure I get the parent class loader. This is important in a Java EE environment however probably not too much for your case.

    0 讨论(0)
  • 2020-12-16 18:48

    This SO thread discuss this technique in detail. Below is a useful Java method that list files from a given resource folder.

    /**
       * 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 讨论(0)
  • 2020-12-16 18:59

    I think thats what you want:

    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
        }
      }
    }
    
    0 讨论(0)
提交回复
热议问题