为了账号安全,请及时绑定邮箱和手机立即绑定

我如何从jar文件中获取资源“文件夹”?

我如何从jar文件中获取资源“文件夹”?

智慧大石 2019-10-06 13:48:05
我在项目的根目录中有一个资源文件夹/程序包,我“不想”加载某个文件。如果我想加载某个文件,我将使用class.getResourceAsStream,我会很好的!我实际上要做的是在资源文件夹中加载“文件夹”,循环访问该文件夹中的文件,并获取每个文件的流,并读取内容...假定在运行时之前未确定文件名... 我该怎么办?有没有办法获取jar文件中“文件夹”中文件的列表?请注意,带有资源的JAR文件与从中运行代码的JAR文件相同。
查看完整描述

3 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

在尝试从jar中打包的资源中加载某些hadoop配置时,我手头也遇到了同样的问题……在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());

    }

}


查看完整回答
反对 回复 2019-10-06
  • 3 回答
  • 0 关注
  • 604 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信