将注释属性加载到java中的Properties对象

时间:2016-08-18 17:34:51

标签: java properties load comments

我尝试使用load(new FileReader())方法将属性加载到java中的Properties对象。加载所有属性,但属性以(#)注释的属性开头。如何使用java API将这些注释属性加载到Properties对象。只有手动方式?

先谢谢。

1 个答案:

答案 0 :(得分:-1)

我可以建议你扩展java.util.Properties类以覆盖这些特性,但它不是为它设计的:许多东西都是硬编码的而不是可以覆盖的。因此,您应该对几乎没有修改的方法进行完整的复制粘贴。 例如,一次,内部使用的LineReader在加载属性文件时执行此操作:

 if (isNewLine) {
                isNewLine = false;
                if (c == '#' || c == '!') {
                    isCommentLine = true;
                    continue;
                }
 }

#是硬编码的。

修改

另一种方法可以逐行读取属性文件,如果它是#则删除第一个字符,并在ByteArrayOutputStream中写入需要修改的读取行。然后,您可以使用ByteArrayInputStream中的ByteArrayOutputStream.toByteArray()加载属性。

这是一个单元测试的可能实现:

输入myProp.properties

dog=woof
#cat=meow

单元测试:

@Test
public void loadAllPropsIncludingCommented() throws Exception {

    // check properties commented not retrieved
    Properties properties = new Properties();
    properties.load(LoadCommentedProp.class.getResourceAsStream("/myProp.properties"));
    Assert.assertEquals("woof", properties.get("dog"));
    Assert.assertNull(properties.get("cat"));

    // action
    BufferedReader bufferedIs = new BufferedReader(new FileReader(LoadCommentedProp.class.getResource("/myProp.properties").getFile()));
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    String currentLine = null;
    while ((currentLine = bufferedIs.readLine()) != null) {
        currentLine = currentLine.replaceFirst("^(#)+", "");
        out.write((currentLine + "\n").getBytes());
    }
    bufferedIs.close();
    out.close();

    // assertion
    ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
    properties = new Properties();
    properties.load(in);
    Assert.assertEquals("woof", properties.get("dog"));
    Assert.assertEquals("meow", properties.get("cat"));
}