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

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


我有一个 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"));

    }

}

我不断得到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"));

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


小唯快跑啊
浏览 741回答 3
3回答

森林海

根据Class.getResourceAsStream:此方法委托给此对象的类加载器。如果此对象由引导类加载器加载,则该方法委托给 ClassLoader.getSystemResourceAsStream。在委托之前,使用以下算法从给定的资源名称构造一个绝对资源名称:如果名称以“/”(“\u002f”)开头,则资源的绝对名称是“/”后面的名称部分。否则,绝对名称采用以下形式:modified_package_name/name其中, modified_package_name 是此对象的包名称,用“/”代替“.”。('\u002e')。我是这样理解评论的:如果使用ClassLoader.getResourceAsStream,则从包根发送绝对路径,但省略第一个/.如果使用Class.getResourceAsStream,请发送相对于当前Class对象的路径(并且该方法将考虑包),或者发送从包根目录开始的绝对路径,以/.但除此之外,您还需要了解您的构建系统。使用 maven,资源文件存储在src/main/resources.因此,在您的情况下,我认为进行以下更改应该可以解决问题:将文件放入src/main/resources.将代码更改为this.getClass()      .getResourceAsStream("/property_table.config.txt")           //or `Config.class.getResource...或者,使用 this.getClass().getClassLoader()                  .getResourceAsStream("property_table.config.txt")`我已经用类似的设置尝试过这个,它按预期工作。

收到一只叮咚

ClassLoader().getResourceAsStream()仅在类路径中查找文件。您需要的是将您的配置文件放在类路径中的目录中。因此,您有以下选择:当您从命令行运行 Java 应用程序时,您可以在 -cp 参数或 CLASSPATH 系统变量中设置目录路径。要点是:您需要从中获取配置文件的目录必须在类路径中 - 而不是文件。(例如,如果文件位置是c:\my_projects\test-project\config\my_config.properties并且c:\my_projects\test-project\在类路径中,则getResourceAsStream调用将是ClassLoader().getResourceAsStream("config/my_config.properties")您可以将文件打包成 jar 文件,jar 文件的根目录是 getResourceAsStream("config/my_config.properties")如果您的 Maven 项目是 jar 项目,则需要使用 Maven 资源插件将其他资源放入 jar 中。顺便说一句:Maven 不会将任何内容放入 src/main/java/ 目录中的 jar 文件中(如果您没有为资源插件明确指定它)如果您在 Maven 项目中使用 Eclipse 之类的 IDE,则 src/main/resources 是构建类路径的一部分。仔细检查它是否存在,如果不存在 - 执行“更新 Maven 项目”或手动添加它。只有当您在 IDE 中而不是从独立 Jar 文件中运行项目时,ClassLoader 才会从 src/main/resources 文件夹中看到您的属性文件 - 如果您没有打包文件或在类路径中提供位置。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java