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

时间:2018-08-02 04:01:58

标签: java inputstream

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

我有一个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。 因此,我创建了一个称为资源的目录,并将其放在主文件夹下(即,文件夹的路径为consumer/src/main/resources,并在config下创建一个子文件夹resources。在将{{ 1}}文件中,我将代码更改为:

property_table_config.txt

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

3 个答案:

答案 0 :(得分:0)

根据Class.getResourceAsStream

  

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

     

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

     
      
  • 如果名称以'/'开头('\ u002f'),则资源的绝对名称是名称中'/'之后的部分。
  •   
  • 否则,绝对名称的格式如下:   
    modified_package_name/name   
    其中Modifyed_pa​​ckage_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")`
    

我已经通过类似的设置尝试了此操作,并且它按预期工作。

答案 1 :(得分:0)

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文件中运行时,如果没有打包文件或未在classpath中提供位置,ClassLoader仍然会从src / main / resources文件夹中看到属性文件。

答案 2 :(得分:-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文件放入测试包中,并且可以正常工作。