Класс ResourceBundle
- Прямые известные подклассы:
-
ListResourceBundle,PropertyResourceBundle
public abstract class ResourceBundle extends Object
String, программа может загрузить его из ресурсного пакета, соответствующего текущей локали пользователя. Таким образом, вы можете писать код программы, в значительной степени независимый от локали пользователя, изолируя большую часть, если не все, локально-зависимой информации в ресурсных пакетах. Это позволяет писать программы, которые могут:
- быть легко локализованы или переведены на разные языки
- обрабатывать несколько локалей одновременно
- быть легко изменены позднее для поддержки ещё большего количества локалей
Ресурсные пакеты принадлежат семьям, члены которых имеют общее базовое имя, но имена также содержат дополнительные компоненты, определяющие их локали. Например, базовым именем семейства ресурсных пакетов может быть "MyResources". Семья должна иметь пакет ресурсов по умолчанию, который просто имеет то же имя, что и его семья - "MyResources" - и будет использоваться в качестве пакета последнего средства, если определённая локаль не поддерживается. Затем семья может предоставить столько локально-специфичных членов, сколько необходимо, например, немецкий под названием "MyResources_de".
Каждый ресурсный пакет в семье содержит одни и те же элементы, но элементы были переведены для локали, представленной этим ресурсным пакетом. Например, как "MyResources", так и "MyResources_de" могут иметь String, используемый на кнопке для отмены операций. В "MyResources" String может содержать "Cancel", а в "MyResources_de" - "Abbrechen".
Если есть разные ресурсы для разных стран, вы можете создавать специализации: например, "MyResources_de_CH" содержит объекты для немецкого языка (de) в Швейцарии (CH). Если вы хотите изменить только некоторые ресурсы в специализации, вы можете это сделать.
Когда вашей программе нужен локально-специфичный объект, она загружает класс ResourceBundle с помощью метода getBundle:
ResourceBundle myResources =
ResourceBundle.getBundle("MyResources", currentLocale);
Ресурсные пакеты содержат пары "ключ-значение". Ключи уникально идентифицируют локально-специфичный объект в пакете. Вот пример ListResourceBundle, содержащего две пары "ключ-значение":
public class MyResources extends ListResourceBundle {
protected Object[][] getContents() {
return new Object[][] {
// LOCALIZE THE SECOND STRING OF EACH ARRAY (e.g., "OK")
{"OkKey", "OK"},
{"CancelKey", "Cancel"},
// END OF MATERIAL TO LOCALIZE
};
}
}
Ключи всегда являются String. В этом примере ключи - "OkKey" и "CancelKey". В приведённом примере значения также являются String - "OK" и "Cancel" - но они не обязаны быть таковыми. Значения могут быть любого типа. Вы получаете объект из ресурсного пакета, используя соответствующий метод-получатель. Поскольку "OkKey" и "CancelKey" оба являются строками, вы бы использовали getString для их получения:
button1 = new Button(myResources.getString("OkKey"));
button2 = new Button(myResources.getString("CancelKey"));
Методы-получатели все требуют ключ в качестве аргумента и возвращают объект, если он найден. Если объект не найден, метод-получатель выбрасывает MissingResourceException. Помимо getString, ResourceBundle также предоставляет метод для получения массивов строк, getStringArray, а также универсальный метод getObject для любого другого типа объекта. При использовании getObject, вам придётся привести результат к нужному типу. Например:
int[] myIntegers = (int[]) myResources.getObject("intList");
Java-платформа предоставляет два подкласса ResourceBundle, ListResourceBundle и PropertyResourceBundle, которые предоставляют довольно простой способ создания ресурсов. Как вы кратко видели в предыдущем примере, ListResourceBundle управляет своими ресурсами как списком пар "ключ-значение". PropertyResourceBundle использует файл свойств для управления своими ресурсами.
Если ListResourceBundle или PropertyResourceBundle не подходят для ваших потребностей, вы можете написать свой собственный подкласс ResourceBundle. Ваши подклассы должны переопределить два метода: handleGetObject и getKeys().
Реализация подкласса ResourceBundle должна быть потокобезопасной, если она одновременно используется несколькими потоками. Реализации по умолчанию для неабстрактных методов в этом классе, и методы в прямых известных конкретных подклассах ListResourceBundle и PropertyResourceBundle являются потокобезопасными.
Ресурсные пакеты и именованные модули
Ресурсные пакеты могут быть развернуты в модулях следующим образом:Ресурсные пакеты вместе с приложением
Ресурсные пакеты могут быть развернуты вместе с приложением в одном модуле. В этом случае ресурсные пакеты загружаются кодом в модуле путём вызова методаgetBundle(String) или getBundle(String, Locale). Ресурсные пакеты в качестве поставщиков услуг
Ресурсные пакеты могут быть развернуты в одном или нескольких модулях поставщиков услуг, и они могут быть найдены с помощьюServiceLoader. Должен быть определён интерфейс или класс службы. Модуль-клиент объявляет, что он использует услугу, а модули поставщиков услуг объявляют, что они предоставляют реализации услуги. Обратитесь к ResourceBundleProvider для разработки служб ресурсных пакетов и развертывания поставщиков ресурсных пакетов. Модуль, получающий ресурсный пакет, сам может быть поставщиком ресурсного пакета; в этом случае этот модуль находит ресурсный пакет только с помощью механизма поставщика услуг. Поставщик ресурсного пакета может предоставлять ресурсные пакеты в любом формате, таком как XML, что устраняет необходимость в ResourceBundle.Control.
Ресурсные пакеты в других модулях и на пути класса
Ресурсные пакеты в именованном модуле могут быть изолированы, так что они не могут быть найдены кодом в других модулях. Ресурсные пакеты в безымянных модулях и на пути класса открыты для доступа любому модулю. Ресурсный пакет следует правилам изоляции ресурсов, как указано вModule.getResourceAsStream(String). Методы-фабрики getBundle без параметра Control ищут и загружают ресурсные пакеты у поставщиков услуг. Поиск может продолжиться, как если бы вы вызывали Module.getResourceAsStream(String) для поиска именованного ресурса в заданном модуле и вызывали ClassLoader.getResourceAsStream(String); см. описание метода getBundle для подробностей. Ищутся только неизолированные ресурсные пакеты в формате "java.class" или "java.properties".
Если вызывающий модуль является поставщиком ресурсного пакета, он не обращается к поиску через загрузчик классов.
Ресурсные пакеты в автоматических модулях
Распространённый формат ресурсных пакетов - в файле свойств .properties. Обычно ресурсные пакеты.properties упаковываются в JAR-файл. JAR-файл только с ресурсными пакетами можно легко развернуть как автоматический модуль. Например, если JAR-файл содержит запись "p/q/Foo_ja.properties" и нет записи .class, при разрешении и определении в качестве автоматического модуля пакет для этого модуля не выводится. Это позволяет ресурсным пакетам в формате .properties, упакованным в один или несколько JAR-файлов, которые могут содержать записи в одном каталоге и могут быть успешно разрешены как автоматические модули. ResourceBundle.Control
КлассResourceBundle.Control предоставляет информацию, необходимую для выполнения процесса загрузки пакета методами-фабриками getBundle , которые принимают экземпляр ResourceBundle.Control. Вы можете реализовать свой собственный подкласс, чтобы включить нестандартные форматы ресурсных пакетов, изменить стратегию поиска или определить параметры кэширования. Обратитесь к описаниям класса и метода-фабрики getBundle для подробностей. ResourceBundle.Control предназначен для приложения, развернутого в безымянном модуле, например, для поддержки ресурсных пакетов в нестандартных форматах или для упаковки локализованных ресурсов в нетрадиционной конвенции. ResourceBundleProvider является заменой для ResourceBundle.Control при переходе на модули. UnsupportedOperationException будет брошен, когда вызывается метод-фабрика, который принимает параметр ResourceBundle.Control.
Для методов-фабрик getBundle , которые не принимают экземпляр ResourceBundle.Control, их поведение по умолчанию при загрузке ресурсных пакетов может быть изменено с помощью реализаций пользовательских ResourceBundleControlProvider. Если какой-либо из поставщиков предоставляет ResourceBundle.Control для данного базового имени, этот ResourceBundle.Control будет использоваться вместо значения по умолчанию ResourceBundle.Control. Если существует более одного поставщика услуг для поддержки одного базового имени, будет использован первый поставщик, возвращённый ServiceLoader. Реализация пользовательского ResourceBundle.Control игнорируется именованными модулями.
Управление кэшем
Экземпляры ресурсных пакетов, созданные методами-фабрикамиgetBundle, кэшируются по умолчанию, и методы-фабрики возвращают один и тот же экземпляр ресурсного пакета несколько раз, если он был кэширован. Клиенты getBundle могут очистить кэш, управлять временем жизни кэшированных экземпляров ресурсных пакетов с помощью значений времени жизни или указать, не кэшировать экземпляры ресурсных пакетов. Обратитесь к описаниям метода-фабрики getBundle, clearCache, ResourceBundle.Control.getTimeToLive и ResourceBundle.Control.needsReload для подробностей. Пример
ResourceBundle, MyResources, который управляет двумя ресурсами (для большего числа ресурсов, вероятно, следует использовать Map). Обратите внимание, что вам не нужно указывать значение, если "родительский уровень" ResourceBundle обрабатывает тот же ключ с тем же значением (как в случае с okKey ниже).
// default (English language, United States)
public class MyResources extends ResourceBundle {
public Object handleGetObject(String key) {
if (key.equals("okKey")) return "Ok";
if (key.equals("cancelKey")) return "Cancel";
return null;
}
public Enumeration<String> getKeys() {
return Collections.enumeration(keySet());
}
// Overrides handleKeySet() so that the getKeys() implementation
// can rely on the keySet() value.
protected Set<String> handleKeySet() {
return new HashSet<String>(Arrays.asList("okKey", "cancelKey"));
}
}
// German language
public class MyResources_de extends MyResources {
public Object handleGetObject(String key) {
// don't need okKey, since parent level handles it.
if (key.equals("cancelKey")) return "Abbrechen";
return null;
}
protected Set<String> handleKeySet() {
return new HashSet<String>(Arrays.asList("cancelKey"));
}
}
Вы не ограничены использованием только одного семейства ResourceBundle. Например, вы можете иметь набор пакетов для сообщений об исключениях, ExceptionResources (ExceptionResources_fr, ExceptionResources_de, ...), и один для виджетов, WidgetResource (WidgetResources_fr, WidgetResources_de, ...); разбивая ресурсы как вам угодно.- С момента:
- 1.1
- См. также:
Краткое описание вложенных классов
| Модификатор и тип | Класс | Описание |
|---|---|---|
static class |
ResourceBundle.Control |
ResourceBundle.Control определяет набор методов обратного вызова, которые вызываются фабричными методами ResourceBundle.getBundle во время процесса загрузки пакета. |
Краткое описание полей
| Модификатор и тип | Поле | Описание |
|---|---|---|
protected ResourceBundle |
parent |
Родительский пакет этого пакета. |
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
ResourceBundle() |
Единственный конструктор. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
static final void |
clearCache() |
Удаляет все пакеты ресурсов из кэша, загруженные модулем вызывающего. |
static final void |
clearCache |
Удаляет все пакеты ресурсов из кэша, загруженные данным загрузчиком классов. |
boolean |
containsKey |
Определяет, содержится ли данный key в этом ResourceBundle или его родительских пакетах. |
String |
getBaseBundleName() |
Возвращает базовое имя этого пакета, если известно, или null в противном случае. |
static final ResourceBundle |
getBundle |
Получает пакет ресурсов с указанным базовым именем, стандартным языком и модулем вызывающего. |
static ResourceBundle |
getBundle |
Получает пакет ресурсов с указанным базовым именем и стандартным языком от имени указанного модуля. |
static final ResourceBundle |
getBundle |
Получает пакет ресурсов с указанным базовым именем и языком, и модулем вызывающего. |
static ResourceBundle |
getBundle |
Получает пакет ресурсов с указанным базовым именем, языком и загрузчиком классов. |
static ResourceBundle |
getBundle |
Возвращает пакет ресурсов с указанным базовым именем, целевым языком, загрузчиком классов и контроллером. |
static ResourceBundle |
getBundle |
Получает пакет ресурсов с указанным базовым именем и языком от имени указанного модуля. |
static final ResourceBundle |
getBundle |
Возвращает пакет ресурсов с указанным базовым именем, целевым языком и контроллером, и загрузчиком классов вызывающего. |
static final ResourceBundle |
getBundle |
Возвращает пакет ресурсов с указанным базовым именем, стандартным языком и указанным контроллером. |
abstract Enumeration<String> |
getKeys() |
Возвращает перечисление ключей. |
Locale |
getLocale() |
Возвращает язык этого пакета ресурсов. |
final Object |
getObject |
Получает объект для данного ключа из этого пакета ресурсов или одного из его родителей. |
final String |
getString |
Получает строку для данного ключа из этого пакета ресурсов или одного из его родителей. |
final String[] |
getStringArray |
Получает массив строк для данного ключа из этого пакета ресурсов или одного из его родителей. |
protected abstract Object |
handleGetObject |
Получает объект для данного ключа из этого пакета ресурсов. |
protected Set<String> |
handleKeySet() |
Возвращает Set ключей, содержащихся только в этом ResourceBundle. |
Set<String> |
keySet() |
Возвращает Set всех ключей, содержащихся в этом ResourceBundle и его родительских пакетах. |
protected void |
setParent |
Устанавливает родительский пакет этого пакета. |
Подробное описание полей
parent
protected ResourceBundle parent
getObject, когда данный пул не содержит определённый ресурс.Подробное описание конструкторов
ResourceBundle
public ResourceBundle()
Подробное описание методов
getBaseBundleName
public String getBaseBundleName()
null если неизвестно. Если не null, то это значение параметра baseName, который был передан методу ResourceBundle.getBundle(...) при загрузке пула ресурсов.- Возвращает:
- Базовое имя пула ресурсов, как предоставленное и ожидаемое методами
ResourceBundle.getBundle(...). - С:
- 1.8
- См. также:
getString
public final String getString(String key)
(String) getObject(key).
- Параметры:
-
key- ключ для желаемой строки - Возвращает:
- строку для данного ключа
- Исключения:
-
NullPointerException- еслиkeyравноnull -
MissingResourceException- если объект для данного ключа не найден -
ClassCastException- если объект, найденный для данного ключа, не является строкой
getStringArray
public final String[] getStringArray(String key)
(String[]) getObject(key).
- Параметры:
-
key- ключ для желаемого массива строк - Возвращает:
- массив строк для данного ключа
- Исключения:
-
NullPointerException- еслиkeyравноnull -
MissingResourceException- если объект для данного ключа не найден -
ClassCastException- если объект, найденный для данного ключа, не является массивом строк
getObject
public final Object getObject(String key)
handleGetObject. Если это не удаётся, а родительский пул ресурсов не равен null, он вызывает метод getObject родительского пула. Если всё ещё не удаётся, выбрасывается MissingResourceException.- Параметры:
-
key- ключ для желаемого объекта - Возвращает:
- объект для данного ключа
- Исключения:
-
NullPointerException- еслиkeyравноnull -
MissingResourceException- если объект для данного ключа не найден
getLocale
public Locale getLocale()
- Возвращает:
- локаль этого пула ресурсов
setParent
protected void setParent(ResourceBundle parent)
getObject, когда данный пул не содержит определённый ресурс.- Параметры:
-
parent- родительский пул этого пула.
getBundle
public static final ResourceBundle getBundle(String baseName)
getBundle(baseName, Locale.getDefault(), callerModule),
- Параметры:
-
baseName- базовое имя пула ресурсов, полное имя класса - Возвращает:
- пул ресурсов для заданного базового имени и локали по умолчанию
- Исключения:
-
NullPointerException- еслиbaseNameравноnull -
MissingResourceException- если пул ресурсов для заданного базового имени не найден - См. также:
getBundle
public static final ResourceBundle getBundle(String baseName, ResourceBundle.Control control)
getBundle(baseName, Locale.getDefault(),
this.getClass().getClassLoader(), control),
, за исключением того, что getClassLoader() выполняется с правами безопасности ResourceBundle. См. getBundle для полного описания процесса загрузки пула ресурсов с ResourceBundle.Control.- Параметры:
-
baseName- базовое имя пула ресурсов, полное имя класса -
control- контроллер, предоставляющий информацию для процесса загрузки пула ресурсов - Возвращает:
- пул ресурсов для заданного базового имени и локали по умолчанию
- Исключения:
-
NullPointerException- еслиbaseNameилиcontrolравноnull -
MissingResourceException- если пул ресурсов для заданного базового имени не найден -
IllegalArgumentException- если заданныйcontrolне работает должным образом (например,control.getCandidateLocalesвозвращает null). Обратите внимание, что валидацияcontrolвыполняется при необходимости. -
UnsupportedOperationException- если этот метод вызывается в именованном модуле - С:
- 1.6
getBundle
public static final ResourceBundle getBundle(String baseName, Locale locale)
getBundle(baseName, locale, callerModule),
- Параметры:
-
baseName- базовое имя пула ресурсов, полное имя класса -
locale- локаль, для которой требуется пул ресурсов - Возвращает:
- пул ресурсов для заданного базового имени и локали
- Исключения:
-
NullPointerException- еслиbaseNameилиlocaleравноnull -
MissingResourceException- если пул ресурсов для заданного базового имени не найден - См. также:
getBundle
public static ResourceBundle getBundle(String baseName, Module module)
getBundle(baseName, Locale.getDefault(), module)
- Параметры:
-
baseName- базовое имя пула ресурсов, полное имя класса -
module- модуль, для которого ищется пул ресурсов - Возвращает:
- пул ресурсов для заданного базового имени и локали по умолчанию
- Исключения:
-
NullPointerException- еслиbaseNameилиmoduleравноnull -
SecurityException- если менеджер безопасности существует, и вызывающая сторона не является указанным модулем и не имеетRuntimePermission("getClassLoader") -
MissingResourceException- если пул ресурсов для заданного базового имени не найден в указанном модуле - С:
- 9
- См. также:
ПолучитьСвязку
public static ResourceBundle getBundle(String baseName, Locale targetLocale, Module module)
Связки ресурсов в именованных модулях могут быть инкапсулированы. Когда связка ресурсов загружается из поставщика сервисов, вызывающему модулю необходимо иметь соответствующую строку uses в его описании модуля, чтобы объявить, что модуль использует ResourceBundleProvider для указанной связки ресурсов. В противном случае, он загрузит связки ресурсов, которые находятся локально в данном модуле, как если бы вызывал Module.getResourceAsStream(String), или которые видны загрузчику классов данного модуля, как если бы вызывал ClassLoader.getResourceAsStream(String). Когда связка ресурсов загружается из указанного модуля, она подчиняется правилам инкапсуляции, указанным в Module.getResourceAsStream.
Если указанный module является безымянным модулем, то этот метод эквивалентен вызову getBundle(baseName, targetLocale, module.getClassLoader() для загрузки связок ресурсов, которые видны загрузчику классов данного безымянного модуля. Пользовательские реализации ResourceBundleControlProvider, если они присутствуют, будут вызваны только если указанный модуль является безымянным.
- Параметры:
-
baseName- имя базы связки ресурсов, полностью квалифицированное имя класса -
targetLocale- локаль, для которой требуется связка ресурсов -
module- модуль, в котором ищется связка ресурсов - Возвращает:
- связка ресурсов для данного имени базы и локали в модуле
- Исключения:
-
NullPointerException- еслиbaseName,targetLocale, илиmodulenull -
SecurityException- если существует менеджер безопасности и вызывающий элемент не является указанным модулем и не имеетRuntimePermission("getClassLoader") -
MissingResourceException- если в указанномmoduleне найдена ни одна связка ресурсов для заданного имени базы и локали - С:
- 9
- См. также:
ПолучитьСвязку
public static final ResourceBundle getBundle(String baseName, Locale targetLocale, ResourceBundle.Control control)
getBundle(baseName, targetLocale, this.getClass().getClassLoader(),
control),
за исключением того, что getClassLoader() выполняется с привилегиями безопасности ResourceBundle. См. getBundle для полного описания процесса загрузки связки ресурсов с ResourceBundle.Control.- Параметры:
-
baseName- имя базы связки ресурсов, полностью квалифицированное имя класса -
targetLocale- локаль, для которой требуется связка ресурсов -
control- контроллер, предоставляющий информацию для процесса загрузки связки ресурсов - Возвращает:
- связка ресурсов для данного имени базы и
Localeвlocales - Исключения:
-
NullPointerException- еслиbaseName,localesилиcontrolnull -
MissingResourceException- если ни одна связка ресурсов для указанного имени базы вlocalesне найдена. -
IllegalArgumentException- если данныйcontrolработает неправильно (например,control.getCandidateLocalesвозвращает null). Обратите внимание, что валидацияcontrolвыполняется по мере необходимости. -
UnsupportedOperationException- если этот метод вызывается в именованном модуле - С:
- 1.6
getBundle
public static ResourceBundle getBundle(String baseName, Locale locale, ClassLoader loader)
Когда этот метод вызывается из именованного модуля и предоставленный загрузчик является загрузчиком классов вызывающего модуля, это эквивалентно вызову:
в противном случае это эквивалентно вызову:getBundle(baseName, targetLocale, callerModule)
гдеgetBundle(baseName, targetLocale, loader, control)
control — это экземпляр по умолчанию ResourceBundle.Control, если не предоставлен экземпляр Control с помощью ResourceBundleControlProvider SPI. Обратитесь к описанию изменения поведения по умолчанию. Ниже описано поведение по умолчанию. Стратегия поиска и загрузки наборов ресурсов
getBundle использует базовое имя, указанную локаль и локаль по умолчанию (полученную из Locale.getDefault) для создания последовательности имен кандидатов для наборов ресурсов. Если язык, сценарий, страна и вариант указанной локали являются пустыми строками, то базовое имя является единственным именем кандидата для набора ресурсов. В противном случае список кандидатов для локали генерируется из значений атрибутов указанной локали (язык, сценарий, страна и вариант) и добавляется к базовому имени. Как правило, это будет выглядеть следующим образом:
baseName + "_" + language + "_" + script + "_" + country + "_" + variant
baseName + "_" + language + "_" + script + "_" + country
baseName + "_" + language + "_" + script
baseName + "_" + language + "_" + country + "_" + variant
baseName + "_" + language + "_" + country
baseName + "_" + language
Имена кандидатов, где конечный компонент является пустой строкой, пропускаются вместе с символом подчёркивания. Например, если страна является пустой строкой, второе и пятое имена кандидатов выше будут пропущены. Также, если сценарий является пустой строкой, имена кандидатов, содержащие сценарий, будут пропущены. Например, локаль с языком "de" и вариантом "JAVA" сгенерирует имена кандидатов с базовым именем "MyResource" ниже.
MyResource_de__JAVA
MyResource_de
В случае, если вариант содержит один или несколько символов подчёркивания ('_'), последовательность имен наборов ресурсов, сгенерированных путём обрезания последнего символа подчёркивания и части, следующей за ним, вставляется после имени кандидата с исходным вариантом. Например, для локали с языком "en", сценарием "Latn", страной "US" и вариантом "WINDOWS_VISTA" и базовым именем набора ресурсов "MyResource", генерируется список имен кандидатов ниже: MyResource_en_Latn_US_WINDOWS_VISTA MyResource_en_Latn_US_WINDOWS MyResource_en_Latn_US MyResource_en_Latn MyResource_en_US_WINDOWS_VISTA MyResource_en_US_WINDOWS MyResource_en_US MyResource_en
Примечание: Для некоторыхLocaleсписок имен кандидатов содержит дополнительные имена или порядок имен кандидатов немного изменён. Подробности см. в описании реализации по умолчанию методаgetCandidateLocales.
getBundle затем перебирает имена кандидатов, чтобы найти первое, для которого можно создать фактический набор ресурсов. Он использует метод getFormats по умолчанию для управления, который генерирует два имени набора ресурсов для каждого сгенерированного имени, первое — имя класса, а второе — имя файла свойств. Для каждого имени кандидата он пытается создать набор ресурсов:
- Сначала он пытается загрузить класс, используя сгенерированное имя класса. Если такой класс можно найти и загрузить с помощью указанного загрузчика классов, он совместим по присваиванию с ResourceBundle, доступен из ResourceBundle и может быть создан,
getBundleсоздаёт новый экземпляр этого класса и использует его в качестве результата набора ресурсов. - В противном случае,
getBundleпытается найти файл свойств ресурсов, используя сгенерированное имя файла свойств. Он генерирует имя пути из имени кандидата, заменяя все символы "." на "/" и добавляя строку ".properties". Он пытается найти "ресурс" с этим именем, используяClassLoader.getResource. (Обратите внимание, что "ресурс" в смыслеgetResourceне имеет ничего общего с содержимым набора ресурсов, он просто содержит данные, например, файл.) Если он находит "ресурс", он пытается создать новый экземплярPropertyResourceBundleиз его содержимого. При успехе этот экземпляр становится результатом набора ресурсов.
Это продолжается до тех пор, пока не будет создан набор ресурсов-результат или список имен кандидатов не будет исчерпан. Если соответствующий набор ресурсов не найден, вызывается метод getFallbackLocale управления по умолчанию, который возвращает текущую локаль по умолчанию. Новая последовательность имён кандидатов для локали генерируется с помощью этой локали и снова ищется, как описано выше.
Если набор ресурсов-результат всё ещё не найден, выполняется поиск по одному базовому имени. Если это тоже не удаётся, выбрасывается MissingResourceException.
После того, как был найден набор ресурсов-результат, создаётся его цепочка родительских наборов ресурсов. Если у набора результатов уже есть родитель (возможно, потому что он был возвращён из кэша), цепочка завершена.
В противном случае, getBundle проверяет оставшуюся часть списка кандидатов для локали, которая использовалась во время обработки, сгенерировавшей набор ресурсов-результат. (Как и раньше, имена кандидатов, где конечный компонент является пустой строкой, пропускаются.) Когда доходит до конца списка кандидатов, он пытается получить простое имя набора ресурсов. Для каждого из имен кандидатов он пытается создать набор ресурсов (сначала ищет класс, а затем файл свойств, как описано выше).
Всякий раз, когда это удаётся, он вызывает метод setParent ранее созданного набора ресурсов с новым набором ресурсов. Это продолжается до тех пор, пока список имён не будет исчерпан или текущий набор ресурсов уже не имеет родительского набора ресурсов, отличного от null.
После завершения цепочки родительских наборов ресурсов набор ресурсов возвращается.
Примечание: getBundle кеширует созданные наборы ресурсов и может возвращать один и тот же экземпляр набора ресурсов несколько раз.
Примечание: Аргумент baseName должен быть полным именем класса. Однако для совместимости со старыми версиями Java SE Runtime Environments это не проверяется, поэтому можно получить доступ к PropertyResourceBundle, указав имя пути (используя "/") вместо полного имени класса (используя ".").
Предоставляются следующие классы и файлы свойств:
- MyResources.class
- MyResources.properties
- MyResources_fr.properties
- MyResources_fr_CH.class
- MyResources_fr_CH.properties
- MyResources_en.properties
- MyResources_es_ES.class
ResourceBundle для файлов ".class", синтаксически корректные файлы ".properties"). Локаль по умолчанию — Locale("en", "GB"). Вызов getBundle с приведенными ниже аргументами локали приведет к созданию наборов ресурсов следующим образом:
| Локаль | Набор ресурсов |
|---|---|
| Locale("fr", "CH") | MyResources_fr_CH.class, родитель MyResources_fr.properties, родитель MyResources.class |
| Locale("fr", "FR") | MyResources_fr.properties, родитель MyResources.class |
| Locale("de", "DE") | MyResources_en.properties, родитель MyResources.class |
| Locale("en", "US") | MyResources_en.properties, родитель MyResources.class |
| Locale("es", "ES") | MyResources_es_ES.class, родитель MyResources.class |
Файл MyResources_fr_CH.properties никогда не используется, потому что он скрыт MyResources_fr_CH.class. Аналогично, MyResources.properties также скрыт MyResources.class.
- API Note:
- Если вызывающий модуль — именованный модуль, а заданный
loader— загрузчик классов вызывающего модуля, этот метод эквивалентенgetBundle(baseName, locale); в противном случае он может не найти наборы ресурсов из именованных модулей. ИспользуйтеgetBundle(String, Locale, Module)для загрузки наборов ресурсов от имени конкретного модуля. - Parameters:
-
baseName- базовое имя набора ресурсов, полное имя класса -
locale- локаль, для которой требуется набор ресурсов -
loader- загрузчик классов для загрузки набора ресурсов - Returns:
- набор ресурсов для заданного базового имени и локали
- Throws:
-
NullPointerException- еслиbaseName,locale, илиloadernull -
MissingResourceException- если набор ресурсов для указанного базового имени не найден - Since:
- 1.2
- See Also:
getBundle
public static ResourceBundle getBundle(String baseName, Locale targetLocale, ClassLoader loader, ResourceBundle.Control control)
getBundle без аргумента control, заданный control определяет, как найти и создать ресурсные пакеты. Концептуально, процесс загрузки пакета с данным control выполняется в следующих шагах. - Этот метод-фабрика ищет ресурсный пакет в кэше для указанного
baseName,targetLocaleиloader. Если запрашиваемый экземпляр ресурсного пакета найден в кэше и периоды времени жизни экземпляра и всех его родительских экземпляров не истекли, экземпляр возвращается вызывающей стороне. В противном случае этот метод-фабрика продолжает процесс загрузки, описанный ниже. - Вызывается метод
control.getFormats, чтобы получить форматы ресурсного пакета для создания имен пакета или ресурса. Строки"java.class"и"java.properties"обозначают ресурсные пакеты на основе классов и на основе свойств соответственно. Другие строки, начинающиеся с"java.", зарезервированы для будущих расширений и не должны использоваться для форматов, определенных приложением. Другие строки обозначают форматы, определенные приложением. - Метод
control.getCandidateLocalesвызывается с целевым языком, чтобы получить список кандидатныхLocale, для которых ищутся ресурсные пакеты. - Метод
control.newBundleвызывается для создания экземпляраResourceBundleдля имени базового пакета, кандидатного языка и формата. (Обратитесь к примечанию о поиске в кэше ниже.) Этот шаг повторяется для всех комбинаций кандидатов языков и форматов, пока методnewBundleне вернет экземплярResourceBundleили пока все комбинации не будут исчерпаны. Например, если кандидатами являютсяLocale("de", "DE"),Locale("de")иLocale(""), а форматами"java.class"и"java.properties", то следующая последовательность комбинаций язык-формат будет использоваться для вызоваcontrol.newBundle.Индекс Localeformat1 Locale("de", "DE")java.class2 Locale("de", "DE")java.properties3 Locale("de")java.class4 Locale("de")java.properties5 Locale("")java.class6 Locale("")java.properties - Если на предыдущем шаге ресурсный пакет не найден, переходите к шагу 6. Если найден пакет, являющийся базовым пакетом (пакетом для
Locale("")), и список кандидатов языков содержал толькоLocale(""), верните пакет вызывающей стороне. Если пакет, который был найден, является базовым пакетом, но список кандидатов языков содержал языки, отличные от Locale(""), задержите пакет и переходите к шагу 6. Если найден пакет, который не является базовым, переходите к шагу 7. - Вызывается метод
control.getFallbackLocale, чтобы получить язык по умолчанию (альтернатива текущему целевому языку) для дальнейшего поиска ресурсного пакета. Если метод возвращает ненулевой язык, он становится новым целевым языком, и процесс загрузки начинается заново с шага 3. В противном случае, если базовый пакет был найден и приостановлен на предыдущем шаге 5, он возвращается вызывающей стороне. В противном случае выбрасывается MissingResourceException. - На этом этапе мы нашли ресурсный пакет, который не является базовым. Если этот пакет установил родительский пакет во время его создания, он возвращается вызывающей стороне. В противном случае его цепочка родителей создается на основе списка кандидатов языков, из которых он был найден. Наконец, пакет возвращается вызывающей стороне.
Во время процесса загрузки ресурсного пакета выше, этот метод-фабрика ищет в кэше перед вызовом метода control.newBundle. Если срок действия ресурсного пакета, найденного в кэше, истек, метод-фабрика вызывает метод control.needsReload, чтобы определить, нужно ли перезагружать ресурсный пакет. Если перезагрузка необходима, метод-фабрика вызывает control.newBundle для перезагрузки ресурсного пакета. Если control.newBundle возвращает null, метод-фабрика помещает в кэш дублирующий ресурсный пакет как метку отсутствия ресурсных пакетов, чтобы избежать накладных расходов на поиск для последующих запросов. Такие дублирующие пакеты находятся под тем же контролем срока действия, что и control.
Все загруженные ресурсные пакеты кэшируются по умолчанию. Подробности см. в control.getTimeToLive.
Ниже приведен пример процесса загрузки пакета с реализацией ResourceBundle.Control по умолчанию.
Условия:
- Имя базового пакета:
foo.bar.Messages - Запрашиваемый
Locale:Locale.ITALY - Значение
Localeпо умолчанию:Locale.FRENCH - Доступные ресурсные пакеты:
foo/bar/Messages_fr.propertiesиfoo/bar/Messages.properties
Сначала getBundle пытается загрузить ресурсный пакет в следующей последовательности.
- класс
foo.bar.Messages_it_IT - файл
foo/bar/Messages_it_IT.properties - класс
foo.bar.Messages_it - файл
foo/bar/Messages_it.properties - класс
foo.bar.Messages - файл
foo/bar/Messages.properties
На этом этапе getBundle находит foo/bar/Messages.properties, который приостанавливается, так как это базовый пакет. getBundle вызывает control.getFallbackLocale("foo.bar.Messages", Locale.ITALY), который возвращает Locale.FRENCH. Далее getBundle пытается загрузить пакет в следующей последовательности.
- класс
foo.bar.Messages_fr - файл
foo/bar/Messages_fr.properties - класс
foo.bar.Messages - файл
foo/bar/Messages.properties
getBundle находит foo/bar/Messages_fr.properties и создаёт экземпляр ResourceBundle. Затем getBundle устанавливает цепочку родителей из списка кандидатов языков. В списке найден только foo/bar/Messages.properties и getBundle создает экземпляр ResourceBundle, который становится родителем экземпляра для foo/bar/Messages_fr.properties.
- Parameters:
-
baseName- имя базового ресурсного пакета, полное имя класса -
targetLocale- язык, для которого нужен ресурсный пакет -
loader- загрузчик классов, из которого загрузить ресурсный пакет -
control- контроль, предоставляющий информацию для процесса загрузки ресурсного пакета - Returns:
- ресурсный пакет для данного имени базы и языка
- Throws:
-
NullPointerException- еслиbaseName,targetLocale,loader, илиcontrolявляетсяnull -
MissingResourceException- если ресурсный пакет для указанного имени базы не найден -
IllegalArgumentException- если заданныйcontrolработает неправильно (например,control.getCandidateLocalesвозвращает null). Обратите внимание, что валидацияcontrolвыполняется по мере необходимости. -
UnsupportedOperationException- если этот метод вызывается в именованном модуле - Since:
- 1.6
clearCache
public static final void clearCache()
- Since:
- 1.6
- See Also:
clearCache
public static final void clearCache(ClassLoader loader)
- Parameters:
-
loader- загрузчик классов - Throws:
-
NullPointerException- еслиloaderравно null - Since:
- 1.6
- See Also:
handleGetObject
protected abstract Object handleGetObject(String key)
- Parameters:
-
key- ключ для нужного объекта - Returns:
- объект для заданного ключа или null
- Throws:
-
NullPointerException- еслиkeyявляетсяnull
getKeys
public abstract Enumeration<String> getKeys()
- Returns:
- перечисление ключей, содержащихся в этом
ResourceBundleи его родительских пакетах.
containsKey
public boolean containsKey(String key)
key в этом ResourceBundle или его родительских пакетах.- Parameters:
-
key-keyресурс - Returns:
-
true, если данныйkeyсодержится в этомResourceBundleили его родительских пакетах;falseв противном случае. - Throws:
-
NullPointerException- еслиkeynull - Since:
- 1.6
keySet
public Set<String> keySet()
Set всех ключей, содержащихся в этом ResourceBundle и его родительских пакетах.- Returns:
- a
Setвсех ключей, содержащихся в этомResourceBundleи его родительских пакетах. - Since:
- 1.6
handleKeySet
protected Set<String> handleKeySet()
Set ключей, содержащихся только в этом ResourceBundle. Реализация по умолчанию возвращает Set ключей, возвращаемых методом getKeys, за исключением тех, для которых метод handleGetObject возвращает null. После создания Set, значение сохраняется в этом ResourceBundle для предотвращения получения одного и того же Set в последующих вызовах. Подклассы могут переопределять этот метод для более быстрого обработки.
- Returns:
- a
Setключей, содержащихся только в этомResourceBundle - Since:
- 1.6
© 1993, 2021, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/ResourceBundle.html