首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java如何在jar环境中读取文件夹和列出文件,而不是IDE

Java如何在jar环境中读取文件夹和列出文件,而不是IDE
EN

Stack Overflow用户
提问于 2015-03-11 11:25:23
回答 3查看 15.1K关注 0票数 9

我的问题是,我在src下创建了一个文件夹(名为IconResources),在IconResources中有许多图片。目录如下:

  • ProjectName
    • 钢筋混凝土
      • 包1
      • 包2
      • IconResources(这是目标文件夹)

我想列出所有的图片文件名称,并对这些图片做些什么。我发现File.list()只在IDE中工作,如果我将项目导出到jar以实现独立,它就不能工作。因此,我搜索并发现,我应该使用输入流和输出流。现在我发现i/o流可以很好地处理单个文件。但是我想使用inputstream和outputstream来读取文件夹(IconResource),然后列出该文件夹中的文件。

因此,我的问题是如何使用i/o put流加载文件夹,并迭代该文件夹以列出该文件夹中的文件名。这些东西不仅在IDE下工作,而且还在导出jar环境下工作。我的代码如下:

代码语言:javascript
复制
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中分解。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-11 11:44:56

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

因此,没有从类路径中列出整个文件夹的“正式”方法。下面我给出的解决方案是一个黑客,目前正在使用URLClassLoader的实现。这是可以改变的。

如果您希望使用健壮的方法,则需要使用类路径扫描器。其中有许多是库形式的,我个人最喜欢的是反思,但是Spring有一个内置的,还有许多其他的选项。

在黑客身上。

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

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

代码语言:javascript
复制
/
    text/
        one.txt
        two.txt

然后运行以下代码:

代码语言:javascript
复制
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>,可以使用如下方法:

代码语言:javascript
复制
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上使用适当的方法

代码语言:javascript
复制
final URL resource = ...
try(final InputStream is = resource.openStream()) {
    //do stuff
}
票数 13
EN

Stack Overflow用户

发布于 2015-03-13 05:54:55

我终于想出办法了。我采用了的答案,它在IDE中工作得很好,但在导出的Jar中却崩溃了。然后我就变了

InputStream = loader.getResourceAsStream("text");

最终的InputStream是= loader.getResourceAsStream("./text");

然后,它在IDE和JAR中都可以工作。

票数 1
EN

Stack Overflow用户

发布于 2022-10-13 10:36:31

我测试了final InputStream is = loader.getResourceAsStream("text");是否正常工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28985379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档