从 Java 包加载属性文件

我需要读取隐藏在 com.al.common.email.templates中的包结构中的属性文件。

我什么都试过了,还是不行。

最后,我的代码将在一个 servlet 容器中运行,但是我不希望在任何情况下依赖该容器。我编写 JUnit 测试用例,它需要在两种情况下都工作。

323120 次浏览

当从包 com.al.common.email.templates中的类加载属性时,可以使用

Properties prop = new Properties();
InputStream in = getClass().getResourceAsStream("foo.properties");
prop.load(in);
in.close();

(添加所有必要的异常处理)。

如果您的类不在那个包中,那么您需要获得稍微不同的 InputStream:

InputStream in =
getClass().getResourceAsStream("/com/al/common/email/templates/foo.properties");

getResource()/getResourceAsStream()中的相对路径(没有前导‘/’的路径)意味着资源将相对于表示类所在包的目录进行搜索。

使用 java.lang.String.class.getResource("foo.txt")将在类路径上搜索(不存在的)文件 /java/lang/String/foo.txt

使用绝对路径(以’/’开头的路径)意味着忽略当前包。

假设您使用 物业类,通过它的 装弹方法,并且我猜测您正在使用 ClassLoader GetResourceAsStream来获取输入流。

你怎么传递的名字,似乎应该是这样的形式: /com/al/common/email/templates/foo.properties

为了补充 Joachim Sauer 的回答,如果您需要在静态上下文中执行此操作,您可以执行以下操作:

static {
Properties prop = new Properties();
InputStream in = CurrentClassName.class.getResourceAsStream("foo.properties");
prop.load(in);
in.close()
}

(如前所述,删除异常处理。)

public class Test{
static {
loadProperties();
}
static Properties prop;
private static void loadProperties() {
prop = new Properties();
InputStream in = Test.class
.getResourceAsStream("test.properties");
try {
prop.load(in);
in.close();
} catch (IOException e) {
e.printStackTrace();
}


}
public class ReadPropertyDemo {
public static void main(String[] args) {
Properties properties = new Properties();


try {
properties.load(new FileInputStream(
"com/technicalkeeda/demo/application.properties"));
System.out.println("Domain :- " + properties.getProperty("domain"));
System.out.println("Website Age :- "
+ properties.getProperty("website_age"));
System.out.println("Founder :- " + properties.getProperty("founder"));


// Display all the values in the form of key value
for (String key : properties.stringPropertyNames()) {
String value = properties.getProperty(key);
System.out.println("Key:- " + key + "Value:- " + value);
}


} catch (IOException e) {
System.out.println("Exception Occurred" + e.getMessage());
}


}
}

以下两种情况与从名为 TestLoadProperties的示例类加载属性文件有关。

案例1: 使用 ClassLoader加载属性文件

InputStream inputStream = TestLoadProperties.class.getClassLoader()
.getResourceAsStream("A.config");
properties.load(inputStream);

在这种情况下,属性文件必须在 root/src目录中才能成功加载。

案例2: 不使用 ClassLoader加载属性文件

InputStream inputStream = getClass().getResourceAsStream("A.config");
properties.load(inputStream);

在这种情况下,要成功加载,属性文件必须与 TestLoadProperties.class文件位于同一目录中。

注意: TestLoadProperties.javaTestLoadProperties.class是两个不同的文件。前者是 .java文件,通常在项目的 src/目录中找到,而后者是 .class文件,通常在其 bin/目录中找到。

请使用以下代码:

Properties p = new Properties();
StringBuffer path = new StringBuffer("com/al/common/email/templates/");
path.append("foo.properties");
InputStream fs = getClass().getClassLoader()
.getResourceAsStream(path.toString());

if(fs == null){ System.err.println("Unable to load the properties file"); } else{ try{ p.load(fs); } catch (IOException e) { e.printStackTrace(); } }

我通过这个电话解决了这个问题

Properties props = PropertiesUtil.loadProperties("whatever.properties");

另外,您必须将 whatever.properties 文件放在/src/main/resources 中

没有人提到类似但是比上面更简单的解决方案,不需要处理类的包。假设 myfile.properties 在类路径中。

        Properties properties = new Properties();
InputStream in = ClassLoader.getSystemResourceAsStream("myfile.properties");
properties.load(in);
in.close();

好好享受吧