- java.lang.Object
-
- java.util.ResourceBundle.Control
-
- Enclosing class:
- ResourceBundle
public static class ResourceBundle.Control extends Object
ResourceBundle.Control定义了在捆绑包加载过程中由ResourceBundle.getBundle工厂方法调用的一组回调方法。 换句话说,ResourceBundle.Control与加载资源束的工厂方法协同工作。 回调方法的默认实现提供了出厂方法执行default behavior所需的信息。 Note that this class is not supported in named modules.除了回调方法之外,
toBundleName和toResourceName方法的定义主要是为了方便实现回调方法。 但是,可以覆盖toBundleName方法,以在组织和封装本地化资源中提供不同的约定。toResourceName方法是final以避免使用错误的资源和类名称分隔符。两个工厂方法,
getControl(List)和getNoFallbackControl(List),提供ResourceBundle.Control实例,实现默认捆绑包加载过程的常见变体。在返回的格式
getFormats种由返回的方法和候选语言环境getCandidateLocales方法必须全部一致ResourceBundle.getBundle调用了同样的基本包。 否则,ResourceBundle.getBundle方法可能会返回意外的捆绑包。 例如,如果getFormats方法仅对"java.class"的第一次调用ResourceBundle.getBundle"java.properties",而第二次调用仅"java.properties",则第二次调用将返回在第一次调用期间已被缓存的基于类的一个。一个
ResourceBundle.Control实例必须是线程安全的,如果它被多个线程同时使用。ResourceBundle.getBundle不同步调用ResourceBundle.Control方法。 这些方法的默认实现是线程安全的。应用程序可以指定由
getControl工厂方法返回的ResourceBundle.Control实例,或从ResourceBundle.Control的子类创建,以自定义捆绑包加载过程。 以下是更改默认捆绑包加载过程的示例。实施例1
以下代码让
ResourceBundle.getBundle只查找基于属性的资源。import java.util.*; import static java.util.ResourceBundle.Control.*; ... ResourceBundle bundle = ResourceBundle.getBundle("MyResources", new Locale("fr", "CH"), ResourceBundle.Control.getControl(FORMAT_PROPERTIES));鉴于example在ResourceBundle.getBundle描述中的资源束,此ResourceBundle.getBundle调用负载MyResources_fr_CH.properties,其父为MyResources_fr.properties,其父为MyResources.properties。 (MyResources_fr_CH.properties不隐藏,但是MyResources_fr_CH.class是。)实施例2
以下是使用
Properties.loadFromXML加载基于XML的软件包的示例 。ResourceBundle rb = ResourceBundle.getBundle("Messages", new ResourceBundle.Control() { public List<String> getFormats(String baseName) { if (baseName == null) throw new NullPointerException(); return Arrays.asList("xml"); } public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload) throws IllegalAccessException, InstantiationException, IOException { if (baseName == null || locale == null || format == null || loader == null) throw new NullPointerException(); ResourceBundle bundle = null; if (format.equals("xml")) { String bundleName = toBundleName(baseName, locale); String resourceName = toResourceName(bundleName, format); InputStream stream = null; if (reload) { URL url = loader.getResource(resourceName); if (url != null) { URLConnection connection = url.openConnection(); if (connection != null) { // Disable caches to get fresh data for // reloading. connection.setUseCaches(false); stream = connection.getInputStream(); } } } else { stream = loader.getResourceAsStream(resourceName); } if (stream != null) { BufferedInputStream bis = new BufferedInputStream(stream); bundle = new XMLResourceBundle(bis); bis.close(); } } return bundle; } }); ... private static class XMLResourceBundle extends ResourceBundle { private Properties props; XMLResourceBundle(InputStream stream) throws IOException { props = new Properties(); props.loadFromXML(stream); } protected Object handleGetObject(String key) { return props.getProperty(key); } public Enumeration<String> getKeys() { ... } }- API Note:
-
ResourceBundle.Controlis not supported in named modules.如果在命名模块中调用了ResourceBundle.Control的ResourceBundle.getBundle方法,则该方法将抛出一个UnsupportedOperationException。 任何ResourceBundleControlProvider的服务提供商都将在命名模块中被忽略。 - 从以下版本开始:
- 1.6
- 另请参见:
-
ResourceBundleProvider
-
-
Field Summary
Fields Modifier and Type Field 描述 static List<String>FORMAT_CLASS类别List包含"java.class"。static List<String>FORMAT_DEFAULT默认格式为List,其中包含字符串"java.class"和"java.properties",按此顺序。static List<String>FORMAT_PROPERTIES属性格式List包含"java.properties"。static longTTL_DONT_CACHE不缓存加载的资源束实例的生存时间常数。static longTTL_NO_EXPIRATION_CONTROL用于禁用高速缓存中加载的资源束实例的到期控制的生存时间常数。
-
构造方法摘要
构造方法 Modifier Constructor 描述 protectedControl()唯一的构造函数。
-
方法摘要
所有方法 静态方法 接口方法 具体的方法 Modifier and Type 方法 描述 List<Locale>getCandidateLocales(String baseName, Locale locale)返回List的Locale作为baseName和locale候选地区。static ResourceBundle.ControlgetControl(List<String> formats)LocalegetFallbackLocale(String baseName, Locale locale)返回一个Locale作为后备区域设置,用于通过ResourceBundle.getBundle工厂方法进一步查找资源。List<String>getFormats(String baseName)返回List的String其中包含用于为给定的baseName加载资源束的baseName。static ResourceBundle.ControlgetNoFallbackControl(List<String> formats)longgetTimeToLive(String baseName, Locale locale)返回此ResourceBundle.Control下加载的资源束的生存时间(TTL)值。booleanneedsReload(String baseName, Locale locale, String format, ClassLoader loader, ResourceBundle bundle, long loadTime)根据loadTime给出的加载时间或其他一些条件,确定高速缓存中的过期bundle是否需要重新加载。ResourceBundlenewBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload)为给定格式和区域设置的给定捆绑包名称实例化资源包,如有必要,使用给定的类加载器。StringtoBundleName(String baseName, Locale locale)将给定的baseName和locale转换为包名称。StringtoResourceName(String bundleName, String suffix)
-
-
-
字段详细信息
-
FORMAT_DEFAULT
public static final List<String> FORMAT_DEFAULT
默认格式为List,其中包含字符串"java.class"和"java.properties",按此顺序。 这List是不可修改的。- 另请参见:
-
getFormats(String)
-
FORMAT_CLASS
public static final List<String> FORMAT_CLASS
类别List包含"java.class"。 这个List是不可修改的。- 另请参见:
-
getFormats(String)
-
FORMAT_PROPERTIES
public static final List<String> FORMAT_PROPERTIES
属性格式List包含"java.properties"。 这个List是不可修改的。- 另请参见:
-
getFormats(String)
-
TTL_DONT_CACHE
public static final long TTL_DONT_CACHE
不缓存加载的资源束实例的生存时间常数。
-
TTL_NO_EXPIRATION_CONTROL
public static final long TTL_NO_EXPIRATION_CONTROL
用于禁用高速缓存中加载的资源束实例的到期控制的生存时间常数。
-
-
方法详细信息
-
getControl
public static final ResourceBundle.Control getControl(List<String> formats)
返回一个ResourceBundle.Control,其中getFormats方法返回指定的formats。 所述formats必须等于之一FORMAT_PROPERTIES,FORMAT_CLASS或FORMAT_DEFAULT。ResourceBundle.Control这个方法返回的实例是单例和线程安全的。指定
FORMAT_DEFAULT等效于实例化ResourceBundle.Control类,但该方法返回单例。- 参数
-
formats-ResourceBundle.Control.getFormats方法返回的格式 - 结果
-
一个
ResourceBundle.Control支持指定的formats - 异常
-
NullPointerException- 如果formats是null -
IllegalArgumentException- 如果formats未知
-
getNoFallbackControl
public static final ResourceBundle.Control getNoFallbackControl(List<String> formats)
返回一个ResourceBundle.Control,其中getFormats方法返回指定的formats,而getFallbackLocale方法返回null。 所述formats必须等于之一FORMAT_PROPERTIES,FORMAT_CLASS或FORMAT_DEFAULT。ResourceBundle.Control这个方法返回的实例是单例和线程安全的。- 参数
-
formats-ResourceBundle.Control.getFormats方法返回的格式 - 结果
-
一个
ResourceBundle.Control支持指定的formats,没有后退Locale支持 - 异常
-
NullPointerException- 如果formats是null -
IllegalArgumentException- 如果formats未知
-
getFormats
public List<String> getFormats(String baseName)
返回List的Strings,其中包含用于为给定的baseName加载资源束的baseName。ResourceBundle.getBundle工厂方法尝试使用列表中指定的顺序加载格式的资源束。 此方法返回的列表必须至少有一个String。 预定义的格式是"java.class"对于基于类的资源包和"java.properties"为properties-based分的。 以"java."开头的字符串保留用于将来的扩展,不能由应用程序定义的格式使用。返回不可变(不可修改)
List。 但是,返回List不得它已被退回后,突变getFormats。默认实现返回
FORMAT_DEFAULT,以便ResourceBundle.getBundle工厂方法查找基于类的资源束,然后查找基于属性的资源束。- 参数
-
baseName- 资源包的基本名称,一个完全限定的类名 - 结果
-
一个包含
List的String包含用于加载资源束的格式。 - 异常
-
NullPointerException- 如果baseName为空 - 另请参见:
-
FORMAT_DEFAULT,FORMAT_CLASS,FORMAT_PROPERTIES
-
getCandidateLocales
public List<Locale> getCandidateLocales(String baseName, Locale locale)
返回List的Locale作为baseName和locale候选地区。 每次工厂方法尝试找到目标的资源束时,这种方法由ResourceBundle.getBundle工厂方法调用Locale。候选语言环境的序列也对应于运行时资源查找路径(也称为父链 ),如果候选语言环境存在相应的资源束,并且父节点未由加载的资源束本身定义。 列表中的最后一个元素必须是root locale,如果希望将基础包作为父链的终端。
如果给定的区域设置为等于
Locale.ROOT(根区域),一个List只包含根Locale必须返回。 在这种情况下,ResourceBundle.getBundle工厂方法仅加载基础包作为生成的资源包。不要求退回一个不可改变的(不可修改的)
List。 但是,返回List不得它已被退回后,突变getCandidateLocales。默认实现使用下面描述的规则返回一个
List其中包含Locale。 在下面的描述中, L , S , C和V分别表示非空语言,脚本,国家和变体。 例如,[ L , C ]代表一个Locale,它只对语言和国家有非空值。 形式L (“xx”)表示(非空)语言值为“xx”。 对于所有情况,其最终成分值为空字符串的Locales被省略。- 对于具有空脚本值的输入
Locale,通过省略最终组件逐个追加候选人Locale,如下所示:- [ L , C , V ]
- [ L , C ]
- [ L ]
-
Locale.ROOT
- 对于具有非空脚本值的输入
Locale,通过省略最终组件直到语言来追加候选人Locales,然后追加从Locale生成的Locale国家和变式恢复:- [ L , S , C , V ]
- [ L , S , C ]
- [ L , S ]
- [ L , C , V ]
- [ L , C ]
- [ L ]
-
Locale.ROOT
- 对于具有由下划线分隔的多个子标签组成的变体值的输入
Locale,通过逐个省略变体子标记来生成候选人Locale,然后在每次出现Locales之后插入其原始列表中的完整变体值。 例如,如果变体由两个子标签V1和V2组成 :- [ L , S , C , V1 , V2 ]
- [ L , S , C , V1 ]
- [ L , S , C ]
- [ L , S ]
- [ L , C , V1 , V2 ]
- [ L , C , V1 ]
- [ L , C ]
- [ L ]
-
Locale.ROOT
- 中国特殊情况。 输入
Locale具有语言“zh”(中文)和空字符值时,可能会根据国家/地区提供“汉斯”(简体)或“汉特”(繁体)。 当国家是“CN”(中国)或“SG”(新加坡)时,提供“汉斯”。 当国家是“HK”(中国香港特别行政区)时,提供“MO”(中国澳门特别行政区)或“TW”(台湾)“Hant”。 对于所有其他国家或国家/地区为空时,不提供脚本。 例如,对于Locale("zh", "CN"),候选人名单将是:- [ L (“zh”), S (“Hans”), C (“CN”)]
- [ L (“zh”), S (“汉斯”)]
- [ L (“zh”), C (“CN”)]
- [ L (“zh”)]
-
Locale.ROOT
Locale("zh", "TW"),候选人名单将是:- [ L (“zh”), S (“Hant”), C (“TW”)]
- [ L (“zh”), S (“Hant”)]
- [ L (“zh”), C (“TW”)]
- [ L (“zh”)]
-
Locale.ROOT
- 挪威特殊情况。
Locale("no", "NO", "NY")和Locale("nn", "NO")代表挪威尼诺斯克。 当语言环境的语言为“nn”时,标准候选列表生成最多为[ L (“nn”)],然后添加以下候选:- [ L (“否”), C (“NO”), V (“NY”)]
- [ L (“否”), C (“否”)]
- [ L (“否”)]
-
Locale.ROOT
Locale("no", "NO", "NY"),则首先将其转换为Locale("nn", "NO"),然后按照上述步骤进行操作。此外,Java将“no”语言视为NorwegianBokmÃ¥l“nb”的同义词。 除了单个案例
Locale("no", "NO", "NY")(上面的处理),当输入Locale具有语言“否”或“nb”时,具有语言代码“否”和“nb”的候选人Locales被交织,首先使用所请求的语言,然后使用其代名词。 例如,Locale("nb", "NO", "POSIX")生成以下候选列表:- [ L (“nb”), C (“NO”), V (“POSIX”)]
- [ L (“否”), C (“否”), V (“POSIX”)]
- [ L (“nb”), C (“NO”)]
- [ L (“否”), C (“否”)]
- [ L (“nb”)]
- [ L (“否”)]
-
Locale.ROOT
Locale("no", "NO", "POSIX")将生成相同的列表,除了具有“否”的区域设置将出现在具有“nb”的相应语言环境之前。
默认实现使用一个
ArrayList,该替换实现可能会在将其返回给调用者之前进行修改。 但是,一个子类在getCandidateLocales返回后不能修改它。例如,如果给定的
baseName是“消息”,给定的locale是Locale("ja", "", "XX"),则List的Locales:Locale("ja", "", "XX") Locale("ja") Locale.ROOT被退回 并且如果找到“ja”和“”Locale的资源束,则运行时资源查找路径(父链)是:Messages_ja -> Messages- 参数
-
baseName- 资源包的基本名称,一个完全限定的类名 -
locale- 需要资源束的区域设置 - 结果
-
一个
List候选人Locales给定的locale - 异常
-
NullPointerException- 如果baseName或locale是null
- 对于具有空脚本值的输入
-
getFallbackLocale
public Locale getFallbackLocale(String baseName, Locale locale)
返回一个Locale,以作为后备区域设置,以进一步的资源束搜索通过ResourceBundle.getBundle工厂方法。 每次当没有为baseName和locale找到生成的资源束时,从工厂方法调用此方法,其中locale是ResourceBundle.getBundle的参数或此方法返回的以前的后备区域设置。如果不需要进一步的后备搜索,该方法返回
null。如果给定的
locale不是默认的,默认实现将返回defaultLocale。 否则返回null。- 参数
-
baseName- 资源包的基本名称,ResourceBundle.getBundle无法找到任何资源束(基本包除外)的完全限定类名称, -
locale-Locale,其中ResourceBundle.getBundle无法找到任何资源束(基本包除外) - 结果
-
一个
Locale用于回退搜索,或null如果没有进一步的回退搜索是期望的。 - 异常
-
NullPointerException- 如果baseName或locale是null
-
newBundle
public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload) throws IllegalAccessException, InstantiationException, IOException
为给定格式和区域设置的给定捆绑包名称实例化资源包,如有必要,使用给定的类加载器。 如果给定参数没有可用的资源束,此方法返回null。 如果资源束由于意外错误而无法实例化,则必须通过抛出Error或异常来报告错误,而不是简单地返回null。如果
reload标志为true,则表示此方法正在调用,因为先前加载的资源包已过期。- 实现要求:
-
命名模块中的资源束符合
Module.getResourceAsStream规定的封装规则。 当与资源束对应的资源文件的包无条件打开时,可以访问给定类加载器可见的命名模块中的资源束。默认实现如下实例化一个
ResourceBundle。- 捆绑名称是通过调用
toBundleName(baseName, locale)获得的。 - 如果
format是"java.class",则由包名称指定的Class将加载给定的类加载器。 如果找到并可访问Class,则ResourceBundle被实例化。 如果bundle类文件的包无条件地打开,则可以访问资源包; 否则,将抛出IllegalAccessException。 请注意,在此默认实现中加载基于类的资源束时,reload标志将被忽略。 - 如果
format是"java.properties",则调用toResourceName(bundlename, "properties")获取资源名称。 如果reload是true, 则会调用load.getResource获取一个URL来创建一个URLConnection。 这个URLConnection用于disable the caches的底层资源加载层,并且用于get anInputStream。 否则,loader.getResourceAsStream被称为获得一个InputStream。 然后,PropertyResourceBundle用InputStream。 - 如果
format既不是"java.class"也不是"java.properties",则抛出一个IllegalArgumentException。
- 捆绑名称是通过调用
- 参数
-
baseName- 资源包的基础包名称,一个完全限定的类名 -
locale- 资源束应实例化的区域设置 -
format- 要加载的资源束格式 -
loader- 用于加载捆绑的ClassLoader -
reload- 表示捆绑重新加载的标志;true如果重新加载过期的资源束,否则为false - 结果
-
资源束实例,或
null如果没有找到。 - 异常
-
NullPointerException-如果bundleName,locale,format,或loader为null,或者如果null被返回toBundleName -
IllegalArgumentException- 如果format未知,或者如果为给定参数找到的资源包含格式错误的数据。 -
ClassCastException- 如果加载的类不能转换为ResourceBundle -
IllegalAccessException- 如果类或其nullary构造函数不可访问。 -
InstantiationException- 如果类的实例化由于某种其他原因而失败。 -
ExceptionInInitializerError- 如果由此方法引发的初始化失败。 -
SecurityException- 如果存在安全管理器,并且新实例的创建被拒绝。 详见Class.newInstance()。 -
IOException- 如果使用任何I / O操作读取资源时发生错误 - 另请参见:
-
ResourceBundleProvider.getBundle(String, Locale)
-
getTimeToLive
public long getTimeToLive(String baseName, Locale locale)
返回此ResourceBundle.Control下加载的资源束的生存时间(TTL)值。 积极的生存时间值指定捆绑可以保留在缓存中的毫秒数,而不会根据构建它的源数据进行验证。 值0表示每次从高速缓存检索时必须验证捆绑包。TTL_DONT_CACHE指定加载的资源束不会放在缓存中。TTL_NO_EXPIRATION_CONTROL指定将加载的资源束放在没有到期控制的高速缓存中。该过期仅影响
ResourceBundle.getBundle工厂方法的捆绑ResourceBundle.getBundle载过程。 也就是说,如果工厂方法在缓存中找到已经过期的资源束,则工厂方法调用needsReload方法来确定是否需要重新加载资源包。 如果needsReload返回true,缓存的资源束实例将从高速缓存中删除。 否则,实例将保留在缓存中,并使用此方法返回的新TTL值进行更新。由于运行时环境的内存限制,所有缓存的资源包都将从高速缓存中删除。 返回一个大的正值并不意味着在缓存中锁定加载的资源束。
默认实现返回
TTL_NO_EXPIRATION_CONTROL。- 参数
-
baseName- 指定到期值的资源束的基本名称。 -
locale- 指定到期值的资源束的区域设置。 - 结果
-
缓存中的时间(0或从缓存时间的正毫秒偏移量)到达加载的捆绑包已过期,
TTL_NO_EXPIRATION_CONTROL禁用过期控制,或TTL_DONT_CACHE禁用缓存。 - 异常
-
NullPointerException- 如果是baseName或locale是null
-
needsReload
public boolean needsReload(String baseName, Locale locale, String format, ClassLoader loader, ResourceBundle bundle, long loadTime)
根据loadTime给出的加载时间或其他一些标准,确定高速缓存中的过期bundle是否需要重新加载。 如果需要重新加载,该方法返回true;false否则。loadTime是自CalendarEpoch以来的毫秒偏移量。调用
ResourceBundle.getBundle工厂方法在用于其当前调用的ResourceBundle.Control实例上调用此方法,而不是在最初加载资源束的调用中使用的实例。默认实现将比较
loadTime和资源束的源数据的最后修改时间。 如果自loadTime确定源数据已被修改,则返回true。 否则返回false。 该实现假设给定的format与其文件后缀相同的字符串,如果它不是默认格式"java.class"或"java.properties"。- 参数
-
baseName- 资源束的基础包名称,完全限定类名称 -
locale- 资源束应实例化的区域设置 -
format- 要加载的资源束格式 -
loader- 用于加载捆绑的ClassLoader -
bundle- 缓存中已过期的资源束实例 -
loadTime-bundle加载并放入缓存的时间 - 结果
-
true如果过期的包需要重新加载; 否则为false。 - 异常
-
NullPointerException-如果baseName,locale,format,loader,或bundle为null
-
toBundleName
public String toBundleName(String baseName, Locale locale)
将给定的baseName和locale转换为包名称。 这种方法是从默认实现的newBundle和needsReload方法中调用的。此实现返回以下值:
baseName + "_" + language + "_" + script + "_" + country + "_" + variant其中language,script,country,并variant是语言,脚本,国家和变量值locale分别。 最后的组件值为空字符串与前面的“_”一起被省略。 当脚本为空时,脚本值将与前面的“_”一起被省略。 如果所有值都为空字符串,则返回baseName。例如,如果
baseName为"baseName"而locale为Locale("ja", "", "XX"),则返回"baseName_ja_ _XX"。 如果给定的区域设置为Locale("en"),则返回"baseName_en"。覆盖此方法允许应用程序在本地化资源的组织和打包中使用不同的约定。
- 参数
-
baseName- 资源束的基本名称,一个完全限定的类名 -
locale- 应为其加载资源束的区域设置 - 结果
- 资源束的包名称
- 异常
-
NullPointerException- 如果是baseName或locale是null - 另请参见:
-
AbstractResourceBundleProvider.toBundleName(String, Locale)
-
toResourceName
public final String toResourceName(String bundleName, String suffix)
所述给定转换bundleName由所要求的形式ClassLoader.getResource通过更换所有出现的方法'.'在bundleName与'/'和追加'.'和给定的文件suffix。 例如,如果bundleName为"foo.bar.MyResources_ja_JP"而suffix为"properties",则返回"foo/bar/MyResources_ja_JP.properties"。- 参数
-
bundleName- 包名称 -
suffix- 文件类型后缀 - 结果
- 转换的资源名称
- 异常
-
NullPointerException- 如果bundleName或suffix为null
-
-