Загрузка нескольких файлов свойств

можно ли стекировать загруженные свойства в Java? Например, могу ли я сделать:

Properties properties = new Properties();

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

и открыть свойства?

6 ответов


вы можете сделать это:

Properties properties = new Properties();

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

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

properties.putAll(properties2);

Примечание: все поддерживаемые ключи уникальны. Таким образом, более поздние свойства, загруженные с тем же ключом, будут переопределены. Просто, чтобы сохранить для вашего ref :)


да стек свойств. Properties выходит Hashtable и load() просто называет put() на каждой паре ключ-значение.

соответствующий код из источник:

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

другими словами, загрузка из файла не очищает текущие записи. Однако обратите внимание, что если два файла содержат записи с одним и тем же ключом, первый будет перезаписан.


на самом деле, да. Ты можешь это сделать. Если какое-либо из свойств перекрывается, новое загруженное свойство будет иметь место более старого.


да, вам нужно передать файл свойств по умолчанию в конструкторе. Вот так их можно приковать.

например:

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

Это должно работать. Если же свойство определено в file1.свойства и file2.свойства, свойство в file2.свойства будут действовать.

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

теперь карта свойств будет иметь свойства из обоих файлов. Если тот же ключ появляется в file1 и file2, значение ключа из file1 будет обновлено в свойствах со значением в file2, так как я вызываю file1, а затем file2.


вы можете сделать это немного более динамично, работая с неопределенным количеством файлов.

параметром для этого метода должен быть список с путем к файлу свойств. Я сделал метод статическим, поместил его в класс с другими функциями, связанными с обработкой сообщений, и просто вызываю его, когда он мне нужен:

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