IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

ResourceBundle Vs Properties


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Par défaut ResourceBundle Vs Properties
    Bonjour,

    Suite à un problème d'internationalisation (http://www.developpez.net/forums/sho...83#post1557683),
    je me suis penché sur les ResourceBundle et les Properties d'un peu plus près.

    Jusqu'à présent lorsque j'avais besoin de récupérer une chaine dans un fichier properties je le faisais de la manière suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    String message = "";
    ResourceBundle helloWorldResourceBundle = ResourceBundle.getBundle("Ressources.helloWorld");
    try{
      message = helloWorldResourceBundle.getString("firstWords");
    }catch( Exception e){
      message = "I don't know what to say!";
    }
    System.out.println(message);
    Mais apparement on peut aussi le faire ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    String message = "";
    try{
      Properties helloWorldProperties = new Properties();
      FileInputStream tmpFile = new FileInputStream("helloWorld.properties");
      helloWorldProperties.load(tmpFile);
      message = helloWorldProperties.getProperty("firstWords");
    }catch( Exception e){
      message = "I don't know what to say!";
    }
    System.out.println(message);
    Ce qui m'a l'air d'être a peu de chose près équivalent à ce que je faisais avant, en un peu moins ramassé.
    Par contre, si je veux utiliser un fichier XML à la place d'un fichier properties, il ne semble y avoir que l'option de passer par la classe properties:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    String message = "";
    try{
      Properties helloWorldProperties = new Properties();
      FileInputStream tmpFile = new FileInputStream("helloWorld.xml");
      helloWorldProperties.loadFromXML(tmpFile);
      message = helloWorldProperties.getProperty("firstWords");
    }catch( Exception e){
      message = "I don't know what to say!";
    }
    System.out.println(message);
    Avant de basculer tout mon appli de "fichiers properties" vers "fichiers XML" (pour des raisons de compatibilité UTF-8), je voudrai m'assurer que rien ne m'a échappé.
    Si c'est le cas, merci de me prévenir.

    Je vais attendre un peu avant de me lancer dans la migration...

    sources: http://www-128.ibm.com/developerwork...On-JDK_5.0-XML

  2. #2
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Je ne suis pas certain que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     FileInputStream tmpFile = new FileInputStream("helloWorld.xml");
    Effectivement c'est ce que fait le ResourceBundle car le fichier doit aussi être dans le classpath.

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Properties permet d'obtenir des couples clef/valeur à partir d'un fichier texte.

    ResourceBundle permet de gérer facilement la localisation d'une application en gérant de multiples sources (par exemple des fichiers properties différents pour chaque langue)

    a++

  4. #4
    Membre éclairé
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Par défaut
    Citation Envoyé par adiGuba
    Salut,


    Properties permet d'obtenir des couples clef/valeur à partir d'un fichier texte.

    ResourceBundle permet de gérer facilement la localisation d'une application en gérant de multiples sources (par exemple des fichiers properties différents pour chaque langue)

    a++
    Ce qui veut dire que toute la gestion intelligente des helloWorld_fr.properties, helloWorld_en.properties, helloWorld_ru.properties et autre helloWorld_xx.properties doit être fait à la mimine?

    J'entend par gestion intelligente:
    -récuperer tout les fichiers pouvant être concerné
    -établir une "hierarchie" entre les différentes langues lorsque le premier choix de langue n'est pas disponible (en_US vs en_GB par exemple).

    Même si ce n'est pas insurmontable c'est quand même génant si on veut passer sur du XML sans avoir chaque couple key/value présent dans chaque fichier.

  5. #5
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    Citation Envoyé par JMLLB
    Ce qui veut dire que toute la gestion intelligente des helloWorld_fr.properties, helloWorld_en.properties, helloWorld_ru.properties et autre helloWorld_xx.properties doit être fait à la mimine?

    J'entend par gestion intelligente:
    -récuperer tout les fichiers pouvant être concerné
    -établir une "hierarchie" entre les différentes langues lorsque le premier choix de langue n'est pas disponible (en_US vs en_GB par exemple).

    Même si ce n'est pas insurmontable c'est quand même génant si on veut passer sur du XML sans avoir chaque couple key/value présent dans chaque fichier.
    voyons remontons le temps ....
    tu fais un resourceBundle.getBundle("helloworld")
    ensuite par exemple bundle.getString("FIN")
    et selon le contexte culturel dans lequel tu te trouves le système de Bundle te trouve la bonne ressource en remontant la hiérarchie.

    seul truc auquel il faut faire attention: les performances (faire le getBundle une seule fois si possible)
    bon ça c'était l'ancienne version avec .properties .... avec XML tu peux faire un nouveau truc en 1.6 : ResourceBundle.Control (il me semble ...)

    par ailleurs pour faire un load de Properties il n'est pas politiquement correct de passer par un nom de fichier
    faire un : load(clazz.getResourceAsStream("nomressource"))
    (avec touskif comme try/catch)
    -idem pour le loadXeuMeuLeu-

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par JMLLB
    Ce qui veut dire que toute la gestion intelligente des helloWorld_fr.properties, helloWorld_en.properties, helloWorld_ru.properties et autre helloWorld_xx.properties doit être fait à la mimine?
    Heu... oui car c'est ResourceBundle qui gère tout cela (Properties n'est rien que le fournisseur de contenu en quelque sorte).

    Citation Envoyé par JMLLB
    Même si ce n'est pas insurmontable c'est quand même génant si on veut passer sur du XML sans avoir chaque couple key/value présent dans chaque fichier.
    Pas forcément...

    Avec Java 6 (qui devrait sortir en version final durant le mois de décembre), il est désormais possible de mieux créer la création de ResourceBundle, ce qui permettrait éventuellement de gérer le format XML simplement : ResourceBundle.getBundle(String, Locale, ClassLoader, ResourceBundle.Control)

    Sinon tu peux jouer avec le fait que la méthode getBundle() attend soit un fichier properties, soit une classe Java qui hérite de ResourceBundle.

    Si tu fais en sorte que ces classes charge le XML ca marche !


    Par exemple, tu crées une classe fille de ResourceBundle qui se charge :
    1. De charger le fichier xml du même nom dans un Properties.
    2. D'implémenter les méthodes abtraites de ResourceBundle.


    Ce qui donne par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public abstract class XMLResourceBundle extends ResourceBundle {
     
    	private final Properties xmlProperties = new Properties();
     
    	protected XMLResourceBundle() throws IOException {
    		String resName = getClass().getName().replace('.', '/') + ".xml";
    		InputStream stream = getClass().getClassLoader().getResourceAsStream(resName);
    		try {
    			this.xmlProperties.loadFromXML(stream);
    		} finally {
    			stream.close();
    		}
    	}
     
    	public Object handleGetObject(String key) {
    		return this.xmlProperties.get(key);
    	}
     
    	public Enumeration getKeys() {
    		return this.xmlProperties.keys();
    	}
     
    }

    Ensuite tu transformes tout tes *.properties en XML, et pour chaque fichier tu crée une classe du même nom.
    Par exemple, si tes fichiers *.xml sont placé dans le package ressources (nota : les noms de packages commencent par une minuscule), et que tu as un fichier helloWorld_fr_FR.xml, il te faut la classe suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    package ressources;
     
    public class helloWorld_fr_FR extends XMLResourceBundle {
     
    	public helloWorld_fr_FR() throws java.io.IOException {
    		super();
    	}
    }
    C'est cette classe qui te sera retourné par la méthode ResourceBundle.getBundle() et qui te permettra de charger le XML


    Le seul défaut c'est que tu devra avoir autant de classe que de fichier XML...

    a++

  7. #7
    Membre éclairé
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Par défaut Merci!
    Merci pour la démo, maintenant c'est plus clair.

    Cela étant dit, je pense que je vais attendre Noël voir ce que papa-Sun a mis sous le sapin.

    Je vais attendre la Nouvelle année et ses bonnes résolutions pour transcrire mes fichiers properties en XML.

    @+

  8. #8
    Membre éclairé
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Par défaut
    Citation Envoyé par thibaut
    Je ne suis pas certain que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     FileInputStream tmpFile = new FileInputStream("helloWorld.xml");
    Effectivement c'est ce que fait le ResourceBundle car le fichier doit aussi être dans le classpath.
    Désolé j'avais oublié de préciser le nom du fichier avec le ResourceBundle.
    Je viens de corriger.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ResourceBundle] emplacement du fichier properties
    Par zaboug dans le forum AWT/Swing
    Réponses: 10
    Dernier message: 28/05/2010, 10h52
  2. ResourceBundle et properties : emplacement des fichiers
    Par HunTR dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 16/04/2010, 22h21
  3. ResourceBundle et emplacement des .properties
    Par Anubis dans le forum Langage
    Réponses: 2
    Dernier message: 19/02/2009, 22h54
  4. ResourceBundle fichier properties
    Par totoche dans le forum Débuter
    Réponses: 2
    Dernier message: 09/09/2008, 00h37
  5. [ResourceBundle] accéder à un fichier properties
    Par sylsau dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 04/12/2007, 22h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo