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

7
我在IntelijWorkspace中有一个Maven项目,在/resources文件夹中,我添加了一个名为SBMessages.properties.properties文件。现在,我尝试从Java中获取这个文件,但它总是抛出 FileNotFoundException 异常。 下面是我的项目树:

enter image description here

以下是在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();
    }
}

我尝试进行调试,但路径指向的是/target/classes/elements/SBMessages.properties而不是/resources/sb/elements/SBMessages.properties.

请帮我解决这个问题。


2
尝试使用 SBMessages.load(getClass().getResourceAsStream("sb/elements/SBMessages.properties")); - jmj
2个回答

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文件在同一个位置。这可能会让人感到困惑,所以最好从一个简单的示例开始。 :-)
像这样对我有用:
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);
    }

}

尝试了以上三种方法,但仍然无法工作。我还尝试更改默认的类加载器,可惜还是不起作用。你有什么想法吗?... - scorpion
你可以查看你的JAR文件,以确定属性文件被放置在哪里,但你也可以从头开始启动一个小而简单的项目。 - johnstosh

2
所以你没有使用标准目录结构,希望你有一个很好的理由,否则我建议你这样做。现在你的/resources文件夹没有被识别为需要添加到类路径的文件夹。(你可以通过查看/target/classes/sb/elements/SBMessages.properties是否存在来确认这一点)你可以按照http://maven.apache.org/pom.html#Resources中所描述的进行配置,但是对于每个人来说,坚持使用默认的目录结构可能会更好,这会大大简化配置过程。

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