Top Description Inners Fields Constructors Methods
java.util

public abstract Class ResourceBundle

extends Object
Class Inheritance
Known Direct Subclasses
sun.util.resources.BreakIteratorResourceBundle, sun.util.resources.OpenListResourceBundle, sun.util.resources.ParallelListResourceBundle, java.util.ListResourceBundle, java.util.PropertyResourceBundle
Imports
java.io.IOException, .InputStream, .UncheckedIOException, java.lang.ref.Reference, .ReferenceQueue, .SoftReference, .WeakReference, java.lang.reflect.Constructor, .InvocationTargetException, .Modifier, java.net.JarURLConnection, .URL, .URLConnection, java.security.AccessController, .PrivilegedAction, .PrivilegedActionException, .PrivilegedExceptionAction, java.util.concurrent.ConcurrentHashMap, .ConcurrentMap, java.util.jar.JarEntry, java.util.spi.ResourceBundleControlProvider, .ResourceBundleProvider, java.util.stream.Stream, jdk.internal.loader.BootLoader, jdk.internal.access.JavaUtilResourceBundleAccess, .SharedSecrets, jdk.internal.reflect.CallerSensitive, .Reflection, sun.security.action.GetPropertyAction, sun.util.locale.BaseLocale, .LocaleObjectCache, sun.util.resources.Bundles

Resource bundles contain locale-specific objects. When your program needs a locale-specific resource, a String for example, your program can load it from the resource bundle that is appropriate for the current user's locale. In this way, you can write program code that is largely independent of the user's locale isolating most, if not all, of the locale-specific information in resource bundles.

This allows you to write programs that can:

Resource bundles belong to families whose members share a common base name, but whose names also have additional components that identify their locales. For example, the base name of a family of resource bundles might be "MyResources". The family should have a default resource bundle which simply has the same name as its family - "MyResources" - and will be used as the bundle of last resort if a specific locale is not supported. The family can then provide as many locale-specific members as needed, for example a German one named "MyResources_de".

Each resource bundle in a family contains the same items, but the items have been translated for the locale represented by that resource bundle. For example, both "MyResources" and "MyResources_de" may have a String that's used on a button for canceling operations. In "MyResources" the String may contain "Cancel" and in "MyResources_de" it may contain "Abbrechen".

If there are different resources for different countries, you can make specializations: for example, "MyResources_de_CH" contains objects for the German language (de) in Switzerland (CH). If you want to only modify some of the resources in the specialization, you can do so.

When your program needs a locale-specific object, it loads the ResourceBundle class using the getBundle method:

ResourceBundle myResources = ResourceBundle.getBundle("MyResources", currentLocale);
ResourceBundle myResources =
     ResourceBundle.getBundle("MyResources", currentLocale);

Resource bundles contain key/value pairs. The keys uniquely identify a locale-specific object in the bundle. Here's an example of a ListResourceBundle that contains two key/value pairs:

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 }; } }
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
       };
    }
}
Keys are always Strings. In this example, the keys are "OkKey" and "CancelKey". In the above example, the values are also Strings--"OK" and "Cancel"--but they don't have to be. The values can be any type of object.

You retrieve an object from resource bundle using the appropriate getter method. Because "OkKey" and "CancelKey" are both strings, you would use getString to retrieve them:

button1 = new Button(myResources.getString("OkKey")); button2 = new Button(myResources.getString("CancelKey"));
button1 = new Button(myResources.getString("OkKey"));
button2 = new Button(myResources.getString("CancelKey"));
The getter methods all require the key as an argument and return the object if found. If the object is not found, the getter method throws a MissingResourceException.

Besides getString, ResourceBundle also provides a method for getting string arrays, getStringArray, as well as a generic getObject method for any other type of object. When using getObject, you'll have to cast the result to the appropriate type. For example:

int[] myIntegers = (int[]) myResources.getObject("intList");
int[] myIntegers = (int[]) myResources.getObject("intList");

The Java Platform provides two subclasses of ResourceBundle, ListResourceBundle and PropertyResourceBundle, that provide a fairly simple way to create resources. As you saw briefly in a previous example, ListResourceBundle manages its resource as a list of key/value pairs. PropertyResourceBundle uses a properties file to manage its resources.

If ListResourceBundle or PropertyResourceBundle do not suit your needs, you can write your own ResourceBundle subclass. Your subclasses must override two methods: handleGetObject and getKeys().

The implementation of a ResourceBundle subclass must be thread-safe if it's simultaneously used by multiple threads. The default implementations of the non-abstract methods in this class, and the methods in the direct known concrete subclasses ListResourceBundle and PropertyResourceBundle are thread-safe.

Resource Bundles and Named Modules

Resource bundles can be deployed in modules in the following ways:

Resource bundles together with an application

