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使用详解相关推荐

  1. Java中JDBC连接数据库详解

    今天动力节点java学院小编分享的是JDBC连接数据库的相关知识,希望通过看过此文,各位小伙伴对DBC连接数据库有所了解,下面就跟随小编一起来看看JDBC连接数据库的知识吧. 一.JDBC连接数据库概 ...

  2. JAVA中的Random详解

    JAVA中的Random详解 首先,在JDK自带的常用的random中有两个,这俩都是产生随机数的,不过一个是util下的random,另外一个是Math下的.我们分别介绍一下 util中的rando ...

  3. java中new关键字详解

    java中new关键字详解 在java中我们可以经常使用new来创建一个对象,但是这对于初学者来说可能只会使用却不能理解new关键字和它的语法 new关键字的语法 注意使用前先导包,一般我们使用ide ...

  4. Java中super关键字详解

    Java中super关键字详解 super有什么用? super什么时候不可以省略呢? super在内存图中是如何存在的呢? super使用时的注意事项 super有什么用? (1)当子类中构造方法第 ...

  5. Java中的byte详解

    Java中的byte详解 介绍 byte,即字节,由8位的二进制组成.在Java中,byte类型的数据是8位带符号的二进制数. 在计算机中,8位带符号二进制数的取值范围是[-128, 127],所以在 ...

  6. Java中Iterator迭代器详解

    目录 一.Java中Iterator迭代器详解 1.为什么需要迭代器 2.迭代器长什么样子 3.如何使用迭代器 使用步骤: 代码演示: 迭代器可以简化为增强型for循环: 4.Iterator与Lis ...

  7. Java 中IO流详解(附实例代码/面试题)

    Java I/O流详解 前言 一.I/O流是什么? 二.IO流分类: 1. 流程图: io流对象 2. io流的优缺点: 3. io 流Java中用途有哪些? 三.一些 io 实例 四.面试题: 前言 ...

  8. 【转载】java中泛型使用详解

    引入 Type接口 Class类 Method类 Field类 ParameterizedType接口 TypeVariable接口 类中定义泛型变量 方法中定义泛型变量 方法中泛型参数和泛型返回值 ...

  9. java 中的vector_详解Java中的Vector

    Vector实现了AbstractList抽象类和List接口,和ArrayList一样是基于Array存储的 Vector 是线程安全的,在大多数方法上存在synchronized关键字 //Vec ...

  10. java中IO流详解

    不断更新中!!! 1.流的定义及分类 流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输操作都是以"流"的方式进行.设备可以是文件,网络,内存等.将数据从 ...

最新文章

  1. mysql数据库增删改实例_Mysql1:数据库表操作,增删改查举例
  2. 「MICCAI 2017」Reading Notes
  3. 在windows中对torch1.7.1版本环境配置
  4. iis授权mysql验证_ASP.NET Web API身份验证和授权
  5. oracle 动态sql列转行_SQL优化笔记分享:34条实用经验可别错过!
  6. python 标准差内数据概率怎么求_Python-统计概率
  7. c语言 在线oj系统,开源的在线评测系统——Vakuum
  8. 图论算法在机试实现中的一些技巧和陷阱
  9. c语言switch自动贩卖机,JAVA程式-自动贩卖机SWITCHampCASE.doc
  10. Redis 经典 必问21问,BAT面试都会问,你会回答吗?
  11. css3mediaquery移动端网页字体适应屏幕代码
  12. Java中集合List,Map和Set的差别
  13. 一起talk C栗子吧(第三十九回:C语言实例--创建一棵二叉树)
  14. 如何在Word中打开公式编辑器
  15. 毛星云Opencv之图像修补综合示例程序
  16. 计算机一级考试题库基础知识,计算机一级考试题库(含答案)
  17. GPS经纬度坐标与XY坐标相互转换的python程序
  18. 汽车用泄露测试系统2022年全球行业分析报告
  19. 【手写dubbo-2】超详细!netty实现群聊、私聊
  20. Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available

热门文章

  1. PMP课程笔记:第7章 项目成本管理
  2. VirtualBox备份Vagrant虚拟机镜像
  3. 保存为UTF8的1byte文字,2byte文字,3byte文字,4byte文字大全
  4. plc控制电机实验报告_基于西门子PLC电动机正反转互锁控制实验报告
  5. 基于单片机的电机转速PID控制
  6. bzoj·入门OJ·统计损失
  7. 不吹不黑聊聊前端框架--尤雨溪Live整理
  8. Java web实习报告
  9. 文件服务器 标签,别再「新建文件夹」了,这个标签管理器可以让你的硬盘更整洁...
  10. 《utils》yaml,yml格式化