Ist es möglich, Ressourcen-Bundle-Dateien innerhalb eines Ressourcenpaket enthalten

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

  •  26-09-2019
  •  | 
  •  

Frage

Wir verwenden java.util.ResourceBundle auf Lasteigenschaftsinformationen. Unsere Immobiliendatei so groß gewachsen und wir denken, die Master-Property-Datei in mehrere Teilmodule der Spaltung. Ist es möglich, dies zu erreichen?

master.properties

==> 

 master.properties
   include moduleA.properties
   include moduleB.properties

Lassen Sie mich wissen?

War es hilfreich?

Lösung

Zunächst einmal, ich frage mich, warum Sie sich entschieden haben java.util.Properties . Bedenkt man, wie Ihre Frage formuliert ist, scheinen Sie nicht über die Lokalisierung / Internationalisierung noch über Bundle-Datei Erbe zu kümmern.

Mit Properties ist es außerordentlich einfach, da es Map was wiederum bietet ein putAll() Methode eine andere Karte zu verschmelzen. Kickoff Beispiel:

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.

Wenn Sie wirklich in Verwendung ResourceBundle bestehen, Ihre beste Wette ist eine benutzerdefinierte ResourceBundle zu erstellen, wobei Sie das Laden von einem benutzerdefinierten contol Control .

Unter der Annahme, dass Sie haben den folgenden Eintrag in master.properties, die mit Basis Namen der Moduleigenschaften Dateien eine commaseparated Zeichenfolge darstellt:

include=moduleA,moduleB

Dann wird das folgende benutzerdefinierte ResourceBundle Beispiel sollte funktionieren:

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

}

(Trivialausnahmebehandlung und Lokalisierung Handhabung beiseite gelassen wird, dies für Sie ist nach oben)

Dies kann verwendet werden:

ResourceBundle bundle = new MultiResourceBundle("master");

Andere Tipps

Sie programmatisch können jedoch konstruieren Resource aber wie Sie Ihre Datei sagen, ist riesig dann was, wenn es in den Speicher geladen wird.

Update

public class Resource extends java.util.ResourceBundle {



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

    public Enumeration getKeys() {
         //code
    }
}

dann für IN locale

import java.util.*;

public class Resource_en_IN extends Resource{

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

Mehr zum Nachdenken als eine bewährte Lösung.

XML-Dateien Unterstützung Einheiten , um Inline-Text aus anderen Dateien, die während Parsing. Wenn gesehen komplexe XML-Dateien, in denen diese Technik verwendet wurde, um die Dateien zu modularisieren.

Properties unterstützt nun zwei Dateiformate, die gemeinsame .properties Format mit Schlüssel / Wert-Paare und eine XML-Formate. Properties kann laden und speichern zu / von XML-Dateien.

ResourceBundle hat eine direkte Unterklasse: PropertyResourceBundle. Es sieht aus wie diese Klasse tatsächlich auf das älteren Schlüssel / Wert-Paar-Format beschränkt ist, aber es könnte eine andere Klasse zu implementieren, wie XMLPropertyResourceBundle verwendet werden, die von Lese Eigenschaften von XML-Dateien fähig ist, wo der entity Trick, diese Dateien modularisieren helfen könnte.

Wenn das funktioniert -. Die bestehenden Immobilien-Dateien in XML-Dateien Eigenschaften verwandeln sollte einfach sein, nur die Properties-Klasse verwenden, lesen Sie von Standard-Format und speichern zu XML

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top