模块 java.base

类 LocaleServiceProvider

java.lang.Object
java.util.spi.LocaleServiceProvider
已知子类:
BreakIteratorProvider , CalendarDataProvider , CalendarNameProvider , CollatorProvider , CurrencyNameProvider , DateFormatProvider , DateFormatSymbolsProvider , DecimalFormatSymbolsProvider , LocaleNameProvider , NumberFormatProvider , TimeZoneNameProvider

public abstract class LocaleServiceProvider extends Object

这是所有区域设置敏感服务提供者接口 (SPI) 的超类。

locale敏感的服务提供者接口是对应于 java.textjava.util 包中的locale敏感类的接口。这些接口支持构建区域设置敏感对象和检索这些包的本地化名称。 java.textjava.util 包中的locale敏感工厂方法和名称检索方法使用提供者接口的实现来提供对 Java 运行时环境本身支持的locale集之外的locale的支持。

locale敏感服务提供者实现的打包

这些区域设置敏感服务的实现可以通过将它们添加到应用程序的类路径来实现。提供者使用资源目录 META-INF/services 中的提供者配置文件来标识自己,使用完全限定的提供者接口类名作为文件名。该文件应该包含一个完全限定的具体提供者类名列表,每行一个。一行由换行符 ('\n')、回车符 ('\r') 或回车符后紧接着换行符中的任何一个终止。每个名称周围的空格和制表符以及空行都将被忽略。注释字符为'#'('#');在每一行中,第一个注释字符之后的所有字符都将被忽略。该文件必须以 UTF-8 编码。

如果一个特定的具体提供者类在多个配置文件中被命名,或者在同一个配置文件中被多次命名,那么重复的将被忽略。命名特定提供者的配置文件不需要与提供者本身位于同一个 jar 文件或其他分发单元中。提供者必须可以从最初查询以查找配置文件的同一个类加载器访问;这不一定是加载文件的类加载器。

例如,DateFormatProvider 类的实现应采用包含以下文件的 jar 文件的形式:

 META-INF/services/java.text.spi.DateFormatProvider
 
文件 java.text.spi.DateFormatProvider 应该有这样一行:
 com.foo.DateFormatProviderImpl 
 
这是实现 DateFormatProvider 的类的完全限定类名。

调用区域设置敏感服务

java.textjava.util 包中的区域设置敏感工厂方法和名称检索方法在需要支持请求的区域设置时调用服务提供者方法。这些方法首先检查 Java 运行时环境本身是否支持所请求的locale,并在可用时使用它的支持。否则,它们会为适当的接口调用已安装提供程序的isSupportedLocale 方法,以找到支持请求的locale的接口。如果找到这样的提供者,则调用它的其他方法来获取请求的对象或名称。检查locale是否受支持时,默认忽略 locale的扩展。 (如果还应检查locale的扩展,则必须重写 isSupportedLocale 方法。)如果 Java 运行时环境本身和已安装的提供者都不支持所请求的locale,则这些方法会遍历候选locale列表并重复每个locale的可用性检查,直到找到一个匹配项。用于创建候选locale列表的算法与 ResourceBundle 默认使用的算法相同(有关详细信息,请参阅 getCandidateLocales )。即使区域设置是从候选列表中解析出来的,返回请求对象或名称的方法也会使用原始请求的区域设置(包括Locale扩展名)进行调用。 Java 运行时环境必须支持所有区域设置敏感服务的根区域设置,以保证该进程终止。

名称的提供者(但不是其他对象的提供者)被允许为某些名称请求返回 null,即使对于他们声称通过将它们包含在 getAvailableLocales 的返回值中支持的locale也是如此。同样,Java 运行时环境本身可能没有它支持的所有locale的所有名称。这是因为请求名称的对象集可能很大并且会随时间变化,因此完全覆盖它们并不总是可行的。如果 Java 运行时环境或提供程序返回 null 而不是名称,则查找将按上述方式继续进行,就好像该locale不受支持一样。

可以使用 java.locale.providers 系统属性配置区域设置敏感服务的搜索顺序。此系统属性声明用户查找以逗号分隔的区域设置敏感服务的首选顺序。由于此属性值仅在此类初始化时读取和缓存,因此用户应在 java 启动器命令行上指定该属性。不鼓励在运行时使用 System.setProperty(String, String) 设置它,它可能不会影响顺序。

Java Runtime Environment 提供以下四种locale提供程序:

  • “CLDR”:基于 Unicode Consortium 的 CLDR项目 的提供程序。
  • “COMPAT”:表示与 JDK8 之前的 JDK 版本兼容的locale敏感服务(与 JDK8 的“JRE”相同)。
  • “SPI”:表示实现此 LocaleServiceProvider 类的子类的locale敏感服务。
  • “HOST”:在底层操作系统中反映用户自定义设置的提供者。此提供程序可能不可用,具体取决于 Java 运行时环境实现。
  • “JRE”:代表“COMPAT”的同义词。此名称已弃用,将在 JDK 的未来版本中删除。

例如,如果在属性中指定以下内容:

 java.locale.providers=SPI,CLDR,COMPAT
 
首先查找 SPI 提供程序中的区域设置敏感服务。如果所需的区域设置敏感服务不可用,则运行时会按顺序查找 CLDR、COMPAT。

查找首选区域设置提供程序的默认顺序是“CLDR,COMPAT”,因此指定“CLDR,COMPAT”与默认行为相同。需要实现区域设置敏感服务的应用程序必须显式指定“SPI”,以便 Java 运行时从类路径加载它们。

自从:
1.6
  • 构造方法详细信息

  • 方法详情

    • getAvailableLocales

      public abstract Locale [] getAvailableLocales()
      返回此locale服务提供者可以为其提供本地化对象或名称的所有locale的数组。此信息用于组成依赖于locale的服务的 getAvailableLocales() 值,例如 DateFormat.getAvailableLocales()

      此方法返回的数组不应包含两个或更多仅扩展名不同的 Locale 对象。

      返回:
      此locale服务提供者可以为其提供本地化对象或名称的所有locale的数组。
    • isSupportedLocale

      public boolean isSupportedLocale(Locale  locale)
      如果此locale服务提供商支持给定的 locale,则返回 true。给定的 locale 可能包含 扩展名,在确定支持时应将其考虑在内。

      如果给定的 locale 等于 getAvailableLocales() 返回的任何可用的 Locale ,则默认实现返回 true 并忽略给定的 locale 和可用区域设置中的任何扩展。如果这些实现是 Locale 扩展感知的,那么具体的locale服务提供者实现应该覆盖这个方法。例如,DecimalFormatSymbolsProvider 实现将需要检查给定的 locale 中的扩展以查看是否指定了任何编号系统并且可以支持。但是,CollatorProvider 实现可能不受任何特定编号系统的影响,在这种情况下,应忽略编号系统的扩展。

      参数:
      locale - 待测试的 Locale
      返回:
      true 如果此提供商支持给定的 localefalse否则。
      抛出:
      NullPointerException - 如果给定的 localenull
      自从:
      1.8
      参见: