2012-12-12 14 views
11

Chcę przeczytać kilka plików tekstowych w pakiecie com.example.resources. Mogę czytać pojedynczy plik, używając następującego kodu:Uzyskiwanie dostępu do plików w określonym folderze w ścieżce klas przy użyciu Javy

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

Czy istnieje sposób aby uzyskać listę plików, a następnie przekazać każdy element do getResourceAsStream?

EDIT: Na ramsinb sugestią zmieniłem kod następująco:

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

Chcę uzyskać dostęp do plików w ścieżce klas, a nie z określonego folderu, takiego jak C: \\ resources. – Akadisoft

+1

Być może tego chcesz: http://stackoverflow.com/questions/3923129/get-a-list-of-resources-from-classpath-directory – nwaltham

+0

Możesz ponownie użyć kodu do tego (po drobnej modyfikacji) http: // stackoverflow .pl/questions/176527/how-can-i-enumerate-all-classes-in-a-package-and-add-one-a-list – CAMOBAP

Odpowiedz

9

Jeśli przechodzą w katalogu metody getResourceAsStream następnie zwróci listę plików w katalogu (lub przynajmniej strumień niego).

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

Celowo użyłem wątku, aby uzyskać zasób, ponieważ to zapewni mi ładowanie klasy nadrzędnej. Jest to ważne w środowisku Java EE, ale prawdopodobnie nie za dużo dla twojego przypadku.

+0

Witam, próbuję użyć twojej odpowiedzi. Czy możesz mi w tym pomóc: http://stackoverflow.com/questions/29430113/accessing-files-in-specific-folder-in-classpath-using-java-works-only-foring? – tch

0

myślę to jest to co chcesz:

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

Jak planujesz pobrać obiekt 'File' z nazwy pakietu' String'? – CAMOBAP

+0

Próbowałem 'File folder = new File ("/com/example/resources ")' i rzuca NullPointerException – Akadisoft

+0

edytowane i działające –

3

This SO thread omówienia tej techniki w szczegółach. Poniżej znajduje się przydatna metoda Java, która zawiera listę plików z danego folderu zasobów.

/** 
    * 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); 
    } 
Powiązane problemy