Можно ли включить файлы Bundle Resource в Bundle Resource
-
26-09-2019 - |
Вопрос
Мы используем java.util.ResourceBundle
загрузить информацию о недвижимости. Наш файл недвижимости вырос таким огромным, и мы думаем о разделении файла основного свойства в несколько субъектов. Можно ли достичь этого?
master.properties
==>
master.properties
include moduleA.properties
include moduleB.properties
Дайте мне знать?
Решение
Прежде всего, мне интересно, почему вы выбрали java.util.ResourceBundle
над java.util.Properties
. Отказ Учитывая, как ваш вопрос сформулирован, вы, кажется, не заботитесь о локализации / интернационализации, ни о наследнии файлов Bundle.
С участием Properties
Это необычайно легко, так как он реализует Map
который в свою очередь предлагает putAll()
Метод объединить другую карту. Пример Kickoff:
Properties master = new Properties();
master.load(masterInput);
Properties moduleA = new Properties();
moduleA.load(moduleAinput);
master.putAll(moduleA);
Properties moduleB = new Properties();
moduleB.load(moduleBinput);
master.putAll(moduleB);
// Now `master` contains the properties of all files.
Если вы действительно настаиваете в использовании ResourceBundle
, Ваша лучшая ставка - создать пользовательский ResourceBundle
где вы ограничиваете загрузку на заказ Control
.
Предполагая, что вы следующий вход в master.properties
который представляет собой коммущающую строку с базовыми именами файлов свойств модуля:
include=moduleA,moduleB
Тогда следующий пользовательский ResourceBundle
Пример должен работать:
public class MultiResourceBundle extends ResourceBundle {
protected static final Control CONTROL = new MultiResourceBundleControl();
private Properties properties;
public MultiResourceBundle(String baseName) {
setParent(ResourceBundle.getBundle(baseName, CONTROL));
}
protected MultiResourceBundle(Properties properties) {
this.properties = properties;
}
@Override
protected Object handleGetObject(String key) {
return properties != null ? properties.get(key) : parent.getObject(key);
}
@Override
@SuppressWarnings("unchecked")
public Enumeration<String> getKeys() {
return properties != null ? (Enumeration<String>) properties.propertyNames() : parent.getKeys();
}
protected static class MultiResourceBundleControl extends Control {
@Override
public ResourceBundle newBundle(
String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException
{
Properties properties = load(baseName, loader);
String include = properties.getProperty("include");
if (include != null) {
for (String includeBaseName : include.split("\\s*,\\s*")) {
properties.putAll(load(includeBaseName, loader));
}
}
return new MultiResourceBundle(properties);
}
private Properties load(String baseName, ClassLoader loader) throws IOException {
Properties properties = new Properties();
properties.load(loader.getResourceAsStream(baseName + ".properties"));
return properties;
}
}
}
(Обработка тривиального исключения и обработка локализации остается в стороне, это зависит от вас)
Это можно использовать как:
ResourceBundle bundle = new MultiResourceBundle("master");
Другие советы
Однако вы можете программически построить ResourceBundle, но, как вы говорите, ваш файл огромный, то что, если оно загружено в память.
Обновить
public class Resource extends java.util.ResourceBundle {
public Object handleGetObject(String key) {
//code
}
public Enumeration getKeys() {
//code
}
}
Тогда в локали
import java.util.*;
public class Resource_en_IN extends Resource{
public Object handleGetObject(String key) {
//code
}
}
Больше еды для мысли, чем проверенное решение.
Поддержка файлов XML объекты встроенный текст из других файлов во время анализа. Если видно сложные файлы XML, где эта методика использовалась для модульных файлов.
Properties
Теперь поддерживает два формата файлов, общие .properties
Формат с парами ключа / значения и форматы XML. Properties
Можно загрузить и хранить в / из файлов XML.
ResourceBundle
имеет один прямой подкласс: PropertyResourceBundle
. Отказ Похоже, этот класс на самом деле ограничен более старым форматом клавиш / Value Pair, но его можно использовать для реализации другого класса, как XMLPropertyResourceBundle
который способен для чтения свойств от файлов XML, где entity
Трюк может помочь модулировать эти файлы.
Если это работает - преобразование существующих файлов свойств в файлы XML-свойств должны быть легко, просто используйте Properties
Класс, читайте из стандартного формата и храните в XML.