如何在java中指定getResourceAsStream()方法的路径
我知道这个问题已经被问过好几次了,但我仍然无法通过这些解决方案来解决它 我有一个maven项目。一个Config.java文件位于consumer/src/main/java中。内容如下:如何在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 {
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