从Java包加载属性文件

时间:2008-12-02 08:39:44

标签: java properties-file

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

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

最后,我的代码将在servlet容器中运行,但我不想依赖容器来处理任何事情。我编写了JUnit测试用例,它需要同时工作。

9 个答案:

答案 0 :(得分:230)

从包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

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

答案 1 :(得分:47)

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

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

(异常处理省略,如前所述。)

答案 2 :(得分:15)

以下两种情况涉及从名为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/目录中。

答案 3 :(得分:11)

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

}

答案 4 :(得分:8)

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

    }
}

答案 5 :(得分:2)

假设您使用Properties类,通过其load方法,我猜您正在使用ClassLoader getResourceAsStream来获取输入流。

你如何传递这个名字,它似乎应该采用这种形式:/com/al/common/email/templates/foo.properties

答案 6 :(得分:1)

我设法通过此次调用解决了这个问题

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

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

答案 7 :(得分:1)

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

Synopsis

iconv -f encoding -t encoding inputfile

Description

The iconv program converts the encoding of characters in inputfile from one coded character set to another. 
**The result is written to standard output unless otherwise specified by the --output option.**

--from-code, -f encoding

Convert characters from encoding

--to-code, -t encoding

Convert characters to encoding

--list

List known coded character sets

--output, -o file

Specify output file (instead of stdout)

--verbose

Print progress information.

享受

答案 8 :(得分:-2)

请使用以下代码:     

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