我怎样才能从我的jar文件中获取资源“文件夹”?

我在我的项目的根目录中有一个资源文件夹/包,我“不要”要加载某个文件。 如果我想加载某个文件,我会使用class.getResourceAsStream,我会很好! 我真正想做的是在资源文件夹中加载一个“文件夹”,在文件夹内的文件上循环,并获取每个文件的stream并读取内容…假设文件名在运行前不确定… 我该怎么办? 有没有办法获得您的jar文件中的文件夹内的文件列表? 请注意,具有资源的Jar文件与正在运行代码的jar文件是相同的…

提前致谢…

最后,我find了解决办法:

final String path = "sample/folder"; final File jarFile = new File(getClass().getProtectionDomain().getCodeSource().getLocation().getPath()); if(jarFile.isFile()) { // Run with JAR file final JarFile jar = new JarFile(jarFile); final Enumeration<JarEntry> entries = jar.entries(); //gives ALL entries in jar while(entries.hasMoreElements()) { final String name = entries.nextElement().getName(); if (name.startsWith(path + "/")) { //filter according to the path System.out.println(name); } } jar.close(); } else { // Run with IDE final URL url = Launcher.class.getResource("/" + path); if (url != null) { try { final File apps = new File(url.toURI()); for (File app : apps.listFiles()) { System.out.println(app); } } catch (URISyntaxException ex) { // never happens } } } 

当你在IDE上运行应用程序(而不是使用jar文件)时,第二个模块正常工作,如果你不喜欢,可以将其删除。

尝试以下。
使资源path为"<PathRelativeToThisClassFile>/<ResourceDirectory>"例如,如果您的类path是com.abc.package.MyClass,并且您的资源文件在src / com / abc / package / resources /中:

 URL url = MyClass.class.getResource("resources/"); if (url == null) { // error - missing folder } else { File dir = new File(url.toURI()); for (File nextFile : dir.listFiles()) { // Do something with nextFile } } 

你也可以使用

 URL url = MyClass.class.getResource("/com/abc/package/resources/"); 

简单…使用OSGi。 在OSGi中,您可以使用findEntries和findPaths遍历Bundle的条目。

我有同样的问题,当我试图加载一些Hadoopconfiguration从资源打包在jar …在IDE和jar(发布版本)。

我发现java.nio.file.DirectoryStream最好的工作是通过本地文件系统和jar迭代目录内容。

 String fooFolder = "/foo/folder"; .... ClassLoader classLoader = foofClass.class.getClassLoader(); try { uri = classLoader.getResource(fooFolder).toURI(); } catch (URISyntaxException e) { throw new FooException(e.getMessage()); } catch (NullPointerException e){ throw new FooException(e.getMessage()); } if(uri == null){ throw new FooException("something is wrong directory or files missing"); } /** i want to know if i am inside the jar or working on the IDE*/ if(uri.getScheme().contains("jar")){ /** jar case */ try{ URL jar = FooClass.class.getProtectionDomain().getCodeSource().getLocation(); //jar.toString() begins with file: //i want to trim it out... Path jarFile = Paths.get(jar.toString().substring("file:".length())); FileSystem fs = FileSystems.newFileSystem(jarFile, null); DirectoryStream<Path> directoryStream = Files.newDirectoryStream(fs.getPath(fooFolder)); for(Path p: directoryStream){ InputStream is = FooClass.class.getResourceAsStream(p.toString()) ; performFooOverInputStream(is); /** your logic here **/ } }catch(IOException e) { throw new FooException(e.getMessage()); } } else{ /** IDE case */ Path path = Paths.get(uri); try { DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path); for(Path p : directoryStream){ InputStream is = new FileInputStream(p.toFile()); performFooOverInputStream(is); } } catch (IOException _e) { throw new FooException(_e.getMessage()); } } 

我知道这是多年前。 但只是为了让其他人看到这个话题。 你可以做的是用目录path使用getResourceAsStream()方法,并且inputstream将具有来自该目录的所有文件名称。 之后,您可以连接每个文件名称的dirpath,并为循环中的每个文件调用getResourceAsStream。

另一个解决scheme,你可以使用ResourceLoader这样做:

 import org.springframework.core.io.Resource; import org.apache.commons.io.FileUtils; @Autowire private ResourceLoader resourceLoader; ... Resource resource = resourceLoader.getResource("classpath:/path/to/you/dir"); File file = resource.getFile(); Iterator<File> fi = FileUtils.iterateFiles(file, null, true); while(fi.hasNext()) { load(fi.next()) } 

在我的jar文件里面我有一个名为Upload的文件夹,这个文件夹里面有三个其他的文本文件,我需要一个完全相同的文件夹和jar文件外的文件,我使用下面的代码:

 URL inputUrl = getClass().getResource("/upload/blabla1.txt"); File dest1 = new File("upload/blabla1.txt"); FileUtils.copyURLToFile(inputUrl, dest1); URL inputUrl2 = getClass().getResource("/upload/blabla2.txt"); File dest2 = new File("upload/blabla2.txt"); FileUtils.copyURLToFile(inputUrl2, dest2); URL inputUrl3 = getClass().getResource("/upload/blabla3.txt"); File dest3 = new File("upload/Bblabla3.txt"); FileUtils.copyURLToFile(inputUrl3, dest3); 

这个链接告诉你如何。

神奇的是getResourceAsStream()方法:

 InputStream is = this.getClass().getClassLoader().getResourceAsStream("yourpackage/mypackage/myfile.xml")