从Java包加载属性文件

我需要读取com.al.common.email.templatescom.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(); } }