Resource bundles can be deployed together with an application in the same module. In that case, the resource bundles are loaded by code in the module by calling the getBundle(String) or getBundle(String, Locale) method.

Resource bundles as service providers

Resource bundles can be deployed in one or more service provider modules and they can be located using ServiceLoader. A service interface or class must be defined. The caller module declares that it uses the service, the service provider modules declare that they provide implementations of the service. Refer to ResourceBundleProvider for developing resource bundle services and deploying resource bundle providers. The module obtaining the resource bundle can be a resource bundle provider itself; in which case this module only locates the resource bundle via service provider mechanism.

A resource bundle provider can provide resource bundles in any format such XML which replaces the need of ResourceBundle.Control.

Resource bundles in other modules and class path

Resource bundles in a named module may be encapsulated so that it cannot be located by code in other modules. Resource bundles in unnamed modules and class path are open for any module to access. Resource bundle follows the resource encapsulation rules as specified in Module#getResourceAsStream(String).

The getBundle factory methods with no Control parameter locate and load resource bundles from service providers. It may continue the search as if calling Module#getResourceAsStream(String) to find the named resource from a given module and calling ClassLoader#getResourceAsStream(String); refer to the specification of the getBundle method for details. Only non-encapsulated resource bundles of "java.class" or "java.properties" format are searched.

If the caller module is a resource bundle provider, it does not fall back to the class loader search.

In cases where the getBundle factory method is called from a context where there is no caller frame on the stack (e.g. when called directly from a JNI attached thread), the caller module is default to the unnamed module for the system class loader.

Resource bundles in automatic modules

A common format of resource bundles is in .properties file format. Typically .properties resource bundles are packaged in a JAR file. Resource bundle only JAR file can be readily deployed as an automatic module. For example, if the JAR file contains the entry "p/q/Foo_ja.properties" and no .class entry, when resolved and defined as an automatic module, no package is derived for this module. This allows resource bundles in .properties format packaged in one or more JAR files that may contain entries in the same directory and can be resolved successfully as automatic modules.

ResourceBundle.Control

The ResourceBundle.Control class provides information necessary to perform the bundle loading process by the getBundle factory methods that take a ResourceBundle.Control instance. You can implement your own subclass in order to enable non-standard resource bundle formats, change the search strategy, or define caching parameters. Refer to the descriptions of the class and the getBundle factory method for details.

ResourceBundle.Control is designed for an application deployed in an unnamed module, for example to support resource bundles in non-standard formats or package localized resources in a non-traditional convention. ResourceBundleProvider is the replacement for ResourceBundle.Control when migrating to modules. UnsupportedOperationException will be thrown when a factory method that takes the ResourceBundle.Control parameter is called.

For the getBundle factory methods that take no Control instance, their default behavior of resource bundle loading can be modified with custom ResourceBundleControlProvider implementations. If any of the providers provides a Control for the given base name, that Control will be used instead of the default Control. If there is more than one service provider for supporting the same base name, the first one returned from ServiceLoader will be used. A custom Control implementation is ignored by named modules.

Cache Management

Resource bundle instances created by the getBundle factory methods are cached by default, and the factory methods return the same resource bundle instance multiple times if it has been cached. getBundle clients may clear the cache, manage the lifetime of cached resource bundle instances using time-to-live values, or specify not to cache resource bundle instances. Refer to the descriptions of the getBundle factory method, clearCache, ResourceBundle.Control.getTimeToLive, and ResourceBundle.Control.needsReload for details.

Example

The following is a very simple example of a ResourceBundle subclass, MyResources, that manages two resources (for a larger number of resources you would probably use a Map). Notice that you don't need to supply a value if a "parent-level" ResourceBundle handles the same key with the same value (as for the okKey below).
// 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")); } }
// 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"));
    }
}
You do not have to restrict yourself to using a single family of ResourceBundles. For example, you could have a set of bundles for exception messages, ExceptionResources (ExceptionResources_fr, ExceptionResources_de, ...), and one for widgets, WidgetResource (WidgetResources_fr, WidgetResources_de, ...); breaking up the resources however you like.
Since
1.1
See Also
ListResourceBundle, PropertyResourceBundle, MissingResourceException, ResourceBundleProvider

Nested and Inner Type Summary

Modifier and TypeClass and Description
private static class
ResourceBundle.BundleReference

References to bundles are soft references so that they can be garbage collected when they have no hard references.

private static class
ResourceBundle.CacheKey

Key used for cached resource bundles.

private static interface
ResourceBundle.CacheKeyReference

The common interface to get a CacheKey in LoaderReference and BundleReference.

public static class
ResourceBundle.Control

ResourceBundle.Control defines a set of callback methods that are invoked by the ResourceBundle.getBundle factory methods during the bundle loading process.

private static class
ResourceBundle.KeyElementReference<T>

