从Java包加载属性文件
我需要读取com.al.common.email.templates
中com.al.common.email.templates
在我的包结构中的属性文件。
我已经尝试了一切,我无法弄清楚。
最后,我的代码将运行在一个servlet容器中,但我不想依赖容器来做任何事情。 我编写JUnittesting用例,它需要在两个工作。
从包com.al.common.email.templates
的类加载属性时,您可以使用
Properties prop = new Properties(); InputStream in = getClass().getResourceAsStream("foo.properties"); prop.load(in); in.close();
(添加所有必要的exception处理)。
如果您的课程不在该包中,则需要稍微不同地获取InputStream:
InputStream in = getClass().getResourceAsStream("/com/al/common/email/templates/foo.properties");
getResource()
/ getResourceAsStream()
相对path(没有前导'/'的那些pathgetResourceAsStream()
意味着将相对于表示该类所在的目录的目录search该资源。
使用java.lang.String.class.getResource("foo.txt")
将在类path中search(不存在的)文件/java/lang/String/foo.txt
。
使用绝对path(以'/'开始的path)意味着当前包被忽略。
若要添加Joachim Sauer的答案,如果您需要在静态上下文中执行此操作,则可以执行以下操作:
static { Properties prop = new Properties(); InputStream in = CurrentClassName.class.getResourceAsStream("foo.properties"); prop.load(in); in.close() }
(与以前一样,例外处理消失了)
从包的general.properties中的Class TestLoadPropertyFile.java加载属性文件时
情况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);
在这种情况下,属性文件必须位于类TestLoadPropertyFile.class用于成功加载的目录中。
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()); } } }
假设你使用Properties类,通过它的加载方法,我猜你正在使用ClassLoader getResourceAsStream来获取inputstream。
你是如何通过这个名字,看起来应该是这样的forms: /com/al/common/email/templates/foo.properties
我设法解决这个问题
Properties props = PropertiesUtil.loadProperties("whatever.properties");
另外,你必须把你的whatever.properties文件放在/ src / main / resources中
没有人会提到类似的,但比上面更简单的解决scheme,不需要处理这个类的包。 假设myfile.properties位于类path中。
Properties properties = new Properties(); InputStream in = ClassLoader.getSystemResourceAsStream("myfile.properties"); properties.load(in); in.close();
请享用
请使用下面的代码:
属性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(); } }