从Java包加载属性文件


115

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

我已经尝试了一切,但无法解决。

最后,我的代码将在servlet容器中运行,但是我不想依赖任何容器。我写了JUnit测试用例,它需要在两个方面都能工作。

Answers:


235

从包中的类加载属性时,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在类路径上搜索(不合理的)文件。

使用绝对路径(以'/'开头的绝对路径)表示当前软件包将被忽略。


2
建议:添加有关何时使用相对路径和何时使用绝对路径的说明(开始时带有和不带有“ /”)。
亚伦·迪古拉

1
如果您的属性文件在src目录之外但仍在项目主管内部怎么办?
乔纳森(Jonathan)2012年

1
@jonney:Java本身没有“项目目录”的概念,某些IDE可能有。但是就Java而言,它只是文件系统中某个位置的文件,与类路径完全无关。
Joachim Sauer

50

要添加到Joachim Sauer的答案中,如果您需要在静态上下文中执行此操作,则可以执行以下操作:

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

(像以前一样,省略了异常处理。)


这是对我有用的答案。我无法获得工作的可接受答案。
史蒂夫HHH 2012年

1
@cobralibre如何读取位于项目resources文件夹中的属性文件maven
Kasun Siyambalapitiya

16

以下两种情况与从名为的示例类中加载属性文件有关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/目录中。


12
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();
    }

}

10
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());
        }

    }
}


1

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

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

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


9
你从哪里来PropertiesUtil
本·沃森

1

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

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

请享用


-2

请使用以下代码:

    属性p = 属性(); StringBuffer 路径= 新的StringBuffer “ com / al / common / email / templates /” ); 
    路径append “ foo.properties” ); InputStream fs = getClass ()。getClassLoader ()的getResourceAsStream 路径的toString ());   
      
    
                                    

if(fs == null){ System.err.println("Unable to load the properties file"); } else{ try{ p.load(fs); } catch (IOException e) { e.printStackTrace(); } }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.