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

如何在java中指定getResourceAsStream()方法的路径,java,inputstream,Java,Inputstream,我知道这个问题已经被问过好几次了,但我仍然无法通过这些解决方案来解决它 我有一个maven项目。一个Config.java文件位于consumer/src/main/java中。内容如下: import java.util.Properties; public class Config { Properties configFile; public Config() { configFile = new Properties(); try {

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

我有一个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"));
    }
}
我不断地得到空指针异常。我知道这是因为它找不到文件属性\u table.config.txt

首先,我将属性_table_config.txt文件放在相同的folderconsumer/src/main/java/as config.java文件中。并尝试使用/property\u table\u config.txt和“property\u table\u config.txt”。他们两个都不工作

然后我尝试使用绝对路径,但不起作用。并尝试使用/main/java/property\u table\u config,但也不起作用

然后我看到了这个解决方案:。 因此,我创建了一个名为resources的目录,并将其放在主文件夹下,即文件夹的路径是consumer/src/main/resources,然后在resources下创建一个子文件夹config。在将属性_table_config.txt文件放在那里之后,我将代码更改为:

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

但这仍然不起作用。有人能给点提示吗?任何建议都将不胜感激

你能试试下面的代码吗

Config.class.getResourceAsStreamproperty_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文件放在N测试包中,它工作了。

根据Class.getResourceAsStream:

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

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

如果名称以“/”\u002f”开头,则资源的绝对名称是名称中“/”后面的部分。 否则,绝对名称的形式如下: 修改的\u包\u名称/名称 其中,修改后的_package_name是此对象的包名,用“/”代替“.”\u002e“。 以下是我对评论的理解:

如果使用ClassLoader.getResourceAsStream,则从包根发送绝对路径,但忽略第一个/。 如果使用Class.getResourceAsStream,请发送相对于当前类对象的路径,该方法将考虑包,或者从包根发送绝对路径,以/。 但除此之外,您还需要了解构建系统。使用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系统变量中设置目录的路径。要点是:需要从中获取配置文件的目录必须位于类路径中,而不是文件。e、 g.如果文件位置为c:\my\u projects\test project\config\my\u config.properties,且c:\my\u projects\test project\位于类路径中,则getResourceAsStream调用将为ClassLoader.getResourceAsStreamconfig/my\u config.properties

您可以将文件打包到jar文件中,jar文件的根是getResourceAsStreamconfig/my_config.properties的起点

若您的Maven项目是一个jar项目,那个么您需要使用Maven资源插件将额外的资源放入jar中

顺便说一句:如果您没有为资源插件显式地指定jar文件,Maven不会从src/main/java/目录将任何内容放入jar文件中

如果在Maven项目中使用像Eclipse这样的IDE,则src/main/resources是构建类路径的一部分。仔细检查它是否存在,如果不存在,请更新Maven项目或手动添加它


仍然只有当您在IDE中运行项目时,ClassLoader才会从src/main/resources文件夹中看到您的属性文件,而不是从独立的Jar文件——若您并没有打包文件或在类路径中提供位置的话

检查您的目标文件夹,其中是否存在txt?是否可以尝试从类路径加载Config.class.getResourceAsStreamproperty\u table.Config.txtgetResourceAsStream。src目录与您的classpath@Jerry06这不是直接低于目标。路径是target/classes/config/property\u table\u config.txt