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

2019-06-01 01:01发布

我在我的项目的根文件夹资源/包,我“不”希望加载某个文件。 如果想装入某个文件,我会用class.getResourceAsStream,我会被罚款! 我真正想要做的是对文件的资源文件夹中加载一个“文件夹”,循环该文件夹内,获取流的每个文件,并在内容阅读......假设文件名不运行时前确定... 我该怎么办? 有没有办法让你的JAR文件的文件夹里面的文件列表? 请注意,拥有资源的Jar文件是从哪个代码正在运行相同的jar文件...

提前致谢...

Answer 1:

最后,我找到了解决办法:

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文件)的应用程序中的第二块只是工作,你可以删除它,如果你不喜欢这样。



Answer 2:

请尝试以下操作。
使资源路径"<PathRelativeToThisClassFile>/<ResourceDirectory>"例如,如果你的类路径是com.abc.package.MyClass和你resoure文件中的src / COM / ABC /包/资源/:

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/");


Answer 3:

我知道这是很多年前。 但是,仅仅为其他人遇到这个话题。 你可以做的是使用getResourceAsStream()方法与目录路径,输入流将拥有从目录中的所有文件名。 之后,你可以使用Concat的每个文件名的目录路径,并呼吁为的getResourceAsStream在一个循环中的每个文件。



Answer 4:

我在手中有同样的问题,而我是试图从装在罐子里的资源加载一些Hadoop的配置...在IDE和罐子(发行版)两种。

我发现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());
    }
}


Answer 5:

无论它是否是一个罐子内或没有下面的代码返回想要的“文件夹”的路径。

  private Path getFolderPath() throws URISyntaxException, IOException {
    URI uri = getClass().getClassLoader().getResource("folder").toURI();
    if ("jar".equals(uri.getScheme())) {
      FileSystem fileSystem = FileSystems.newFileSystem(uri, Collections.emptyMap(), null);
      return fileSystem.getPath("path/to/folder/inside/jar");
    } else {
      return Paths.get(uri);
    }
  }

需要Java 7+。



Answer 6:

另一种解决方案,你可以用它做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())
}


Answer 7:

简单...使用OSGi的。 在OSGi中,你可以在你的捆绑与findEntries和findPaths条目进行迭代。



Answer 8:

在我的jar文件我有一个名为上传文件夹,这个文件夹有三个其他文本文件里面,我需要有一个完全相同的文件夹和文件的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);


Answer 9:

至于其他的答案指出,一旦资源是一个jar文件中,事情变得很难看。 在我们的例子中,该解决方案:

https://stackoverflow.com/a/13227570/516188

工作相当不错,在测试(当测试运行的代码的jar文件是不是因为包装),但在实际的应用程序正常运行,无法正常工作。 所以我做了什么是...我硬编码在应用程序中的文件列表,但我有一个测试,从磁盘读取实际列表(可以做到这一点,因为这使得测试工作),如果实际列表没有按失败“T匹配列表中的应用程序的回报。

这样,我有简单的代码在我的应用程序(没有章法),我敢肯定我没有忘记添加列表感谢测试在一个新的条目。



Answer 10:

这个链接将告诉您如何。

神奇的是所述的getResourceAsStream()方法:

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


文章来源: How can I get a resource “Folder” from inside my jar File?