Spec-Zone.ru › OpenJDK 17

Класс ResourceBundle

java.lang.Object
java.util.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
См. также:
  • ListResourceBundle
  • PropertyResourceBundle
  • MissingResourceException
  • ResourceBundleProvider

Краткое описание вложенных классов

Модификатор и тип Класс Описание
static class  ResourceBundle.Control
ResourceBundle.Control определяет набор методов обратного вызова, которые вызываются фабричными методами ResourceBundle.getBundle во время процесса загрузки пакета.

Краткое описание полей

Модификатор и тип Поле Описание
protected ResourceBundle parent
Родительский пакет этого пакета.

Краткое описание конструкторов

Конструктор Описание
ResourceBundle()
Единственный конструктор.

Краткое описание методов

Модификатор и тип Метод Описание
static final void clearCache()
Удаляет все пакеты ресурсов из кэша, загруженные модулем вызывающего.
static final void clearCache(ClassLoader loader)
Удаляет все пакеты ресурсов из кэша, загруженные данным загрузчиком классов.
boolean containsKey(String key)
Определяет, содержится ли данный key в этом ResourceBundle или его родительских пакетах.
String getBaseBundleName()
Возвращает базовое имя этого пакета, если известно, или null в противном случае.
static final ResourceBundle getBundle(String baseName)
Получает пакет ресурсов с указанным базовым именем, стандартным языком и модулем вызывающего.
static ResourceBundle getBundle(String baseName, Module module)
Получает пакет ресурсов с указанным базовым именем и стандартным языком от имени указанного модуля.
static final ResourceBundle getBundle(String baseName, Locale locale)
Получает пакет ресурсов с указанным базовым именем и языком, и модулем вызывающего.
static ResourceBundle getBundle(String baseName, Locale locale, ClassLoader loader)
Получает пакет ресурсов с указанным базовым именем, языком и загрузчиком классов.
static ResourceBundle getBundle(String baseName, Locale targetLocale, ClassLoader loader, ResourceBundle.Control control)
Возвращает пакет ресурсов с указанным базовым именем, целевым языком, загрузчиком классов и контроллером.
static ResourceBundle getBundle(String baseName, Locale targetLocale, Module module)
Получает пакет ресурсов с указанным базовым именем и языком от имени указанного модуля.
static final ResourceBundle getBundle(String baseName, Locale targetLocale, ResourceBundle.Control control)
Возвращает пакет ресурсов с указанным базовым именем, целевым языком и контроллером, и загрузчиком классов вызывающего.
static final ResourceBundle getBundle(String baseName, ResourceBundle.Control control)
Возвращает пакет ресурсов с указанным базовым именем, стандартным языком и указанным контроллером.
abstract Enumeration<String> getKeys()
Возвращает перечисление ключей.
Locale getLocale()
Возвращает язык этого пакета ресурсов.
final Object getObject(String key)
Получает объект для данного ключа из этого пакета ресурсов или одного из его родителей.
final String getString(String key)
Получает строку для данного ключа из этого пакета ресурсов или одного из его родителей.
final String[] getStringArray(String key)
Получает массив строк для данного ключа из этого пакета ресурсов или одного из его родителей.
protected abstract Object handleGetObject(String key)
Получает объект для данного ключа из этого пакета ресурсов.
protected Set<String> handleKeySet()
Возвращает Set ключей, содержащихся только в этом ResourceBundle.
Set<String> keySet()
Возвращает Set всех ключей, содержащихся в этом ResourceBundle и его родительских пакетах.
protected void setParent(ResourceBundle parent)
Устанавливает родительский пакет этого пакета.

Методы, объявленные в классе java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Подробное описание полей

parent

protected ResourceBundle parent
Родительский пул этого пула. Родительский пул ищется с помощью getObject, когда данный пул не содержит определённый ресурс.

Подробное описание конструкторов

ResourceBundle

public ResourceBundle()
Единственный конструктор. (Для вызова подклассами конструкторов, как правило, неявный.)

Подробное описание методов

getBaseBundleName

public String getBaseBundleName()
Возвращает базовое имя этого пула, если оно известно, или null если неизвестно. Если не null, то это значение параметра baseName, который был передан методу ResourceBundle.getBundle(...) при загрузке пула ресурсов.
Возвращает:
Базовое имя пула ресурсов, как предоставленное и ожидаемое методами ResourceBundle.getBundle(...).
С:
1.8
См. также:
  • getBundle(java.lang.String, java.util.Locale, java.lang.ClassLoader)

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()
Возвращает локаль этого пула ресурсов. Этот метод может быть использован после вызова getBundle(), чтобы определить, действительно ли возвращённый пул ресурсов соответствует запрошенной локали или является резервным вариантом.
Возвращает:
локаль этого пула ресурсов

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
См. также:
  • ResourceBundleProvider
  • Стратегия поиска и загрузки пула ресурсов
  • Пулы ресурсов и именованные модули

