Загрузка нескольких файлов свойств
можно ли стекировать загруженные свойства в 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();
}
}