【问题标题】:How to specify the path for getResourceAsStream() method in java如何在java中指定getResourceAsStream()方法的路径
【发布时间】:2019-01-09 17:36:52
【问题描述】:

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

我有一个 Maven 项目。还有一个位于consumer/src/main/java 的Config.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 文件和Config.java 文件放在同一个文件夹(consumer/src/main/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,并在resources下创建一个子文件夹config。将property_table_config.txt文件放在那里后,我改变了代码如下:

configFile.load(this.getClass().getClassLoader().getResourceAsStream("/config/property_table.config.txt"));

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

【问题讨论】:

  • 检查你的target文件夹,你的txt文件在上面吗?
  • 你可以试试 Config.class.getResourceAsStream("property_table.config.txt")
  • getResourceAsStream 从您的类路径加载。 src 目录与你的类路径无关
  • @Jerry06 它不在目标下。路径为target/classes/config/property_table_config.txt

标签: java inputstream


【解决方案1】:

你能试试下面的代码吗?

Config.class.getResourceAsStream("property_table.config.txt")

更新: 这是我试过的代码。

package test;

import java.util.Properties;

public class Config
{
  Properties configFile;

  public Config()
  {
    configFile = new Properties();
    try
    {
      configFile.load(Config.class.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"));
  }
}

然后我将 property_table.config.txt 文件放在测试包中,它工作了。

【讨论】:

    【解决方案2】:

    根据Class.getResourceAsStream

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

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

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

    这就是我对 cme​​ts 的理解:

    • 如果您使用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")`
      

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-12
        • 2021-12-05
        • 2016-07-21
        • 1970-01-01
        • 2015-06-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多