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 );
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
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);
}
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");
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 .
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.
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.
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:
Java.util.ResourceBundle.Control
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.
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);
}
}
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.
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:
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();
}
}
}
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 );
ResourceBundle rb = ResourceBundle.getBundle("service"); //service.properties
System.out.println(rb.getString("server.dns")); //server.dns=http://....
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
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);
}
}
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é.