21

是否可以在 Java 中堆叠加载的属性?例如我可以这样做:

Properties properties = new Properties();

properties.load(new FileInputStream("file1.properties"));
properties.load(new FileInputStream("file2.properties"));

并从两者访问属性?

4

6 回答 6

40

你可以这样做:

Properties properties = new Properties();

properties.load(new FileInputStream("file1.properties"));

Properties properties2 = new Properties();
properties2.load(new FileInputStream("file2.properties"));

properties.putAll(properties2);

注意:维护的所有密钥都是唯一的。因此,稍后使用相同键加载的属性将被覆盖。只是为了你的参考:)

于 2012-04-16T20:31:12.337 回答
11

是的,属性堆栈。Properties扩展Hashtableload()简单地调用put()每个键值对。

来自Source的相关代码:

String key = loadConvert(lr.lineBuf, 0, keyLen, convtBuf); 
String value = loadConvert(lr.lineBuf, valueStart, limit - valueStart, convtBuf); 
put(key, value); 

换句话说,从文件加载不会清除当前条目。但是,请注意,如果两个文件包含具有相同键的条目,则第一个将被覆盖。

于 2012-04-16T20:33:45.733 回答
3

其实,是。你可以这样做。如果任何属性重叠,则新加载的属性将取代旧的。

于 2012-04-16T20:35:02.753 回答
2

是的,您需要在构造函数中传递默认属性文件。像这样,您可以将它们链接起来。

例如:

Properties properties1 = new Properties();
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("file1.properties"))){
    properties1.load(bis);
}

Properties properties2 = new Properties(properties1);
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("file2.properties"))){
    properties2.load(bis);
}
于 2012-04-16T20:37:08.223 回答
1

这也应该有效。如果在 file1.properties 和 file2.properties 中定义了相同的属性,则 file2.properties 中的属性将生效。

    Properties properties = new Properties();
    properties.load(new FileInputStream("file1.properties"));
    properties.load(new FileInputStream("file2.properties"));

现在属性映射将具有来自两个文件的属性。如果相同的键出现在 file1 和 file2 中,则来自 file1 的键的值将在属性中更新为 file2 中的值,因为我先调用 file1 然后调用 file2。

于 2014-05-22T15:20:27.003 回答
1

您可以更动态地执行此操作,使用不确定数量的文件。

此方法的参数应该是一个包含属性文件路径的列表。我将方法设为静态,将其放在具有其他消息处理相关功能的类中,并在需要时简单地调用它:

public static Properties loadPropertiesFiles(LinkedList<String> files) {
    try {
        Properties properties = new Properties();

                for(String f:files) {
                    Resource resource = new ClassPathResource( f );
                    Properties tempProp = PropertiesLoaderUtils.loadProperties(resource);
                    properties.putAll(tempProp);
                }
                return properties;
    }
    catch(IOException ioe) {
                return new Properties();
    }
}
于 2016-12-16T15:51:26.050 回答