Ist es möglich, Ressourcen-Bundle-Dateien innerhalb eines Ressourcenpaket enthalten
-
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?
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