E 'possibile includere risorsa fascio file all'interno di un pacchetto di risorse

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

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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top