Можно ли включить файлы пакета ресурсов в пакет ресурсов - PullRequest
8 голосов
/ 06 января 2011

Мы используем java.util.ResourceBundle для загрузки информации о недвижимости. Наш файл свойств стал настолько огромным, и мы собираемся разбить главный файл свойств на несколько подмодулей. Можно ли этого добиться?

master.properties

==> 

 master.properties
   include moduleA.properties
   include moduleB.properties

Дайте мне знать?

Ответы [ 3 ]

12 голосов
/ 06 января 2011

Прежде всего, мне интересно, почему вы выбрали java.util.ResourceBundle вместо java.util.Properties. Учитывая то, как сформулирован ваш вопрос, вы, похоже, не заботитесь ни о локализации / интернационализации, ни о наследовании файла пакета.

С Properties это чрезвычайно просто, поскольку он реализует Map, который, в свою очередь, предлагает метод putAll() для объединения другой карты. Пример запуска:

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");
1 голос
/ 06 января 2011

Больше пищи для размышлений, чем проверенное решение.

XML-файлы поддерживают сущности для вставки текста из других файлов во время синтаксического анализа.Если видны сложные xml-файлы, где этот метод использовался для модульности файлов.

Properties теперь поддерживает два формата файлов, общий формат .properties с парами ключ / значение и форматы xml.Properties может загружать и сохранять в / из XML-файлов.

ResourceBundle имеет один прямой подкласс: PropertyResourceBundle.Похоже, этот класс на самом деле ограничен старым форматом пары ключ / значение, но его можно использовать для реализации другого класса, такого как XMLPropertyResourceBundle, который способен читать свойства из XML-файлов, где трюк entity может помочь в модульностиэти файлы.

Если это работает - преобразование существующих файлов свойств в файлы свойств XML должно быть простым, просто используйте класс Properties, считывайте из стандартного формата и сохраняйте в XML.

1 голос
/ 06 января 2011

Однако вы можете программно построить ResourceBundle, но, как вы говорите, ваш файл огромен, тогда что, если он загружен в память.

обновление

public class Resource extends java.util.ResourceBundle {



    public Object handleGetObject(String key) {
         //code
    }

    public Enumeration getKeys() {
         //code
    }
}

затем для локали IN

import java.util.*;

public class Resource_en_IN extends Resource{

  public Object handleGetObject(String key) {
    //code
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...