Можно ли включить файлы Bundle Resource в Bundle Resource

StackOverflow https://stackoverflow.com/questions/4614465

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top