从子目录获取资源(在模块化Java中)

问题描述 投票:0回答:1

我要问一个似乎与许多现有问题重复的问题,但我找到的答案似乎都不能为我解决问题。

考虑以下课程:

package resources;

public class Main {
    public static void main(String[] args) {
        System.out.println(ClassLoader.getSystemResource("toplevel.txt"));
        System.out.println(ClassLoader.getSystemResource("/sub/nested.txt"));
    }
}

在带有

module-info
的模块化项目中:

module resources {
    exports resources;
}

以及仅包含三个文件的目标目录结构:

resources/Main.class
sub/nested.txt
toplevel.txt

输出为:

file:/C:/Eclipse/workspace-2023-03/resources/bin/toplevel.txt
null

显然路径

/C:/Eclipse/workspace-2023-03/resources/bin/
是我的目标目录的路径。为什么找不到资源
/sub/nested.txt

我在 Eclipse 中使用 JDK 17。 这个问题(以及其他问题)的答案表明上述内容应该有效,但事实并非如此。我忽略了什么?

编辑:原来的问题没有具体指模块化项目。 @yshavit 的答案对于非模块化答案是正确的,但对于模块化答案则不然。

java file
1个回答
1
投票

问题是你的前缀斜杠:

System.out.println(ClassLoader.getSystemResource("/sub/nested.txt"));
                                                 ⬆︎

Java 对系统资源的处理可能会令人困惑,特别是在前缀斜杠方面。但是,请注意,您在正在运行的

getSystemResource
呼叫中没有它。

删除它,它应该可以工作:

System.out.println(ClassLoader.getSystemResource("sub/nested.txt"));
© www.soinside.com 2019 - 2024. All rights reserved.