Класс ResourceBundle
- Прямые известные подклассы:
-
ListResourceBundle,PropertyResourceBundle
public abstract class ResourceBundle extends Object
String, программа может загрузить его из ресурсного пакета, соответствующего текущей локали пользователя. Таким образом, вы можете писать код программы, который в значительной степени независим от локали пользователя, изолируя большую часть, если не все, локализованной информации в ресурсных пакетах. Это позволяет вам писать программы, которые могут:
- легко локализоваться или переводиться на разные языки
- обрабатывать сразу несколько локалей
- легко модифицироваться в будущем для поддержки ещё большего количества локалей
Ресурсные пакеты принадлежат к семействам, члены которых имеют общее базовое имя, но имена также имеют дополнительные компоненты, определяющие их локали. Например, базовое имя семейства ресурсных пакетов может быть "MyResources". Семья должна иметь пакет ресурсов по умолчанию, который просто имеет то же имя, что и его семья — "MyResources", — и будет использоваться как пакет последней надежды, если определённая локаль не поддерживается. Затем семья может предоставить столько локализованных членов, сколько необходимо, например, немецкий с именем "MyResources_de".
Каждый ресурсный пакет в семье содержит одни и те же элементы, но элементы были переведены для локали, представленной этим ресурсным пакетом. Например, и "MyResources", и "MyResources_de" могут иметь String, который используется на кнопке для отмены операций. В "MyResources" этот String может содержать "Отмена", а в "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 Platform предоставляет два подкласса 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".
Если вызывающий модуль является поставщиком ресурсного пакета, он не обращается к поиску через загрузчик классов.
В тех случаях, когда метод-фабрика getBundle вызывается из контекста, где в стеке нет кадра вызова (например, когда он вызывается напрямую из нити JNI), вызывающий модуль по умолчанию — безымянный модуль для системного загрузчика классов.
Ресурсные пакеты в автоматических модулях
Распространённый формат ресурсных пакетов — файл в формате .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 |
Возвращает пакет ресурсов, используя указанное имя базы, целевую локаль, загрузчик классов и control. |
static ResourceBundle |
getBundle |
Получает пакет ресурсов, используя указанное имя базы и локаль от имени указанного модуля. |
static final ResourceBundle |
getBundle |
Возвращает пакет ресурсов, используя указанное имя базы, целевую локаль и control, а также загрузчик классов вызывающего. |
static final ResourceBundle |
getBundle |
Возвращает пакет ресурсов, используя указанное имя базы, локаль по умолчанию и заданный control. |
abstract Enumeration |
getKeys() |
Возвращает перечисление ключей. |
Locale |
getLocale() |
Возвращает локаль этого пакета ресурсов. |
final Object |
getObject |
Получает объект для заданного ключа из этого пакета ресурсов или одного из его родителей. |
final String |
getString |
Получает строку для заданного ключа из этого пакета ресурсов или одного из его родителей. |
final String[] |
getStringArray |
Получает массив строк для заданного ключа из этого пакета ресурсов или одного из его родителей. |
protected abstract Object |
handleGetObject |
Получает объект для заданного ключа из этого пакета ресурсов. |
protected Set |
handleKeySet() |
Возвращает Set ключей, содержащихся только в этом ResourceBundle. |
Set |
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
- См. также:
getBundle
public static ResourceBundle getBundle(String baseName, Locale targetLocale, Module module)
Пакеты ресурсов в именованных модулях могут быть инкапсулированы. Когда пакет ресурсов загружается из провайдера сервиса, вызывающему модулю необходимо иметь соответствующую зависимость в его описании модуля, чтобы объявить, что модуль использует ResourceBundleProvider для указанного пакета ресурсов. В противном случае, он загрузит пакеты ресурсов, которые являются локальными в данном модуле, как если бы он вызывал Module.getResourceAsStream(String), или которые видны загрузчику классов данного модуля, как если бы он вызывал ClassLoader.getResourceAsStream(String). Когда пакет ресурсов загружается из указанного модуля, он подчиняется правилам инкапсуляции, указанным в Module.getResourceAsStream.
Если данный module является безымянным модулем, то этот метод эквивалентен вызову getBundle(baseName, targetLocale, module.getClassLoader() для загрузки пакетов ресурсов, которые видны загрузчику классов данного безымянного модуля. Реализации пользовательского ResourceBundleControlProvider, если они присутствуют, будут вызваны только в случае, если указанный модуль является безымянным.
- Parameters:
-
baseName- базовое имя пакета ресурсов, полное имя класса -
targetLocale- язык для которого требуется пакет ресурсов -
module- модуль, в котором ищется пакет ресурсов - Returns:
- пакет ресурсов для данного базового имени и языка в модуле
- Throws:
-
NullPointerException- еслиbaseName,targetLocale, илиmodulenull -
SecurityException- если менеджер безопасности существует и вызывающий элемент не является указанным модулем и не имеетRuntimePermission("getClassLoader") -
MissingResourceException- если пакет ресурсов для указанного базового имени и языка не найден в указанномmodule - Since:
- 9
- See Also:
getBundle
public static final ResourceBundle getBundle(String baseName, Locale targetLocale, ResourceBundle.Control control)
getBundle(baseName, targetLocale, this.getClass().getClassLoader(),
control);
getClassLoader() выполняется с привилегиями безопасности ResourceBundle. См. getBundle для полного описания процесса загрузки пакета ресурсов с ResourceBundle.Control.- Parameters:
-
baseName- базовое имя пакета ресурсов, полное имя класса -
targetLocale- язык для которого требуется пакет ресурсов -
control- обработчик, предоставляющий информацию для процесса загрузки пакета ресурсов - Returns:
- пакет ресурсов для данного базового имени и
Localeвlocales - Throws:
-
NullPointerException- еслиbaseName,localesилиcontrolnull -
MissingResourceException- если пакет ресурсов для указанного базового имени в любом изlocalesне найден. -
IllegalArgumentException- если данныйcontrolне работает должным образом (например,control.getCandidateLocalesвозвращает null). Обратите внимание, что валидацияcontrolвыполняется по мере необходимости. -
UnsupportedOperationException- если этот метод вызывается в именованном модуле - Since:
- 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, если экземпляр 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 не проверяют это, и поэтому можно получить доступ к 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)для загрузки ресурсных пакетов от имени конкретного модуля. - Параметры:
-
baseName- базовое имя ресурсного пакета, полное имя класса -
locale- локаль, для которой требуется ресурсный пакет -
loader- загрузчик классов, из которого необходимо загрузить ресурсный пакет - Возвращает:
- ресурсный пакет для заданного базового имени и локали
- Исключения:
-
NullPointerException- еслиbaseName,locale, илиloadernull -
MissingResourceException- если ресурсный пакет для указанного базового имени не найден - С:
- 1.2
- См. также:
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с целевым языком для получения списка кандидатных языков, для которых ищутся наборы ресурсов. - Вызывается метод
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.ITALY - Язык по умолчанию:
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, илиcontrolnull -
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- еслиkeynull
getKeys
public abstract Enumeration<String> getKeys()
- Returns:
- перечисление ключей, содержащихся в этом наборе ресурсов и его родительских наборах.
containsKey
public boolean containsKey(String key)
- Parameters:
-
key- ключ ресурса - Returns:
-
trueесли данный ключ содержится в этом наборе ресурсов или его родительских наборах;falseв противном случае. - Throws:
-
NullPointerException- еслиkeynull - Since:
- 1.6
keySet
public Set<String> keySet()
Set всех ключей, содержащихся в этом ResourceBundle и его родительских пакетах.- Возвращает:
- a
Setвсех ключей, содержащихся в этомResourceBundleи его родительских пакетах. - С:
- 1.6
handleKeySet
protected Set<String> handleKeySet()
Set ключей, содержащихся только в этом ResourceBundle. Реализация по умолчанию возвращает Set ключей, возвращаемых методом getKeys, за исключением тех, для которых метод handleGetObject возвращает null. После создания Set, значение сохраняется в этом ResourceBundle для предотвращения создания тех же Set в последующих вызовах. Подклассы могут переопределить этот метод для более быстрого обращения.
- Возвращает:
- a
Setключей, содержащихся только в этомResourceBundle - С:
- 1.6
© 1993, 2023, 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/21/docs/api/java.base/java/util/ResourceBundle.html