使用ClassLoader.getResource()的正确路径是什么?

4

我写了一个Java函数,用于从文件中读取bytes并将它们打印到控制台:

public void loadPixels(int size){
    ClassLoader cl = this.getClass().getClassLoader();
    pixels = new byte[size];
    try{
        InputStream stream = cl.getResource("res/" + fileName).openStream();
        stream.read(pixels);
        System.out.println(pixels.toString());
        stream.close();
    }catch(Exception e){
        e.printStackTrace();
    }
}

问题是,在这一行代码上我得到了一个NullPointerException异常。
InputStream stream = cl.getResource("res/" + fileName).openStream();

我尝试打开的文件名为"font.spt",它也是由fileName保存的值。该文件位于项目根目录下的"res"文件夹中,我目前正在使用Eclipse IDE。我的文件路径是否错误或者还有其他问题?
简而言之:fileName指向"font.spt",该文件位于bin目录下的"res"文件夹内。
编辑:包含.spt文件的"res"文件夹现在位于项目的"bin"下面,而不是根目录,但是我仍然遇到了错误。无论是从IDE运行还是作为导出的.jar文件运行,都会收到NullPointerException错误,请问我应该把这些文件放在哪里?有人可以给我个截图或例子吗?

你可以使用压缩工具打开.jar文件,找到你的文件所在路径,或者你有一个Web项目吗? - Andy_Lima
2
ClassLoader从类路径加载资源。如果文件位于项目的根目录,则Eclipse不会将其编译到输出目录中,因此在运行时不在类路径中。如果要使文件在运行时位于类路径中,请将其放入源目录中。 - JB Nizet
使用"res/" + 文件名,这意味着我需要在"src"下创建一个名为"res"的文件夹,然后将文件放在其中吗? - user2649681
是的。将它放在你的src文件夹中。 - Dioxin
1个回答

6
默认情况下,Eclipse将在构建时将项目源代码目录中所有非.java文件复制到输出目录。因此,一种选择是将资源文件与源代码放在同一个源文件夹中。然而,更好的选择是使用单独的resources文件夹来存储非Java文件,并将其声明为附加源代码路径(通过项目的Java Build Path属性)。这也是Maven和Gradle项目的组织方式。
例如,您可能有以下结构:
MyProject\
    src\
        java\
            com\
                ....*.java
        resources\
            fonts\
                font.spt

如果在生成路径中定义了src\java\src\resources\作为源位置,那么加载文件的代码应该如下:

getResource("fonts/" + fileName)

需要考虑的一点是:使用Gradle或Maven来管理您的构建,两者都强制/提供与此类似的项目结构。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接