为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

小唯快跑啊 2021-06-21 12:18:28
我知道这个问题已经被问过好几次了,但我仍然无法通过这些解决方案来解决它。我有一个 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"));但这仍然没有奏效。任何人都可以对此提供一些提示吗?任何建议将不胜感激!
查看完整描述

3 回答

?
森林海

TA贡献2011条经验 获得超2个赞

根据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")`

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


查看完整回答
反对 回复 2021-06-23
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

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 文件夹中看到您的属性文件 - 如果您没有打包文件或在类路径中提供位置。


查看完整回答
反对 回复 2021-06-23
  • 3 回答
  • 0 关注
  • 740 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信