References to a CacheKey element as a WeakReference so that it can be garbage collected when nobody else is using it.

private static class
private static class
private static class
private static class

Field Summary

Modifier and TypeField and Description
private volatile ResourceBundle.CacheKey
cacheKey

The back link to the cache key.

private static final ConcurrentMap<ResourceBundle.CacheKey, ResourceBundle.BundleReference>
cacheList

The cache is a map from cache keys (with bundle base name, locale, and class loader) to either a resource bundle or NONEXISTENT_BUNDLE wrapped by a BundleReference.

private volatile boolean
expired

The flag indicating this bundle has expired in the cache.

private static final int
INITIAL_CACHE_SIZE

initial size of the bundle cache

private volatile Set<String>
keySet

A Set of the keys contained only in this ResourceBundle.

private Locale
locale

The locale for this bundle.

private String
name

The base bundle name for this bundle.

private static final ResourceBundle
NONEXISTENT_BUNDLE

constant indicating that no resource bundle exists

protected ResourceBundle
parent

The parent bundle of this bundle.

private static final ReferenceQueue<Object>
referenceQueue

Queue for reference objects referring to class loaders or bundles.

private static final boolean
private static final String

Constructor Summary

AccessConstructor and Description
public
ResourceBundle()

Sole constructor.

Method Summary

Modifier and TypeMethod and Description
private static boolean
checkList(List<?> a)

Checks if the given List is not null, not empty, not having null in its elements.

private static void
public static final void
clearCache()

Removes all resource bundles from the cache that have been loaded by the caller's module.

public static final void
clearCache(ClassLoader
the class loader
loader
)

Removes all resource bundles from the cache that have been loaded by the given class loader.

public boolean

Returns:

true if the given key is contained in this ResourceBundle or its parent bundles; false otherwise.
containsKey
(String
the resource key
key
)

Determines whether the given key is contained in this ResourceBundle or its parent bundles.

private static ResourceBundle
findBundle(Module callerModule, Module module, ResourceBundle.CacheKey cacheKey, List<Locale> candidateLocales, List<String> formats, int index, ResourceBundle.Control control, ResourceBundle baseBundle)

private static ResourceBundle

Returns:

the cached bundle, or null if the bundle is not found in the cache or its parent has expired. bundle.expire is true upon return if the bundle in the cache has expired.
findBundleInCache
(ResourceBundle.CacheKey
the key to look up the cache
cacheKey
,
ResourceBundle.Control
the Control to be used for the expiration control
control
)

Finds a bundle in the cache.

public String

Returns:

The base name of the resource bundle, as provided to and expected by the ResourceBundle.getBundle(...) methods.
getBaseBundleName
()

Returns the base name of this bundle, if known, or null if unknown.

public static final ResourceBundle

Returns:

a resource bundle for the given base name and the default locale
getBundle
(String
the base name of the resource bundle, a fully qualified class name
baseName
)

Gets a resource bundle using the specified base name, the default locale, and the caller module.

public static final ResourceBundle

Returns:

a resource bundle for the given base name and the default locale
getBundle
(String
the base name of the resource bundle, a fully qualified class name
baseName
,
ResourceBundle.Control
the control which gives information for the resource bundle loading process
control
)

Returns a resource bundle using the specified base name, the default locale and the specified control.

public static final ResourceBundle

Returns:

a resource bundle for the given base name and locale
getBundle
(String
the base name of the resource bundle, a fully qualified class name
baseName
,
Locale
the locale for which a resource bundle is desired
locale
)

Gets a resource bundle using the specified base name and locale, and the caller module.

public static ResourceBundle

Returns:

a resource bundle for the given base name and the default locale
getBundle
(String
the base name of the resource bundle, a fully qualified class name
baseName
,
Module
the module for which the resource bundle is searched
module
)

Gets a resource bundle using the specified base name and the default locale on behalf of the specified module.

public static ResourceBundle

Returns:

a resource bundle for the given base name and locale in the module
getBundle
(String
the base name of the resource bundle, a fully qualified class name
baseName
,
Locale
the locale for which a resource bundle is desired
targetLocale
,
Module
the module for which the resource bundle is searched
module
)

Gets a resource bundle using the specified base name and locale on behalf of the specified module.

public static final ResourceBundle

Returns:

a resource bundle for the given base name and a Locale in locales
getBundle
(String
the base name of the resource bundle, a fully qualified class name
baseName
,
Locale
the locale for which a resource bundle is desired
targetLocale
,
ResourceBundle.Control
the control which gives information for the resource bundle loading process
control
)

Returns a resource bundle using the specified base name, target locale and control, and the caller's class loader.

public static ResourceBundle

Returns:

a resource bundle for the given base name and locale
getBundle
(String
the base name of the resource bundle, a fully qualified class name
baseName
,
Locale
the locale for which a resource bundle is desired
locale
,
ClassLoader
the class loader from which to load the resource bundle
loader
)

