web-dev-qa-db-fra.com

Comment charger un ensemble de ressources à partir d'une ressource de fichier en Java?

J'ai un fichier appelé mybundle.txt dans c:/temp -

c:/temp/mybundle.txt

Comment charger ce fichier dans un Java.util.ResourceBundle? Le fichier est un ensemble de ressources valide.

Ça n'a pas l'air de fonctionner:

Java.net.URL resourceURL = null;

String path = "c:/temp/mybundle.txt";
Java.io.File fl = new Java.io.File(path);

try {
   resourceURL = fl.toURI().toURL();
} catch (MalformedURLException e) {             
}           

URLClassLoader urlLoader = new URLClassLoader(new Java.net.URL[]{resourceURL});
Java.util.ResourceBundle bundle = Java.util.ResourceBundle.getBundle( path , 
                Java.util.Locale.getDefault(), urlLoader );
46
user143794

Tant que vous nommez correctement les fichiers de votre ensemble de ressources (avec une extension .properties), cela fonctionne:

File file = new File("C:\\temp");
URL[] urls = {file.toURI().toURL()};
ClassLoader loader = new URLClassLoader(urls);
ResourceBundle rb = ResourceBundle.getBundle("myResource", Locale.getDefault(), loader);

où "c:\temp" est le dossier externe (PAS sur le chemin de classe) contenant les fichiers de propriétés, et "myResource" se rapporte à myResource.properties, myResource_fr_FR.properties, etc.

Crédit pour http://www.coderanch.com/t/432762/Java/java/absolute-path-bundle-file

56
Forge_7

Lorsque vous dites que c'est "un ensemble de ressources valide", s'agit-il d'un ensemble de ressources de propriété? Si oui, le moyen le plus simple de le charger probablement:

try (FileInputStream fis = new FileInputStream("c:/temp/mybundle.txt")) {
  return new PropertyResourceBundle(fis);
}
41
Jon Skeet

1) Modifiez l’extension en propriétés (ex. Mybundle.properties.)
2) Mettez votre fichier dans un fichier jar et ajoutez-le à votre chemin de classe.
3) Accédez aux propriétés à l'aide de ce code:

ResourceBundle rb = ResourceBundle.getBundle("mybundle");
String propertyValue = rb.getString("key");
20
MrPhil

Depuis le JavaDocs pour ResourceBundle.getBundle(String baseName):

baseName - le nom de base du bundle de ressources, un qualifié complet nom du cours

Cela signifie simplement que le regroupement de ressources doit figurer sur le chemin de classe et que baseName devrait être le package contenant le regroupement plus le nom du regroupement, mybundle dans votre cas.

Laissez l'extension et tous les paramètres régionaux qui font partie du nom de l'ensemble, la machine virtuelle Java en effectuera le tri en fonction de l'environnement local par défaut. Pour plus d'informations, consultez la documentation sur Java.util.ResourceBundle .

11
Nick Holt

Pour application JSF

Pour obtenir les fichiers prop du regroupement de ressources à partir d'un chemin d'accès donné, utilisez-les dans une application JSF. 

  • Définissez le paquet avec URLClassLoader pour une classe qui étend ResourceBundle pour charger le paquet à partir du chemin de fichier. 
  • Spécifiez la classe à la propriété basename de la balise loadBundle .<f:loadBundle basename="Message" var="msg" />

Pour une implémentation de base du RB étendu, veuillez consulter l'exemple à Exemple de groupe de ressources personnalisées

/* Create this class to make it base class for Loading Bundle for JSF apps */
public class Message extends ResourceBundle {
        public Messages (){
                File file = new File("D:\\properties\\i18n");  
                ClassLoader loader=null;
                   try {
                       URL[] urls = {file.toURI().toURL()};  
                       loader = new URLClassLoader(urls); 
                       ResourceBundle bundle = getBundle("message", FacesContext.getCurrentInstance().getViewRoot().getLocale(), loader);
                       setParent(bundle);
                       } catch (MalformedURLException ex) { }
       }
      .
      .
      .
    }

Sinon, obtenez le bundle à partir de la méthode getBundle mais des paramètres régionaux d'autres sources comme Locale.getDefault(); la nouvelle classe (RB) peut ne pas être nécessaire dans ce cas. 

6
noboundaries

