Spec-Zone.ru › OpenJDK 24

Класс 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".

Если модуль-клиент является поставщиком ресурсных пакетов, он не обращается к поиску через загрузчик классов.

В случаях, когда метод-фабрика 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
См. также:
  • 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
MissingResourceException - если ресурсный пакет для указанного базового имени не найден в указанном модуле
С:
9
См. также:
  • ResourceBundleProvider
  • Стратегия поиска и загрузки ресурсных пакетов
  • Ресурсные пакеты и именованные модули

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

getBundle() locale to resource bundle mapping
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 выполняется в следующие этапы.
  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, будет следующей.
    locale-format combinations for 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.

Параметры:
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
См. также:
  • ResourceBundle.Control.getTimeToLive(String,Locale)

clearCache

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

handleGetObject

protected abstract Object handleGetObject(String key)
Получает объект для заданного ключа из этого набора ресурсов. Возвращает null, если в этом наборе ресурсов нет объекта для заданного ключа.
Параметры:
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

Spec-Zone.ru

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