MokaHints
Le Properties
di
Andrea Trentini
Gestione di un file di configurazione "application-wide"


 

Quando serve una semplice fonte di informazioni per l'inizializzazione di una applicazione,
              farebbe comodo una utility per gestire i file ".ini".  La classe Properties fa al caso nostro.
Scopo 

Spesso e volentieri mi e' capitato di dover rendere configurabile un prodotto. Una serie di impostazioni iniziali (dimensioni e posizione delle finestre, colori, stringhe varie, etc.) vanno rese modificabili dall'utente. Chiaramente non vorrete dargli il sorgente... (anche se puo' decompilare il bytecode :-) Per cui e' meglio prevedere un qualche tipo di file di configurazione accessibile e umanamente leggibile.
La classe Properties e' fatta a tal scopo. Specializza una Hashtable e fornisce la possibilita' di inizializzarsi da un file su disco. Implementa di fatto una tabella di stringhe, a cui si accede tramite chiave, customizzata per la rappresentazione in memoria di un ".ini" file.
Uso
Se guardate in fondo a questo articoletto, trovate un esempio di file ".ini" gia' scritto, dovete solo salvarlo su un file ("config.ini"), compilare il sorgente (sempre in fondo) e lanciare "java UseConfig". Otterrete una finestrella tipo questa:

    Prima

Se ora provate a cambiare qualche valore nel file "config.ini" (che deve trovarsi nella stessa directory) otterrete una variazione dell'aspetto a runtime (mi raccomando: NON dovete ricompilare il codice java, lo scopo e' infatti quello di poter leggere valori nuovi a runtime SENZA dover toccare il codice):
    Dopo


    in questo caso ho allargato la finestra e cambiato la label


Sorgenti - Il gestore
import java.util.*;
import java.io.*;

/**
 Una classe usata staticamente per gestire un file
 di configurazione unico per una singola applicazione.
 E' abstract in modo da non poter essere istanziata.
 @author Andrea Trentini
*/
public abstract class Config
{
   protected static Properties cfg;

   /**
    Questo metodo ritorna una stringa col valore corrispondente
    alla chiave fornita.
   */
   public static String getProp(String prop)
   {
      if(cfg==null)
      {
         cfg=new Properties();
         try{
            cfg.load(new FileInputStream("config.ini"));
         }catch(Exception e)
         {e.printStackTrace();}
      }

      // questa decidete voi se metterla o meno...
      if(cfg.getProperty(prop)==null)
         throw new RuntimeException(prop+": manca voce di configurazione!!!");

      return cfg.getProperty(prop);
   }

   /**
    Questo metodo ritorna invece un intero, sperando
    che la stringa trovata rappresentasse davvero un intero :-)
   */
   public static int getInt(String prop)
   {
      return Integer.parseInt(getProp(prop));
   }
}
 
 
 

Sorgenti - Il main di prova

import java.awt.*;

public class UseConfig
{
   public static void main(String[] arg)
   {
        Frame f=new Frame(Config.getProp("MAIN_TITLE"));
        Label l=new Label(Config.getProp("MAIN_STRING"),Label.CENTER);
        f.add(l);

        f.setBounds(
         Config.getInt("MAIN_X"),
         Config.getInt("MAIN_Y"),
         Config.getInt("MAIN_W"),
         Config.getInt("MAIN_H")
        );

        f.setVisible(true);
   }
}
Un esempio di file di configurazione
(va nominato "config.ini" a meno di non cambiare il sorgente)

# commento, viene ignorato
# un esempio di file di configurazione

# dimensione e posizione iniziale della finestra principale
# in pixel
MAIN_X=100
MAIN_Y=100
MAIN_W=350
MAIN_H=70

# testo da far apparire nella finestra
MAIN_STRING=Ciao a tutti i lettori di MOKABYTE !

# titolo della finestra
MAIN_TITLE=Esempio di gestione di file di configurazione...
 


MokaByte rivista web su Java

MokaByte ricerca nuovi collaboratori. 
Chi volesse mettersi in contatto con noi può farlo scrivendo a mokainfo@mokabyte.it