Java getResource方法是否只适用于特定的扩展?

Java getResource方法是否只适用于特定的扩展?,java,Java,下面的代码工作正常 getClass().getResource("/index.xml"); 但是,当我对 getClass().getResource("/index.html"); 上面的行抛出NullPointerException。我知道我已正确重构,因为我使用IDE智能重构重命名了文件,即index.html文件肯定存在于同一目录中。只要我切换回 getClass().getResource("/index.xml"); 一切又好起来了。为什么只有.xml扩展名才有效?公认的J

下面的代码工作正常

getClass().getResource("/index.xml");
但是,当我对

getClass().getResource("/index.html");
上面的行抛出NullPointerException。我知道我已正确重构,因为我使用IDE智能重构重命名了文件,即index.html文件肯定存在于同一目录中。只要我切换回

getClass().getResource("/index.xml");

一切又好起来了。为什么只有.xml扩展名才有效?

公认的Java资源是类扩展ResourceBundle或.property文件

您可以编写自己的扩展,以便能够从其他扩展中收集资源


我不确定.xml文件为什么是可行的扩展名。您正在使用Java 7吗?

公认的Java资源是一个类扩展ResourceBundle或.property文件

您可以编写自己的扩展,以便能够从其他扩展中收集资源


我不确定.xml文件为什么是可行的扩展名。你在使用Java 7吗?

使用
getResourceAsStream()
应该可以使用任何文件扩展名(至少对我是这样)

使用
getResourceAsStream()
应该可以使用任何文件扩展名(至少对我是这样)

就像@a_horse_一样,使用
getResourceAsStream()
可以与任何文件和扩展名一起使用


我倾向于相信(根据所提供的信息),您的IDE在重构后没有正确地刷新其文件层次结构。我建议对您的项目进行全面清理和构建,看看这是否有助于解决这个问题。

作为@a_horse_,没有提到名称,使用
getResourceAsStream()
可以很好地处理任何文件和任何扩展名

我倾向于相信(根据所提供的信息),您的IDE在重构后没有正确地刷新其文件层次结构。我建议对您的项目进行全面清理和构建,看看这是否有助于解决问题。

来自指南:

资源的名称独立于Java实现;在里面 特别是,路径分隔符始终是斜杠(/)。但是, Java实现控制了 资源映射到文件、数据库或其他包含 实际资源

资源由一个字符串标识,该字符串由一系列 子字符串,由斜杠(/)分隔,后跟资源名称。 每个子字符串必须是有效的Java标识符。资源名称为 形式为shortName或shortName.extension。shortName和 扩展必须是Java标识符

阅读此文档,它告诉我们:绝对资源名称是使用算法从给定的资源名称构造而成的。

来自指南:

资源的名称独立于Java实现;在里面 特别是,路径分隔符始终是斜杠(/)。但是, Java实现控制了 资源映射到文件、数据库或其他包含 实际资源

资源由一个字符串标识,该字符串由一系列 子字符串,由斜杠(/)分隔,后跟资源名称。 每个子字符串必须是有效的Java标识符。资源名称为 形式为shortName或shortName.extension。shortName和 扩展必须是Java标识符

阅读这篇文档,它告诉我们:绝对资源名是使用算法从给定的资源名构造而成的。

getResource()
无论资源的类型如何,都可以工作。它所做的一切都返回一个
URL
。这个例子很适合我

public class Example {
    public static void main(String... args) {
        System.out.println(Example.class.getResource("jaxb.properties"));
        System.out.println(Example.class.getResource("test.xml"));
        System.out.println(Example.class.getResource("foo.html"));
        System.out.println(Example.class.getResource("danger.exe"));
    }
}
无论资源的类型如何,
getResource()
都可以工作。它所做的一切都返回一个
URL
。这个例子很适合我

public class Example {
    public static void main(String... args) {
        System.out.println(Example.class.getResource("jaxb.properties"));
        System.out.println(Example.class.getResource("test.xml"));
        System.out.println(Example.class.getResource("foo.html"));
        System.out.println(Example.class.getResource("danger.exe"));
    }
}

所以,大多数其他答案,类/类加载器不应该查看文件扩展名,你可以编写一个
ClassLoader
,这样做,但这会很奇怪

我要试探一下你的问题是什么。我猜是使用某种IDE(您不指定是哪种IDE)将某些文件从源文件夹复制到目标文件夹(jar或类和资源目录)。对于Java代码,您需要编译的
.class
对象文件,而不是
.Java
源文件。因此,IDE将被配置为使用一些合理的默认值[magic],只复制具有特定扩展名的文件。HTML文件用于旧的包JavaDocs(
package info.HTML
而不是
package info.java
,后者可以包含包范围的注释),因此默认情况下排除这些文件是合理的


因此,您应该调查项目在这方面做了什么,并相应地更改任何配置。

因此,大多数其他答案是,类/类加载器不应该查看文件扩展名。您可以编写一个
类加载器来实现这一点,但这会很奇怪

我要试探一下你的问题是什么。我猜是使用某种IDE(您不指定是哪种IDE)将某些文件从源文件夹复制到目标文件夹(jar或类和资源目录)。对于Java代码,您需要编译的
.class
对象文件,而不是
.Java
源文件。因此,IDE将被配置为使用一些合理的默认值[magic],只复制具有特定扩展名的文件。HTML文件用于旧的包JavaDocs(
package info.HTML
而不是
package info.java
,后者可以包含包范围的注释),因此默认情况下排除这些文件是合理的


因此,您应该调查项目在这方面的工作,并相应地更改任何配置。

不,这根本不是事实。getResource将获取任何东西—基本上,它只是在类路径上查找文件。这不是在使用ResourceBund