ПолучитьСвязку

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
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 или 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 с помощью 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 с приведенными ниже аргументами локали приведет к созданию наборов ресурсов следующим образом:

отображение сопоставления локали 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, или loader null
MissingResourceException - если набор ресурсов для указанного базового имени не найден
Since:
1.2
See Also:
  • Наборы ресурсов и именованные модули

getBundle

public static ResourceBundle getBundle(String baseName, Locale targetLocale, ClassLoader loader, ResourceBundle.Control control)
Возвращает ресурсный пакет, используя указанное имя базы, целевой язык, загрузчик классов и контроль. В отличие от методов-фабрик getBundle без аргумента control, заданный control определяет, как найти и создать ресурсные пакеты. Концептуально, процесс загрузки пакета с данным control выполняется в следующих шагах.
  1. Этот метод-фабрика ищет ресурсный пакет в кэше для указанного baseName, targetLocale и loader. Если запрашиваемый экземпляр ресурсного пакета найден в кэше и периоды времени жизни экземпляра и всех его родительских экземпляров не истекли, экземпляр возвращается вызывающей стороне. В противном случае этот метод-фабрика продолжает процесс загрузки, описанный ниже.
  2. Вызывается метод control.getFormats, чтобы получить форматы ресурсного пакета для создания имен пакета или ресурса. Строки "java.class" и "java.properties" обозначают ресурсные пакеты на основе классов и на основе свойств соответственно. Другие строки, начинающиеся с "java.", зарезервированы для будущих расширений и не должны использоваться для форматов, определенных приложением. Другие строки обозначают форматы, определенные приложением.
  3. Метод control.getCandidateLocales вызывается с целевым языком, чтобы получить список кандидатных Locale, для которых ищутся ресурсные пакеты.
  4. Метод control.newBundle вызывается для создания экземпляра ResourceBundle для имени базового пакета, кандидатного языка и формата. (Обратитесь к примечанию о поиске в кэше ниже.) Этот шаг повторяется для всех комбинаций кандидатов языков и форматов, пока метод newBundle не вернет экземпляр ResourceBundle или пока все комбинации не будут исчерпаны. Например, если кандидатами являются Locale("de", "DE"), Locale("de") и Locale(""), а форматами "java.class" и "java.properties", то следующая последовательность комбинаций язык-формат будет использоваться для вызова control.newBundle.
    комбинации язык-формат для newBundle
    Индекс Locale format
    1 Locale("de", "DE") java.class
    2 Locale("de", "DE") java.properties
    3 Locale("de") java.class
    4 Locale("de") java.properties
    5 Locale("") java.class
    6 Locale("") java.properties
  5. Если на предыдущем шаге ресурсный пакет не найден, переходите к шагу 6. Если найден пакет, являющийся базовым пакетом (пакетом для Locale("")), и список кандидатов языков содержал только Locale(""), верните пакет вызывающей стороне. Если пакет, который был найден, является базовым пакетом, но список кандидатов языков содержал языки, отличные от Locale(""), задержите пакет и переходите к шагу 6. Если найден пакет, который не является базовым, переходите к шагу 7.
  6. Вызывается метод control.getFallbackLocale, чтобы получить язык по умолчанию (альтернатива текущему целевому языку) для дальнейшего поиска ресурсного пакета. Если метод возвращает ненулевой язык, он становится новым целевым языком, и процесс загрузки начинается заново с шага 3. В противном случае, если базовый пакет был найден и приостановлен на предыдущем шаге 5, он возвращается вызывающей стороне. В противном случае выбрасывается MissingResourceException.
  7. На этом этапе мы нашли ресурсный пакет, который не является базовым. Если этот пакет установил родительский пакет во время его создания, он возвращается вызывающей стороне. В противном случае его цепочка родителей создается на основе списка кандидатов языков, из которых он был найден. Наконец, пакет возвращается вызывающей стороне.

Во время процесса загрузки ресурсного пакета выше, этот метод-фабрика ищет в кэше перед вызовом метода 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:
  • ResourceBundle.Control.getTimeToLive(String,Locale)

clearCache

public static final void clearCache(ClassLoader loader)
Удаляет все ресурсные пакеты из кэша, загруженные заданным загрузчиком классов.
Parameters:
loader - загрузчик классов
Throws:
NullPointerException - если loader равно null
Since:
1.6
See Also:
  • ResourceBundle.Control.getTimeToLive(String,Locale)

handleGetObject

protected abstract Object handleGetObject(String key)
Получает объект для заданного ключа из этого ресурсного пакета. Возвращает null, если этот ресурсный пакет не содержит объекта для данного ключа.
Parameters:
key - ключ для нужного объекта
Returns:
объект для заданного ключа или null
Throws:
NullPointerException - если key является null

getKeys

public abstract Enumeration<String> getKeys()
Возвращает перечисление ключей.
Returns:
перечисление ключей, содержащихся в этом ResourceBundle и его родительских пакетах.
END_OF_DOCUMENT_MARKER

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, 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API