Java:如何从资源文件夹中加载.properties?

sco*_*ion 6 java maven

我在IntelijWorkspace中有Manven项目,在/resources文件夹中,我添加了一个.properties名为的文件SBMessages.properties.现在,我试图从Java获取此文件,它总是抛出FileNotFoundException.以下是我项目的树:

在此输入图像描述

我的代码在SBConnector.class中获取.properties文件:

public void initialize() {
    SBMessages = new Properties();
    try {
        SBMessages.load(getClass().getResourceAsStream("/sb/elements/SBMessages.properties"));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试调试,直接路径/target/classes/elements/SBMessages.properties而不是/resources/sb/elements/SBMessages.properties.

请帮我解决这个问题.

joh*_*osh 4

不同的框架提供不同的类加载器。您可能拥有来自您正在使用的 JRE 的“默认”类加载器。它将遵循 JDK 文档。您可能会遇到此页面: http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String) 但更有用的页面是这个: http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getResourceAsStream(java.lang.String) 实际上表示您可以以斜杠开头资源名称。

尽管有此文档,您的类加载器可能不遵循这些规则。多么令人失望啊。因此,可以尝试三种形式:

  1. 绝对以斜线开头。
  2. 绝对,没有起始斜杠。
  3. 没有任何斜杠的相对值。

除了这三种形式之外,您还必须在正确的类上调用 getResourceAsStream()。该类应该与保存属性文件的 jar 文件位于同一个 jar 文件中。这可能会令人困惑,所以最好从一个简单的例子开始。:-)

对我来说这样工作:

public static void main(String[] args) {
    new NewMain().doit();
}

public void doit() {
    Properties prop = new Properties();
    try (InputStream inputStream = NewMain.class.getResourceAsStream("/data/newproperties.properties")) {

        prop.load(inputStream);
        System.out.println("hello " + prop.getProperty("x", "default"));

    } catch (FileNotFoundException e) {
        e.printStackTrace(System.out);
    } catch (IOException e) {
        e.printStackTrace(System.out);
    }

}
Run Code Online (Sandbox Code Playgroud)