Si, comme moi, vous vouliez réellement charger des fichiers .properties à partir de votre système de fichiers au lieu du chemin de classe, mais que vous gardiez sinon tous les smarts liés à la recherche, procédez comme suit:

  1. Créer une sous-classe de Java.util.ResourceBundle.Control
  2. Ignorer la méthode newBundle()

Dans cet exemple stupide, je suppose que vous avez un dossier à C:\temp qui contient une liste non hiérarchique de fichiers ".properties":

public class MyControl extends Control {
@Override
public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
        throws IllegalAccessException, InstantiationException, IOException {

    if (!format.equals("Java.properties")) {
        return null;
    }

    String bundleName = toBundleName(baseName, locale);
    ResourceBundle bundle = null;

    // A simple loading approach which ditches the package      
    // NOTE! This will require all your resource bundles to be uniquely named!
    int lastPeriod = bundleName.lastIndexOf('.');

    if (lastPeriod != -1) {
        bundleName = bundleName.substring(lastPeriod + 1);
    }
    InputStreamReader reader = null;
    FileInputStream fis = null;
    try {

        File file = new File("C:\\temp\\mybundles", bundleName);

        if (file.isFile()) { // Also checks for existance
            fis = new FileInputStream(file);
            reader = new InputStreamReader(fis, Charset.forName("UTF-8"));
            bundle = new PropertyResourceBundle(reader);
        }
    } finally {
        IOUtils.closeQuietly(reader);
        IOUtils.closeQuietly(fis);
    }
    return bundle;
}

}

Notez également que cela prend en charge UTF-8, qui, à mon avis, n’est pas pris en charge par défaut sinon.

2
John

Je préférerais utiliser la classe resourceboundle pour charger les propriétés - juste pour le faire en une ligne au lieu de 5 lignes de code via stream, Properties class et load ().

FYI ....

    public void init(ServletConfig servletConfig) throws ServletException {
    super.init(servletConfig);

    try {

            /*** Type1 */
        Properties props = new Properties();

        String fileName = getServletContext().getRealPath("WEB-INF/classes/com/test/my.properties");
    //          stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
    //          stream = ClassLoader.getSystemResourceAsStream("WEB-INF/class/com/test/my.properties");  

        InputStream stream = getServletContext().getResourceAsStream("/WEB-INF/classes/com/test/my.properties");

  //        props.load(new FileInputStream(fileName));
        props.load(stream);

        stream.close();
        Iterator keyIterator = props.keySet().iterator();
        while(keyIterator.hasNext()) {
                String key = (String) keyIterator.next();
                String value = (String) props.getProperty(key);
                System.out.println("key:" + key + " value: " + value);
        }

  /*** Type2:  */
  // Just get it done in one line by rb instead of 5 lines to load the properties
  // WEB-INF/classes/com/test/my.properties file            
  //            ResourceBundle rb = ResourceBundle.getBundle("com.test.my", Locale.ENGLISH, getClass().getClassLoader());
        ResourceBundle rb = ResourceBundle.getBundle("com.ibm.multitool.customerlogs.ui.nl.redirect");
        Enumeration<String> keys = rb.getKeys();
        while(keys.hasMoreElements()) {
            String key = keys.nextElement();
            System.out.println(key + " - " + rb.getObject(key));
        }
    } catch (IOException e) {
        e.printStackTrace();
        throw new ServletException("Error loading config.", e);
    } catch (Exception e) {
        e.printStackTrace();
        throw new ServletException("Error loading config.", e);
    }       

}
2
Subba Reddy

Je viens de publier une bibliothèque nommée Rincl qui simplifie le chargement des fichiers de ressources. Les fichiers de ressources nommés d'après les classes sont automatiquement trouvés (à l'aide de la résolution locale normale). Mieux encore, les ressources pour les classes et interfaces parent sont automatiquement trouvées. De plus, il présente de nombreux avantages, tels que la gestion transparente des fichiers de propriétés UTF-8 et des fichiers de propriétés XML.

Vous pouvez également lire un intro ou un lesson complet d'internationalisation à l'aide de Rincl.

1
Garret Wilson

Cela a très bien fonctionné pour moi. Et cela ne recharge pas le paquet à chaque fois. J'ai essayé de prendre quelques statistiques pour charger et recharger le paquet depuis un emplacement de fichier externe.

