2009-02-16 8 views
2

Je crée un ResourceBundle à partir d'un fichier, ce bundle contient < String, String> values.Fusionner des propriétés dans un ResourceBundle à partir de System.getProperties()

InputStream in = getClass().getResourceAsStream("SQL.properties"); 
properties = new PropertyResourceBundle(in); 
in.close(); 

Je voudrais ajouter/remplacer sur cet ensemble des propriétés que je passe de la ligne de commande à l'aide -Dsome.option.val.NAME1 = HiEarth

Je me fous déverser l'ancien paquet et en créer un nouveau à la place.

Pourriez-vous s'il vous plaît un conseil?

Je pense que ce que je dois faire est:

  1. Créer à partir du paquet HashMap < String, String>
  2. Remplacer les valeurs.
  3. Transformez la HashMap en un InputStream. // C'est la partie compliquée ...
  4. Construis le nouveau paquet à partir de ça.

Répondre

1

Cela fait partie de ce que vous voulez (convertit les System.properties à un ResourceBundle). Une meilleure gestion des erreurs est laissée à vous :-)

  
    public static ResourceBundle createBundle() 
    { 
     final ResourceBundle bundle; 
     final Properties  properties; 
     final CharArrayWriter charWriter; 
     final PrintWriter  printWriter; 
     final CharArrayReader charReader; 

     charWriter = new CharArrayWriter(); 
     printWriter = new PrintWriter(charWriter); 

     properties = System.getProperties(); 
     properties.list(printWriter); 

     charReader = new CharArrayReader(charWriter.toCharArray()); 

     try 
     { 
      bundle = new PropertyResourceBundle(charReader); 

      return (bundle); 
     } 
     catch(final IOException ex) 
     { 
      // cannot happen 
      ex.printStackTrace(); 
     } 

     throw new Error(); 
    } 
+0

+1. Je voudrais ajouter une note de prudence cependant. 'Properties.list()' * tronque * les valeurs> 40 caractères (voir le rapport de bogue: http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=e527dbe27619a23e918ce485c961?bug_id=5089823). Pensez à utiliser 'Properties.store()' à la place. –

0

Cela pourrait ne pas être la meilleure façon de le faire, mais il est le meilleur que je peux penser à: mettre en œuvre une sous-classe de ResourceBundle qui stocke les propriétés que vous voulez ajouter/remplacer, puis définissez le parent de ce paquet être le PropertyResourceBundle vous chargez à partir du flux d'entrée.

InputStream in = getClass().getResourceAsStream("SQL.properties"); 
properties = new PropertyResourceBundle(in); 
in.close(); 
MyCLIResourceBundle b = new MyCLIResourceBundle(properties); 
// use b as your bundle 

où la mise en œuvre serait quelque chose comme

public class MyCLIResourceBundle extends ResourceBundle { 
    public MyCLIResourceBundle(ResourceBundle parent) { 
     super(); 
     this.setParent(parent); 
     // go on and load your chosen properties from System.getProperties() or wherever 
    } 
}