如何用另一个java.util.Properties中的所有对覆盖java.util.Properties中的一些对?

时间:2016-06-04 15:34:35

标签: java properties

我正在寻找一个很好的方法,用java.util.Properties中的所有对来覆盖java.util.Properties中的Java值? 这样更好:

Properties overrideProperties = createPropertiesFromFile(override);
Properties mixProperties = createPropertiesFromFile(basis);

for (Entry<Object, Object> entry : overrideProperties.entrySet()) {
    mixProperties.put(entry.getKey(), entry.getValue());
}

3 个答案:

答案 0 :(得分:2)

Properties扩展了Hashtable<Object, Object>,因此您应该可以使用Hashtable.putAll方法将overrideProperties的所有条目添加到mixProperties

Properties overrideProperties = createPropertiesFromFile(override);
Properties mixProperties = createPropertiesFromFile(basis);
mixProperties.putAll(overrideProperties);

答案 1 :(得分:2)

这是覆盖属性的另一种方法

    Properties properties = new Properties();
    properties.load(new FileReader("prop1.properties"));
    System.out.println(properties);
    properties.load(new FileReader("prop2.properties"));
    System.out.println(properties);

答案 2 :(得分:1)

如果要覆盖已存在的条目,但不添加覆盖中可能存在的新密钥,请执行以下操作:

overrideProperties.forEach(mixProperties::putIfAbsent);

如果要无条件地写入每个覆盖条目,请使用:

overrideProperties.forEach(mixProperties::put);

Properties个对象也被设计为在构造时链接在一起,所以在第二种情况下(取决于你的应用程序),做这样的事情也可能是合适的:

Properties defaults = new Properties();
try (InputStream is = Files.newInputStream(Paths.get("defaults.properties"))) {
  properties.load(is);
}
Properties custom = new Properties(defaults);
try (InputStream is = Files.newInputStream(Paths.get("override.properties"))) {
  custom.load(is);
}