Класс 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".
Если модуль-клиент является поставщиком ресурсных пакетов, он не обращается к поиску через загрузчик классов.
В случаях, когда метод-фабрика getBundle вызывается из контекста, где на стеке нет кадра вызывающего модуля (например, при непосредственном вызове из потока, присоединённого к JNI), вызывающий модуль по умолчанию - безымянный модуль для загрузчика классов системы.
Ресурсные пакеты в автоматических модулях
Распространённый формат ресурсных пакетов - в файле формата .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 |
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 -
MissingResourceException- если ресурсный пакет для указанного базового имени не найден в указанном модуле - С:
- 9
- См. также:
getBundle
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илиmoduleявляетсяnull -
MissingResourceException- если набор ресурсов для указанного базового имени и языкового стандарта не найден в указанномmodule - С:
- 9
- См. также:
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.- Параметры:
-
baseName- базовое имя набора ресурсов, полное имя класса -
targetLocale- языковой стандарт, для которого требуется набор ресурсов -
control- контроллер, предоставляющий информацию для процесса загрузки набора ресурсов - Возвращает:
- набор ресурсов для заданного базового имени и
Localeвlocales - Исключения:
-
NullPointerException- еслиbaseName,localesилиcontrolявляетсяnull -
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 не предоставлен через SPI ResourceBundleControlProvider. См. описание изменения по умолчанию. Ниже приведено описание стандартного поведения. Стратегия поиска и загрузки ресурсного пакета
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 предварительно созданного ресурсного пакета с новым ресурсным пакетом. Это продолжается до тех пор, пока список имен не будет исчерпан или у текущего пакета уже есть ненулевой родитель.
После завершения цепочки родительских элементов пакет возвращается.
Примечание: 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 | Ресурсный пакет |
|---|---|
| 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:
- Если вызывающий модуль является именованным модулем, и заданный
loaderявляется загрузчиком классов вызывающего модуля, этот метод эквивалентенgetBundle(baseName, locale); в противном случае он может не найти ресурсные пакеты из именованных модулей. ИспользуйтеgetBundle(String, Locale, Module)для загрузки ресурсных пакетов от имени определенного модуля вместо этого. - Параметры:
-
baseName- базовое имя ресурсного пакета, полное имя класса -
locale- языковой стандарт, для которого требуется ресурсный пакет -
loader- загрузчик классов, из которого нужно загрузить ресурсный пакет - Возвращает:
- ресурсный пакет для заданного базового имени и языкового стандарта
- Исключения:
-
NullPointerException- еслиbaseName,localeилиloaderявляетсяnull -
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с целевым языком, чтобы получить список кандидатных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.
- Параметры:
-
baseName- имя базы набора ресурсов, полное имя класса -
targetLocale- язык, для которого нужен набор ресурсов -
loader- загрузчик классов, из которого загрузить набор ресурсов -
control- управление, предоставляющее информацию для процесса загрузки набора ресурсов - Возвращает:
- набор ресурсов для заданного имени базы и языка
- Исключения:
-
NullPointerException- еслиbaseName,targetLocale,loaderилиcontrolявляетсяnull -
MissingResourceException- если набор ресурсов для указанного имени базы не найден -
IllegalArgumentException- если заданныйcontrolработает неправильно (например,control.getCandidateLocalesвозвращает null). Обратите внимание, что проверкаcontrolвыполняется по мере необходимости. -
UnsupportedOperationException- если этот метод вызывается в именованном модуле - С:
- 1.6
clearCache
public static final void clearCache()
- С:
- 1.6
- См. также:
clearCache
public static final void clearCache(ClassLoader loader)
- Параметры:
-
loader- загрузчик классов - Исключения:
-
NullPointerException- еслиloaderравен null - С:
- 1.6
- См. также:
handleGetObject
protected abstract Object handleGetObject(String key)
- Параметры:
-
key- ключ для нужного объекта - Возвращает:
- объект для заданного ключа или null
- Исключения:
-
NullPointerException- еслиkeyявляетсяnull
getKeys
public abstract Enumeration<String> getKeys()
- Возвращает:
- перечисление ключей, содержащихся в этом наборе ресурсов и его родительских наборах.
containsKey
public boolean containsKey(String key)
key в этом ResourceBundle или его родительских пакетах.- Parameters:
-
key- ресурсkey - Returns:
-
true, если заданныйkeyсодержится в этомResourceBundleили его родительских пакетах;falseв противном случае. - Throws:
-
NullPointerException- еслиkeyявляетсяnull - 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, 2025, 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/util/ResourceBundle.html