Как загрузить пакет ресурсов из файлового ресурса в Java?
У меня есть файл под названием mybundle.txt
в c:/temp
-
c:/temp/mybundle.txt
Как загрузить этот файл в java.util.ResourceBundle
? Файл является допустимым ресурсным пакетом.
Это не работает:
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 );
Ответы
Ответ 1
До тех пор, пока вы правильно укажете файлы ресурсов вашего ресурса (с расширением .properties), это работает:
File file = new File("C:\\temp");
URL[] urls = {file.toURI().toURL()};
ClassLoader loader = new URLClassLoader(urls);
ResourceBundle rb = ResourceBundle.getBundle("myResource", Locale.getDefault(), loader);
где "c:\temp" - это внешняя папка (не на пути к классу), содержащая файлы свойств, а "myResource" относится к myResource.properties, myResource_fr_FR.properties и т.д.
Кредит http://www.coderanch.com/t/432762/java/java/absolute-path-bundle-file
Ответ 2
Когда вы говорите "действительный пакет ресурсов" - это набор ресурсов ресурса? Если это так, самый простой способ его загрузки:
try (FileInputStream fis = new FileInputStream("c:/temp/mybundle.txt")) {
return new PropertyResourceBundle(fis);
}
Ответ 3
1) Измените расширение на свойства (например, mybundle.properties.)
2) Поместите свой файл в банку и добавьте ее в свой путь к классам.
3) Доступ к свойствам с помощью этого кода:
ResourceBundle rb = ResourceBundle.getBundle("mybundle");
String propertyValue = rb.getString("key");
Ответ 4
Из JavaDocs для ResourceBundle.getBundle(String baseName)
:
baseName
- базовое имя ресурсный пакет, полностью квалифицированный имя класса
То, что это означает на простом английском языке, состоит в том, что пакет ресурсов должен находиться в пути к классам и что baseName
должен быть пакетом, содержащим пучок плюс имя пакета, mybundle
в вашем случае.
Оставьте расширение и любую локаль, которая является частью имени пакета, JVM будет сортировать это для вас в соответствии со стандартом по умолчанию - см. документы на java.util.ResourceBundle для получения дополнительной информации.
Ответ 5
Для приложения JSF
Чтобы получить пакеты ресурсов, поддерживающие файлы из заданного пути к файлу, чтобы использовать их в приложении JSF.
- Установите пакет с URLClassLoader для класса, который расширяет
ResourceBundle для загрузки пакета из пути к файлу.
- Укажите класс в свойстве
basename
тега loadBundle
.
<f:loadBundle basename="Message" var="msg" />
Для базовой реализации расширенного RB см. образец Пример индивидуального набора ресурсов
/* 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) { }
}
.
.
.
}
В противном случае получить пакет из метода getBundle, но locale из другого источника, например Locale.getDefault()
, новый класс (RB) может не потребоваться в этом случае.
Ответ 6
Если, как и я, вы действительно хотели загружать файлы .properties из вашей файловой системы вместо пути к классам, но в остальном сохранить все смайлики, связанные с поиском, затем сделать следующее:
- Создайте подкласс
java.util.ResourceBundle.Control
- Переопределить метод
newBundle()
В этом глупом примере я предполагаю, что у вас есть папка в C:\temp
, которая содержит плоский список файлов .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;
}
}
Обратите внимание, что это поддерживает UTF-8, который, как мне кажется, не поддерживается по умолчанию.
Ответ 7
Я бы предпочел использовать класс resourceboundle для загрузки свойств - просто для его выполнения в одной строке вместо 5 строк кода через поток, класса Properties и 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);
}
}
Ответ 8
Я только что выпустил библиотеку с именем Rincl, которая вывела всю тяжелую работу из загрузки файла ресурсов. Файлы ресурсов, названные в честь классов, найдены автоматически (с использованием обычного локального разрешения). Еще лучше, ресурсы для родительских классов и интерфейсов обнаруживаются автоматически. Кроме того, он имеет всевозможные преимущества, такие как обработка файлов свойств UTF-8 и файлов свойств XML прозрачно.
Вы также можете прочитать intro или полный урок для интернационализация с использованием Rincl.
Ответ 9
Я думаю, что вы хотите, чтобы файл родительский находился в пути к классам, а не сам фактический файл.
Попробуйте (возможно, потребуется некоторое изменение):
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 );
Ответ 10
В имени файла должно быть расширение .properties, а базовая директория должна быть в pathpath. В противном случае он также может быть в банке, которая находится в classpath
По отношению к каталогу в пути к классам ресурсный пакет может быть указан с помощью/или. разделитель. "" является предпочтительным.
Ответ 11
Если вы хотите загрузить файлы сообщений для разных языков, просто используйте
shared.loader =
каталитических свойств...
для получения дополнительной информации посетите http://theswarmintelligence.blogspot.com/2012/08/use-resource-bundle-messages-files-out.html
Ответ 12
Это работает для меня:
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();
}
}
}
Ответ 13
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);
}
}
Ответ 14
ResourceBundle rb = ResourceBundle.getBundle("service"); //service.properties
System.out.println(rb.getString("server.dns")); //server.dns=http://....