L'objectif est de définir des paramètres dans un fichier ini, par exemple :
[database]DriverClass=org.hsqldb.jdbcDriverurl=jdbc:hsqldb:db/maBaseUsername=saPassword=default_schema=PUBLIC[appli];mode : prod|debugmode=debug;fenetre : normal|maximizedfenetre=normalfenetre_largeur=1024fenetre_hauteur=768Le fichier de paramètres va être traité à partir de la classe téléchargée ici : ftp://ftp-developpez.com/java/sources/ProfileReader.zip, et modifiée pour tenir compte des variables vides (exemple : Password=). Voici la classe complète modifiée :
import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.util.Hashtable;import java.util.StringTokenizer;/** * * @author ftp://ftp-developpez.com/java/sources/ProfileReader.zip * */public class ProfileReader { private Hashtable<String, Hashtable<String, String>> _sections; /** * Creates a new ProfileReader */ public ProfileReader() { _sections = new Hashtable<String, Hashtable<String, String>>(); } /** * Load the current objet with the data found in the given stream * * @param aStream * the stream that represent the INI file. * @throws Exception * in case of problems. */ public void load(InputStream aStream) throws Exception { if (null == aStream) { return; } BufferedReader reader = new BufferedReader(new InputStreamReader( aStream)); String line = null; String sectionName = null; Hashtable<String, String> section = null; while ((line = reader.readLine()) != null) { line = line.trim(); // All the data should be in a section if (null == sectionName) { if ((!line.startsWith("[")) || (!line.endsWith("]"))) { throw new Exception( "Invalid format: data found outside section"); } sectionName = line.substring(1, line.length() - 1).trim(); addSection(sectionName); section = getSection(sectionName); } else { if (line.startsWith("[")) { if (!line.endsWith("]")) { throw new Exception( "Invalid format: no ending ] for section name"); } sectionName = line.substring(1, line.length() - 1).trim(); addSection(sectionName); section = getSection(sectionName); } else { addLineToSection(line, section); } } } } /** * Return the value of the given key in the given section * * @param aSectionName * the name of the section * @param aKey * the key * @return the value if found or null. */ public String getProperty(String aSectionName, String aKey) { Hashtable<String, String> section = getSection(aSectionName); if (null == section) { return null; } return (String) section.get(aKey); } private void addLineToSection(String aLine, Hashtable<String, String> aSection) throws Exception { if (null == aLine) { return; } if (null == aSection) { throw new Exception("No section found to add data"); } aLine = aLine.trim(); // lines that starts with ; are comments if (aLine.startsWith(";")) { return; } // Avoid the empty lines if (aLine.length() == 0) { return; } if (aLine.endsWith("=")) { } // The format of a line of data is: key = value StringTokenizer st = new StringTokenizer(aLine, "="); String key = ""; String value = ""; // The value is empty if (aLine.endsWith("=")) { key = st.nextToken().trim(); } else { // the value is defining if (st.countTokens() != 2) { throw new Exception("Invalid format of data: " + aLine); } key = st.nextToken().trim(); // a key should not contain spaces for (int index = 0; index < key.length(); index++) { if (Character.isWhitespace(key.charAt(index))) { throw new Exception("Invalid format of data: " + aLine); } } value = st.nextToken().trim(); } aSection.put(key, value); } private void addSection(String aSectionName) { if (null == aSectionName) { return; } Hashtable<String, String> section = getSection(aSectionName); if (null == section) { section = new Hashtable<String, String>(); _sections.put(aSectionName, section); } } private Hashtable<String, String> getSection(String aSectionName) { return (Hashtable<String, String>) _sections.get(aSectionName); }}Les paramètres sont lus ainsi :
import java.io.FileInputStream;import java.io.InputStream;/** * @author quinton classe contenant les paramètres généraux de l'application */public class Parametre { public static String driverClass, url, username, password, default_schema, mode, fenetre; public static int fenetre_largeur, fenetre_hauteur; /** * Instanciation post-lecture des parametres */ public Parametre() { } /** * Première instanciation pour lecture des paramètres * * @param String * nomFichierParam */ public Parametre(String nomFichierParam) { ProfileReader pr = new ProfileReader(); try { InputStream inputStream = new FileInputStream(nomFichierParam); try { pr.load(inputStream); } catch (Exception e) { System.err.println("Impossible de lire le fichier " + nomFichierParam); System.err.println(e.getMessage()); } /* * Lecture des parametres */ try { driverClass = pr.getProperty("database", "DriverClass"); url = pr.getProperty("database", "url"); username = pr.getProperty("database", "Username"); password = pr.getProperty("database", "Password"); default_schema = pr.getProperty("database", "default_schema"); mode = pr.getProperty("appli", "mode"); fenetre = pr.getProperty("appli", "fenetre"); try { fenetre_largeur = Integer.parseInt(pr.getProperty("appli", "fenetre_largeur")); } catch (Exception e) { fenetre_largeur = 800; } try { fenetre_hauteur = Integer.parseInt(pr.getProperty("appli", "fenetre_hauteur")); } catch (Exception e) { fenetre_hauteur = 600; } } catch (Exception e) { System.err .println("Impossible d'initialiser correctement la classe ProfileReader"); } } catch (Exception e) { System.err .println("Impossible d'ouvrir ou de trouver le fichier de paramètres " + nomFichierParam); } }}et utilisés ainsi, dans l'application :
String nomFichierParam="param/param.ini";new Parametre(nomFichierParam);[...]fenetre.setSize(Parametre.fenetre_largeur, Parametre.fenetre_hauteur);