ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java如何在jar环境中而不是IDE中读取该文件夹中的文件夹和列表文件

2019-06-09 15:49:01  阅读:257  来源: 互联网

标签:java jar iostream


我的问题是我在src下创建了一个文件夹(名称是IconResources),在IconResources中有很多图片.目录是这样的:

> ProjectName

> src

>包1
>包2
> IconResources(这是目标文件夹)

我想列出所有图片文件的名称,并对这些图片做一些事情.我发现File.list()只能在IDE中运行,如果我将项目导出到一个jar来制作一个独立的,它就无法工作.所以我搜索并发现我应该使用inputstream和outputstream.现在我发现i / o流可以很好地用于单个文件.但我想使用inputstream和outputstream来读取文件夹(IconResource),然后列出该文件夹中的文件.

所以我的问题是如何使用i / o put stream加载文件夹并迭代文件夹以列出该文件夹中的文件名.这些东西不仅应该在IDE下工作,还应该在导出的jar下工作.
我的代码如下:

private void initalizeIconFiles(File projectDirectory){

    URL a = editor.getClass().getResource("/IconResources/");// Get Folder URL
    List<String> iconFileNames=new ArrayList<String>();//Create a list to store file names from IconResource Folder
    File iconFolder = new File(a.getFile());
    Path path=Paths.get(iconFolder.getPath());
    DirectoryStream<Path> stream = Files.newDirectoryStream(path) ;
    for (Path entry : stream) {
        if (!Files.isDirectory(entry)) {
            System.out.println(entry.getFileName().toString());
            iconFileNames.add(entry.getFileName().toString());// add file name in to name list
        }
    }
}

上面的代码只能在IDE下运行,但在导出的jar中分解.

解决方法:

这实际上是一个非常困难的问题,因为ClassLoader必须考虑到在运行时可能在类路径上有另一个名为IconResources的文件夹这一事实.

因此,没有“官方”方式列出类路径中的整个文件夹.我在下面给出的解决方案是一个hack,目前可以使用URLClassLoader的实现.这可能会有所变化.

如果您想要强大的方法,则需要使用类路径扫描程序.图书馆形式有很多,我个人最喜欢的是Reflections,但Spring有一个内置,还有很多其他选择.

在黑客上.

通常,如果您在URLClassLoader上使用getResourceAsStream,那么它将返回该文件夹中的资源流,每行一个. URLClassLoader是JRE使用的默认值,因此如果您不更改该行为,则此方法应该开箱即用.

假设我有一个具有以下类路径结构的项目:

/
    text/
        one.txt
        two.txt

然后运行以下代码:

final ClassLoader loader = Thread.currentThread().getContextClassLoader();
try(
        final InputStream is = loader.getResourceAsStream("text");
        final InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
        final BufferedReader br = new BufferedReader(isr)) {
    br.lines().forEach(System.out::println);
}

将打印:

one.txt
two.txt

因此,为了获得List< URL>在该位置的资源,您可以使用如下方法:

public static List<URL> getResources(final String path) throws IOException {
    final ClassLoader loader = Thread.currentThread().getContextClassLoader();
    try (
            final InputStream is = loader.getResourceAsStream(path);
            final InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
            final BufferedReader br = new BufferedReader(isr)) {
        return br.lines()
                .map(l -> path + "/" + l)
                .map(r -> loader.getResource(r))
                .collect(toList());
    }
}

现在请记住,这些URL位置是不透明的.它们不能被视为文件,因为它们可能位于.jar内,或者甚至可能位于Internet位置.因此,为了读取资源的内容,请在URL上使用适当的方法:

final URL resource = ...
try(final InputStream is = resource.openStream()) {
    //do stuff
}

标签:java,jar,iostream
来源: https://codeday.me/bug/20190609/1205642.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有