Java ResourceBundle案例详解

 更新时间:2021年08月19日 09:09:22   作者:OovEver  
这篇文章主要介绍了Java ResourceBundle案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

JAVA中ResourceBundle使用详解

  • 这个类主要用来解决国际化和本地化问题。国际化和本地化可不是两个概念,两者都是一起出现的。可以说,国际化的目的就是为了实现本地化。比如对于“取消”,中文中我们使用“取消”来表示,而英文中我们使用“cancel”。若我们的程序是面向国际的(这也是软件发展的一个趋势),那么使用的人群必然是多语言环境的,实现国际化就非常有必要。而ResourceBundle可以帮助我们轻松完成这个任务:当程序需要一个特定于语言环境的资源时(如 String),程序可以从适合当前用户语言环境的资源包(大多数情况下也就是.properties文件)中加载它。这样可以编写很大程度上独立于用户语言环境的程序代码,它将资源包中大部分(即便不是全部)特定于语言环境的信息隔离开来。

  • 这使编写的程序可以:

    • 轻松地本地化或翻译成不同的语言
    • 一次处理多个语言环境
    • 以后可以轻松进行修改,以便支持更多的语言环境

    说的简单点,这个类的作用就是读取资源属性文件(properties),然后根据.properties文件的名称信息(本地化信息),匹配当前系统的国别语言信息(也可以程序指定),然后获取相应的properties文件的内容。

    使用这个类,properties需要遵循一定的命名规范,一般的命名规范是: 自定义名语言代码国别代码.properties,如果是默认的,直接写为:自定义名.properties。

    比如:

    myres_en_US.properties
    myres_zh_CN.properties

    myres.properties

    当在中文操作系统下,如果myres_zh_CN.properties、myres.properties两个文件都存在,则优先会使用myres_zh_CN.properties,当myres_zh_CN.properties不存在时候,会使用默认的myres.properties。

    没有提供语言和地区的资源文件是系统默认的资源文件。

    资源文件都必须是ISO-8859-1编码,因此,对于所有非西方语系的处理,都必须先将之转换为Java Unicode Escape格式。转换方法是通过JDK自带的工具native2ascii.

  • ResourceBundle的类层次结构

    这里写图片描述

    PropertyResourceBundle将本地化的文本存储于Java property文件中。

  • 从ResourceBundle中获取值

    • 获取ResourceBundle实例后可以通过下面的方法获得本地化值。
    • getObject(String key);
    • getString(String key);
    • getStringArray(String key);
    • 还可以通过keySet()方法获取所有的key。Set keys = bundle.keySet();
    • 其它ResourceBundle 方法可以通过查看文档获得。
  • 测试及验证

    • 新建4个属性文件

    my_en_US.properties:cancelKey=cancel

    my_zh_CN.properties:cancelKey=\u53D6\u6D88(取消)

    my_zh.properties:cancelKey=\u53D6\u6D88zh(取消zh)

    my.properties:cancelKey=\u53D6\u6D88default(取消default)

    • 获取bundle
    ResourceBundle bundle = ResourceBundle.getBundle("res", new Locale("zh", "CN"));
    • 其中new Locale(“zh”, “CN”)提供本地化信息,上面这行代码,程序会首先在classpath下寻找my_zh_CN.properties文件,若my_zh_CN.properties文件不存在,则取找my_zh.properties,如还是不存在,继续寻找my.properties,若都找不到就抛出异常。

    • 代码

    import javax.annotation.Resource;
    import java.util.Locale;
    import java.util.ResourceBundle;
    
    /**
     * @author OovEver
     * 2018/1/14 22:12
     */
    public class Main {
    
        public static void main(String args[]) {
            ResourceBundle bundle = ResourceBundle.getBundle("my", new Locale("zh", "CN"));
            String cancel = bundle.getString("cancelKey");
            System.out.println(cancel);
    
            bundle = ResourceBundle.getBundle("my", Locale.US);
            cancel = bundle.getString("cancelKey");
            System.out.println(cancel);
    
            bundle = ResourceBundle.getBundle("my", Locale.getDefault());
            cancel = bundle.getString("cancelKey");
            System.out.println(cancel);
    
            bundle = ResourceBundle.getBundle("my", Locale.GERMAN);
            cancel = bundle.getString("cancelKey");
            System.out.println(cancel);
            bundle = ResourceBundle.getBundle("my");
            for (String key : bundle.keySet()) {
                System.out.println(bundle.getString(key));
            }
        }
    }
    • 输出结果

      取消
      cancel
      取消
      取消
      取消

    • 说明:前面三个分别按照zh_CN,US,默认的结果输出,第四个由于我们未定义GERMAN属性文件,这时ResourceBundle为我们提供了一个fallback(也就是一个备用方案),这个备用方案就是根据当前系统的语言环境来得到的本地化信息。所以若是找不到GERMAN的,之后就会去找CHINA了,所以找到了res_zh_CH.properties这个资源包。最后一个是若有多个属性文件,可以按照Map的形式遍历,获得属性文件内的各个值。

到此这篇关于Java ResourceBundle案例详解的文章就介绍到这了,更多相关Java ResourceBundle讲解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java异常 Exception类及其子类(实例讲解)

    Java异常 Exception类及其子类(实例讲解)

    下面小编就为大家带来一篇Java异常 Exception类及其子类(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Java大数据开发Hadoop MapReduce

    Java大数据开发Hadoop MapReduce

    MapReduce的思想核心是“分而治之”,适用于大量复杂的任务处理场景(大规模数据处理场景)Map负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系
    2023-03-03
  • SpringBoot中restTemplate请求存在乱码问题的解决方法

    SpringBoot中restTemplate请求存在乱码问题的解决方法

    这篇文章主要介绍了SpringBoot中restTemplate请求存在乱码问题的解决方法,文中有相关的图文和代码示例供大家参考,对大家的解决问题有一定的帮助,需要的朋友可以参考下
    2024-11-11
  • JavaMail实现发送邮件(QQ邮箱)

    JavaMail实现发送邮件(QQ邮箱)

    这篇文章主要为大家详细介绍了JavaMail实现发送邮件(QQ邮箱),文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 关于消息队列如何保证消息的幂等性

    关于消息队列如何保证消息的幂等性

    这篇文章主要介绍了关于消息队列如何保证消息的幂等性,在分布式系统中,消息队列是一个常用的组件,用于解耦发送者和接收者之间的耦合,需要的朋友可以参考下
    2023-04-04
  • Serializable接口的作用_动力节点Java学院整理

    Serializable接口的作用_动力节点Java学院整理

    这篇文章主要为大家详细介绍了java中Serializable接口的作用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • 浅谈redis key值内存消耗以及性能影响

    浅谈redis key值内存消耗以及性能影响

    这篇文章主要介绍了浅谈redis key值内存消耗以及性能影响,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • JAVA实现JSON后端向前端传递数据

    JAVA实现JSON后端向前端传递数据

    本篇文章主要介绍了JAVA实现JSON后端向前端传递数据,这里整理了详细的代码,具有一定的参考价值,有需要的小伙伴可以参考下。
    2017-03-03
  • java数据结构基础:稀疏数组

    java数据结构基础:稀疏数组

    今天带大家了解一下Java稀疏数组的相关知识,文中有非常详细的介绍及代码示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-08-08
  • java中Servlet监听器的工作原理及示例详解

    java中Servlet监听器的工作原理及示例详解

    这篇文章主要介绍了java中Servlet监听器的工作原理及示例详解。Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。感兴趣的可以来了解一下
    2020-07-07

最新评论