Gets a resource bundle using the specified base name, locale, and class loader.

public static ResourceBundle

Returns:

a resource bundle for the given base name and locale
getBundle
(String
the base name of the resource bundle, a fully qualified class name
baseName
,
Locale
the locale for which a resource bundle is desired
targetLocale
,
ClassLoader
the class loader from which to load the resource bundle
loader
,
ResourceBundle.Control
the control which gives information for the resource bundle loading process
control
)

Returns a resource bundle using the specified base name, target locale, class loader and control.

private static ResourceBundle
getBundleFromModule(Class<?> caller, Module module, String baseName, Locale locale, ResourceBundle.Control control)

private static ResourceBundle
getBundleImpl(String baseName, Locale locale, Class<?> caller, ResourceBundle.Control control)

private static ResourceBundle
getBundleImpl(String baseName, Locale locale, Class<?> caller, ClassLoader loader, ResourceBundle.Control control)

This method will find resource bundles using the legacy mechanism if the caller is unnamed module or the given class loader is not the class loader of the caller module getting the resource bundle, i.e. find the class that is visible to the class loader and properties from unnamed module.

private static ResourceBundle
getBundleImpl(Module callerModule, Module module, String baseName, Locale locale, ResourceBundle.Control control)

private static Module
private static ResourceBundle.Control
getDefaultControl(Class<?> caller, String baseName)

private static ResourceBundle.Control
getDefaultControl(Module targetModule, String baseName)

public abstract Enumeration<String>

Returns:

an Enumeration of the keys contained in this ResourceBundle and its parent bundles.
getKeys
()

Returns an enumeration of the keys.

private static ClassLoader
getLoader(Module module)

private static ClassLoader

Returns:

the ClassLoader to use in Control#needsReload and Control#newBundle
getLoaderForControl
(Module
a non-null-screened module form the CacheKey#getModule().
module
)

public Locale

Returns:

the locale of this resource bundle
getLocale
()

Returns the locale of this resource bundle.

public final Object

Returns:

the object for the given key
getObject
(String
the key for the desired object
key
)

Gets an object for the given key from this resource bundle or one of its parents.

private static Class<ResourceBundleProvider>
getResourceBundleProviderType(String baseName, ClassLoader loader)

Returns the service type of the given baseName that is visible to the given class loader

private static ServiceLoader<ResourceBundleProvider>
getServiceLoader(Module module, String baseName)

Returns a ServiceLoader that will find providers that are bound to a given named module.

public final String

Returns:

the string for the given key
getString
(String
the key for the desired string
key
)

Gets a string for the given key from this resource bundle or one of its parents.

public final String[]

Returns:

the string array for the given key
getStringArray
(String
the key for the desired string array
key
)

Gets a string array for the given key from this resource bundle or one of its parents.

protected abstract Object

Returns:

the object for the given key, or null
handleGetObject
(String
the key for the desired object
key
)

Gets an object for the given key from this resource bundle.

protected Set<String>

Returns:

a Set of the keys contained only in this ResourceBundle
handleKeySet
()

Returns a Set of the keys contained only in this ResourceBundle.

private static boolean
hasValidParentChain(ResourceBundle bundle)

Determines whether any of resource bundles in the parent chain, including the leaf, have expired.

private static boolean
public Set<String>

Returns:

a Set of all keys contained in this ResourceBundle and its parent bundles.
keySet
()

Returns a Set of all keys contained in this ResourceBundle and its parent bundles.

private static ResourceBundle
loadBundle(ResourceBundle.CacheKey cacheKey, List<String> formats, ResourceBundle.Control control, Module module, Module callerModule)

private static ResourceBundle
loadBundle(ResourceBundle.CacheKey cacheKey, List<String> formats, ResourceBundle.Control control, boolean reload)

private static ResourceBundle
loadBundleFromProviders(String baseName, Locale locale, ServiceLoader<ResourceBundleProvider> providers, ResourceBundle.CacheKey cacheKey)

Loads ResourceBundle from service providers.

private static ResourceBundle

Returns:

the ResourceBundle for the cacheKey; if someone has put the bundle before this call, the one found in the cache is returned.
putBundleInCache
(ResourceBundle.CacheKey
the key for the resource bundle
cacheKey
,
ResourceBundle
the resource bundle to be put in the cache
bundle
,
ResourceBundle.Control control)

Put a new bundle in the cache.

private static void
protected void
setParent(ResourceBundle
this bundle's parent bundle.
parent
)

Sets the parent bundle of this bundle.

private static void
throwMissingResourceException(String baseName, Locale locale, Throwable cause)

Throw a MissingResourceException with proper message

private static void
trace(String format, Object... params)

private static <T extends Throwable> void
Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait