如何在java中指定getResourceAsStream()方法的路径

Pat*_*ick 2 java inputstream

我知道这个问题已经被问过好几次了,但我仍然无法通过这些解决方案来解决它。

我有一个 Maven 项目。一个 Config.java 文件位于consumer/src/main/java. 以下是内容:

import java.util.Properties;

public class Config {
    Properties configFile;
    public Config() {
        configFile = new Properties();
        try {
            configFile.load(this.getClass().getClassLoader().
                    getResourceAsStream("property_table.config.txt"));
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public String getProperty(String key) {
        String value = this.configFile.getProperty(key);
        return value;
    }
    public static void main(String[] args) {
        Config config = new Config();
        System.out.println("URL: " + config.getProperty("URL"));
        System.out.println("PASSWORD: " + config.getProperty("PASSWORD"));
    }
}
Run Code Online (Sandbox Code Playgroud)

我不断得到nullpointer exception。我知道那是因为它找不到文件property_table.config.txt。

起初,我将property_table_config.txt文件放在与consumer/src/main/java/Config.java 文件相同的文件夹中()。并尝试使用/property_table_config.txt和'property_table_config.txt`。它们都不起作用。

然后我尝试使用绝对路径,不起作用。并尝试使用/main/java/property_table_config,也不起作用。

然后我看到了这个解决方案:https : //stackoverflow.com/a/2103625/8159477。所以我创建了一个名为resources的目录放在主文件夹下(即文件夹的路径是consumer/src/main/resources,并config在下创建一个子文件夹resources。将property_table_config.txt文件放在那里后,我将代码更改为:

configFile.load(this.getClass().getClassLoader().getResourceAsStream("/config/property_table.config.txt"));
Run Code Online (Sandbox Code Playgroud)

但这仍然没有奏效。任何人都可以对此提供一些提示吗?任何建议将不胜感激!

ern*_*t_k 5

根据Class.getResourceAsStream:

此方法委托给此对象的类加载器。如果此对象由引导类加载器加载,则该方法委托给 ClassLoader.getSystemResourceAsStream。

在委托之前,使用以下算法从给定的资源名称构造一个绝对资源名称:

  • 如果名称以“/”(“\u002f”)开头,则资源的绝对名称是“/”后面的名称部分。
  • 否则,绝对名称采用以下形式:
    modified_package_name/name
    其中, modified_pa​​ckage_name 是此对象的包名称,用“/”代替“.”。('\u002e')。

我是这样理解评论的:

  • 如果使用ClassLoader.getResourceAsStream,则从包根发送绝对路径,但省略第一个/.
  • 如果使用Class.getResourceAsStream,请发送相对于当前Class对象的路径(并且该方法将考虑包),或者发送从包根目录开始的绝对路径,以/.

但除此之外,您还需要了解您的构建系统。使用 maven,资源文件存储在src/main/resources.

因此,在您的情况下,我认为进行以下更改应该可以解决问题:

我已经用类似的设置尝试过这个,它按预期工作。