深入ResourceBundle

深入ResourceBundleResourceBund 是 java 开发中非常实用的一个类 主要用来处理应用程序多语言这样的国际化问题 如果你的应用程序如果有国际化的需求 可以考虑使用 ResourceBund 你要做的就是给出满足特定格式的 Properties 文件 例如 resource propretiesre zh CN propertiesre ja JP propertie

ResourceBundle是java开发中非常实用的一个类,主要用来处理应用程序多语言这样的国际化问题。

如果你的应用程序如果有国际化的需求,可以考虑使用ResourceBundle, 你要做的就是给出满足特定格式的Properties 文件,例如

resource.propreties

resource_zh_CN.properties

resource_ja_JP.properties.

然后应用程序使用ResourceBundle.getBundle(“resource”, locale) 就可以自动的搜索的相应Locale的Properties 文件。

虽然看起来很方便,但使用起来需要注意两个问题: 1 Properties 文件的搜索次序, 2.  决定是否能找到Properties 文件的ClassLoader , 这也是很多初学者遇到的问题

1.  搜索次序。

先来看个例子,假设你的系统只有两个Properties

(2) resource.properties  : 英文的Properties

假设你Java 的default locale是zh_CN,  如果你调用 ResourceBundle.getBundle(“resource”, Locale.US) , 你觉得系统会使用哪一个文件中的内容?

很多人会觉得会使用resource.properties 中的内容, 但实际上不是这样的,当你传入一个Locale.US 给ResourceBundle的时候 ,  ResourceBundle的搜索次序是这样:
(1) resource_en_US.properties     — 没找到
(2) resource_en.properties           — 还是没找到
(3) resource_zh_CN.properties  —- default locale, 找到了
(4) resource_zh_properties      
(5) resource.properties              






注意,ResourceBundle会自动的加上一个default locale 即 zh_CN 来搜索

系统没有找到xxxx__en_US.properties,  也没有找到xxx_en.properties, 而是找到了xxx_zh_CN.properties, 就会使用其中的内容, 所以你看的的是中文的结果。

实际上ResourceBundle 搜索结束以后,会建立一个ResourceBundle 对象的Chain, 对于上面的例子会是这样:

ResourceBundle_2  [locale=zh_CN , parent = ResourceBundle_1]

ResourceBundle_1 [locale = empty parent = null]

你可能要问,这个链表中问什么没有en_US,en 和zh相关的信息?   这是因为他们相关的Properties 不存在, 没有必要加入这个链表中。

如果你的应用程序访问resource文件的一个值得时候, 系统会先在ResourceBundle_2[Locale=zh_CN] 这个对象中找, 如果找到,直接返回相应的值

如果没有找到,顺着parent 即ResourceBundle_1继续寻找, 如果还没有找到,只好返回null 了, 因为没有parent 了

2. ClassLoader

这个也是经常出问题的地方, 很多时候当你准备好各种Locale 的Properties 文件, 调用ResourceBundle.getBundle(“resource”, Locale.US) 时,系统总是告诉你, 找不到resource_en_US的文件, 很是令人抓狂。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177229.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午8:00
下一篇 2026年3月26日 下午8:00


相关推荐

  • ORACLE恢复数据

    ORACLE恢复数据ORACLE恢复删除表或表记录一:表的恢复对误删的表,只要没有使用PURGE永久删除选项,那么从flashback区恢复回来希望是挺大的。一般步骤有:1、从flashback里查询被删除的表

    2022年7月3日
    24
  • mybatis 创建SqlSessionFactory

    mybatis 创建SqlSessionFactory创建SqlSessionFactory有两种方式:一种是通过XML,另一种是通过Java代码。Stringresource="org/mybatis/example/mybatis-config.xml";InputStreaminputStream=Resources.getResourceAsStream(resource);SqlSessionFactorysqlSess…

    2022年5月5日
    56
  • python3.9多线程_python创建多线程

    python3.9多线程_python创建多线程什么是线程?线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其

    2022年7月28日
    8
  • 2020 IDEA安装教程

    2020 IDEA安装教程IDEA 安装教程 1 下载 IDEA 首先在官网下载 IDEA 官网下载地址为 IDEA 下载地址我这里选择的是 Ultimate 版本 2 安装 IDEA 双击刚才下载好的 IDEA 安装包进行安装 我把安装路径改为了我在 D 盘选择的路径点击 Next 然后点击 Install 进行安装安装过程安装成功 3 IDEA 配置启动 IDEA 此时需要激活 我之前申请的教育账号还可以用就直接使用的教育账

    2026年3月17日
    2
  • 可变形卷积网络

    可变形卷积网络1 什么是可变形卷积 可变形卷积是指卷积核在每一个元素上额外增加了一个参数方向参数 这样卷积核就能在训练过程中扩展到很大的范围 注意 这里有一个非常非常非常容易混淆的点 所谓的 deformable 到底 deformable 在哪 很多人可能以为 deformableco 学习的是可变形的 kernel 其实不是不是不是 本文并不是对 kernel 学习 offset 而是对 feature 的每个位置学习一个 offset a 是传统的标准卷积核 尺寸为 3×3 图中绿色的点 b 就是我们今天要谈论的可变形卷

    2026年3月17日
    2
  • quotename 和 stuff[通俗易懂]

    quotename 和 stuff[通俗易懂]1、QUOTENAME返回带有分隔符的Unicode字符串,分隔符的加入可使输入的字符串成为有效的Microsoft®SQLServer™分隔标识符。语法QUOTENAME(character_string[,quote_character])参数{character}[…n]Unicode字符数据字符串。character_s

    2022年7月25日
    17

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号