File file = new File("C:\\temp");
URL[] urls = {file.toURI().toURL()};
ClassLoader loader = new URLClassLoader(urls);
ResourceBundle rb = ResourceBundle.getBundle("myResource", Locale.getDefault(), loader);

où "c:\temp" est le dossier externe (PAS sur le chemin de classe) contenant les fichiers de propriétés, et "myResource" se rapporte à myResource.properties, myResource_fr_FR.properties, etc.

Remarque: Si vous avez le même nom d'ensembles dans votre chemin d'accès aux classes, il sera repris par défaut à l'aide de ce constructeur de URLClassLoader.

Crédit pour http://www.coderanch.com/t/432762/Java/java/absolute-path-bundle-file

Trouvez quelques-unes des statistiques ci-dessous, toujours en ms . Je ne m'inquiète pas du temps de chargement initial, car cela pourrait être quelque chose de mon espace de travail ou du code que j'essaie de comprendre, mais ce reload a pris beaucoup moins de me dire que cela venait de mémoire.

Voici quelques statistiques:

  • Paramètres régionaux initiaux_1 La charge a eu 3486 
  • Recharger Locale_1 a pris 24 
  • Recharger Locale_1 a pris 23 
  • Recharger Locale_1 a pris 22 
  • Recharger Locale_1 a pris 15
  • Le chargement initial de Locale_2 a pris 870 
  • Recharger Locale_2 a pris 22 
  • Recharger Locale_2 a pris 18 
  • Chargement initial de Locale_3 pris 2298 
  • Recharger Locale_3 a pris 8 
  • Recharger Locale_3 a pris 4
1
Prashant Rajput

Cela fonctionne pour moi:

File f = new File("some.properties");
Properties props = new Properties();
FileInputStream fis = null;
try {
    fis = new FileInputStream(f);
    props.load(fis);
} catch (FileNotFoundException e) {
    e.printStackTrace();                    
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (fis != null) {
        try {
            fis.close();
            fis = null;
        } catch (IOException e2) {
            e2.printStackTrace();
        }
    }
}           
0
sius

Je pense que vous voulez que le fichier parent soit sur le classpath, pas le fichier lui-même.

Essayez ceci (peut-être besoin de quelques ajustements):

String path = "c:/temp/mybundle.txt";
Java.io.File fl = new Java.io.File(path);

try {
   resourceURL = fl.getParentFile().toURL();
} catch (MalformedURLException e) {
   e.printStackTrace();                     
}               

URLClassLoader urlLoader = new URLClassLoader(new Java.net.URL[]{resourceURL});
Java.util.ResourceBundle bundle = Java.util.ResourceBundle.getBundle("mybundle.txt", 
                Java.util.Locale.getDefault(), urlLoader );
0
carej
ResourceBundle rb = ResourceBundle.getBundle("service"); //service.properties
System.out.println(rb.getString("server.dns")); //server.dns=http://....
0
JorgeEsteban

Si vous souhaitez charger des fichiers de messages pour différentes langues, utilisez simplement le fichier Shared.loader = De catalina.properties ... Pour plus d'informations, visitez le site http://theswarmintelligence.blogspot.com /2012/08/use-resource-bundle-messages-files-out.html

0
JanaVish
public class One {

    private static One one = null;

    Map<String, String> configParameter = Collections.synchronizedMap(new HashMap<String, String>());

    private One() {
        ResourceBundle rb = ResourceBundle.getBundle("System", Locale.getDefault());

        Enumeration en = rb.getKeys();
        while (en.hasMoreElements()) {
            String key = (String) en.nextElement();
            String value = rb.getString(key);
            configParameter.put(key, value);

        }
    }

    public static One getInstance() {
        if (one == null) {
            one= new One();
        }

        return one;

    }

    public Map<String, String> getParameter() {

        return configParameter;
    }



    public static void main(String[] args) {
        String string = One.getInstance().getParameter().get("subin");
        System.out.println(string);

    }
}
0
SUBZ

Le nom du fichier doit avoir une extension .properties et le répertoire de base doit être classpath. Sinon, il peut également s'agir d'un fichier jar situé dans classpath Par rapport au répertoire de classpath, le groupe de ressources peut être spécifié avec/ou séparateur. "." est préféré.

0