E 'possibile includere risorsa fascio file all'interno di un pacchetto di risorse
-
26-09-2019 - |
Domanda
Stiamo usando java.util.ResourceBundle
alle informazioni di proprietà di carico. Il nostro file di proprietà è cresciuta così enorme e stiamo pensando di dividere il file oggetti di scena in diversi moduli secondari. E 'possibile raggiungere questo?
master.properties
==>
master.properties
include moduleA.properties
include moduleB.properties
Fatemi sapere?
Soluzione
Prima di tutto, mi chiedo perché hai scelto java.util.ResourceBundle
oltre java.util.Properties
. Dato come la tua domanda è formulata, non sembra preoccuparsi di localizzazione / internazionalizzazione né di eredità di file bundle.
Con Properties
è straordinario facile poiché implementa Map
che a sua volta offre una putAll()
metodo per unire un'altra mappa. Kickoff esempio:
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.
Se proprio insisti nell'utilizzo ResourceBundle
, la soluzione migliore è quella di creare un ResourceBundle
personalizzato in cui si contol il carico corrispondente a una personalizzato Control
.
Supponendo che hai la seguente voce in master.properties
che rappresenta una stringa commaseparated con nomi di base dei file di proprietà di modulo:
include=moduleA,moduleB
Poi il seguente esempio ResourceBundle
personalizzato dovrebbe funzionare:
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;
}
}
}
(gestione delle eccezioni banale e la gestione di localizzazione è lasciato da parte, questo dipende da voi)
Questo può essere usato come:
ResourceBundle bundle = new MultiResourceBundle("master");
Altri suggerimenti
È possibile programatically, tuttavia, costruire ResourceBundle ma come si sta dicendo il file è enorme allora che cosa se viene caricato in memoria.
Aggiorna
public class Resource extends java.util.ResourceBundle {
public Object handleGetObject(String key) {
//code
}
public Enumeration getKeys() {
//code
}
}
poi per IN locale
import java.util.*;
public class Resource_en_IN extends Resource{
public Object handleGetObject(String key) {
//code
}
}
Più cibo per la mente di una soluzione testata.
Supporto file XML entità per testo in linea da altri file durante l'analisi. Se visto file xml complesse, dove questa tecnica è stato utilizzato per modularizzare i file.
Properties
ora supporta due formati di file, il formato .properties
comune con coppie chiave / valore e di un formati XML. Properties
può caricare e memorizzare da / per file xml.
ResourceBundle
ha una sottoclasse diretta: PropertyResourceBundle
. Sembra che questa classe sia effettivamente limitato al formato coppia chiave / valore più vecchio, ma potrebbe essere utilizzato per implementare un'altra classe, come XMLPropertyResourceBundle
che è in grado di leggere oggetti di file XML in cui il trucco entity
potrebbe contribuire a rendere modulare tali file.
se questo funziona -. Trasformando i file delle proprietà esistenti in file proprietà XML dovrebbe essere facile, basta utilizzare la classe Properties
, letta dal formato standard e negozio per XML