ResourceBundle rb = ResourceBundle.getBundle("experiment.MyResource",Locale.getDefault());
System.out.println(rb.getString("TestKey"));
rb = ResourceBundle.getBundle("experiment.MyResource", new Locale("ru","RU"));
System.out.println(rb.getString("TestKey"));
}
}
Пример 14.29.
Результатом будет:
English Variant Русский Вариант
Кроме того, следует обратить внимание, что ResourceBundle может хранить не только строковые значения. В нем можно хранить также двоичные данные, или просто методы, реализующие нужную функциональность, в зависимости от локали.
public interface Behavior {
public String getBehavior();
public String getCapital();
}
public class EnglishBehavior implements Behavior {
public EnglishBehavior() {
}
public String getBehavior() {
return "English behavior";
}
public String getCapital() {
return "London";
}
}
public class RussianBehavior implements Behavior {
public RussianBehavior() {
}
public String getBehavior() {
return "Русский вариант поведения";
}
public String getCapital() {
return "Москва";
}
}
public class MyResourceBundle_ru_RU extends ResourceBundle {
Hashtable bundle = null;
public MyResourceBundle_ru_RU() {
bundle = new Hashtable();
bundle.put("Bundle description","Набор ресурсов для русской локали");
bundle.put("Behavior",new RussianBehavior());
}
public Enumeration getKeys() {
return bundle.keys();
}
protected Object handleGetObject(String key) throws
java.util.MissingResourceException {
return bundle.get(key);
}
}
public class MyResourceBundle_en_EN extends ResourceBundle {
Hashtable bundle = null;
public MyResourceBundle_en_EN() {
bundle = new Hashtable();
bundle.put("Bundle description","English resource set");
bundle.put("Behavior",new EnglishBehavior());
}
public Enumeration getKeys() {
return bundle.keys();
}
protected Object handleGetObject(String key) throws
java.util.MissingResourceException {
return bundle.get(key);
}
}
public class MyResourceBundle extends ResourceBundle {
Hashtable bundle = null;
public MyResourceBundle() {
bundle = new Hashtable();
bundle.put("Bundle description","Default resource bundle");
bundle.put("Behavior",new EnglishBehavior());
}
public Enumeration getKeys() {
return bundle.keys();
}
protected Object handleGetObject(String key) throws
java.util.MissingResourceException {
return bundle.get(key);
}
}
public class Using {
public Using() {
}
public static void main(String[] args) {
Using u = new Using();
ResourceBundle rb = ResourceBundle.getBundle("lecture.MyResourceBundle", Locale.getDefault());
System.out.println((String)rb.getObject("Bundle description"));
Behavior be = (Behavior)rb.getObject("Behavior");
System.out.println(be.getBehavior());
System.out.println(be.getCapital());
rb = ResourceBundle.getBundle("lecture.MyResourceBundle", new Locale("en","EN"));
System.out.println((String)rb.getObject("Bundle description"));
Behavior be = (Behavior)rb.getObject("Behavior");
System.out.println(be.getBehavior());
System.out.println(be.getCapital());
}
Пример 14.30.
Результатом будет:
Русский набор ресурсов
Русский вариант поведения
Москва
English resource bundle
English behavior
London
Пример 14.31.
Классы ListResourceBundle и PropertiesResourceBundle
У класса ResourceBundle определено два прямых потомка ListResourceBundle и PropertiesResourceBundle. PropertiesResourceBundle хранит набор ресурсов в файле, который представляет собой набор строк.
Алгоритм конструирования объекта, содержащего набор ресурсов, был описан в предыдущем параграфе. Во всех случаях, когда в качестве последнего элемента используется .properties, например, baseclass + " " + language1 + " " + country1 + ".properties", речь идет о создании ResourceBundle из файла с наименованием baseclass + " " + language1 + " " + country1 и расширением properties. Обычно класс ResourceBundle помещают в пакет resources, а файл свойств - в каталог resources. Тогда для того, чтобы инстанциировать нужный класс, необходимо указать полный путь к этому классу (файлу):
getBundle("resources.MyResource",
Locale.getDefault());
ListResourceBundle хранит набор ресурсов в виде коллекции и является абстрактным классом. Классы, которые наследуют ListResourceBundle, должны обеспечить:
переопределение метода Object[][] getContents(), который возвращает массив ресурсов;
собственно двумерный массив, содержащий ресурсы.
Рассмотрим пример:
public class MyResource extends ListResourceBundle {
Vector v = new Vector();
Object[][] resources = {
{
"StringKey","String"
}
, {
"DoubleKey",new Double(0.0)
}
, {
"VectorKey",v
}
,
};
public MyResource() {
super();
v.add("Element 1");
v.add("Element 2");
v.add("Element 3");
}
protected Object[][] getContents() {
return resources;
}
}
public class Test {
public Test() {
}
public static void main(String[] args) {
Test test = new Test();
ResourceBundle rb = ResourceBundle.getBundle("experiment.MyResource",Locale.getDefault());
Vector v = (Vector)rb.getObject("VectorKey");
Iterator it = v.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
Пример 14.32.
Результатом будет:
Element 1
Element 2
Element 3