【问题标题】:Proper path for using ClassLoader.getResource()?使用 ClassLoader.getResource() 的正确路径?
【发布时间】:2015-04-01 18:05:28
【问题描述】:

我创建了一个函数 (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 项目吗?
  • ClassLoader 从类路径加载资源。如果该文件位于项目的根目录,则 Eclipse 不会将其编译到输出目录,因此在运行时不在类路径中。如果您希望文件在运行时位于类路径中,请将其放在源目录中。
  • 带有"res/" + 文件名,是不是意味着我想在"src" 下创建一个名为"res" 的文件夹,然后把文件放在那里?
  • 是的。把它放在你的 src 文件夹中

标签: java classloader getresource


【解决方案1】:

默认情况下,Eclipse 会在构建时将它在项目的源位置中找到的所有非.java 文件复制到输出文件夹。因此,一种选择是将资源文件与源代码一起放在源文件夹下。但是,更好的选择是为非 Java 文件使用单独的 resources 文件夹并将其声明为额外的源位置(通过项​​目的 Java 构建路径 属性)。这也是 Maven 和 Gradle 项目的组织方式。

例如,您可能有:

MyProject\
    src\
        java\
            com\
                ....*.java
        resources\
            fonts\
                font.spt

src\java\src\resources\ 定义为构建路径中的源位置。那么您加载文件的代码将如下所示:

getResource("fonts/" + fileName)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多