[置顶] 深入ResourceBundle
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
(1) resource.zh_CN.properties : 中文的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的文件, 很是令人抓狂。
主要的原因就是ClassLoader 不对 ,有空接着写 :-)
[置顶] 深入ResourceBundle的更多相关文章
- 在UWP中页面滑动导航栏置顶
最近在研究掌上英雄联盟,主要是用来给自己看新闻,顺便copy个界面改一下段位装装逼,可是在我copy的时候发现这个东西 当你滑动到一定距离的时候导航栏会置顶不动,这个特性在微博和淘宝都有,我看了@ms ...
- WinFrom窗体始终置顶
调用WindowsAPI使窗体始终保持置顶效果,不被其他窗体遮盖: [DllImport("user32.dll", CharSet = CharSet.Auto)] privat ...
- winform窗体置顶
winform窗体置顶 金刚 winform 置顶 今天做了一个winform小工具.需要设置置顶功能. 网上找了下,发现百度真的很垃圾... 还是必应靠谱些. 找到一个可以链接. https://s ...
- 自定义置顶TOP按钮
简述一下,分为三个步骤: 1. 添加Html代码 2. 调整Css样式 3. 添加Jquery代码 具体代码如下: <style type="text/css"> #G ...
- ahk之路:利用ahk在window7下实现窗口置顶
操作系统:win7 64位 ahk版本:autohotkey_L1.1.24.03 今天安装了AutoHotkey_1.1.24.03.SciTE.PuloversMacroCreator,重新开始我 ...
- Qt中让Qwidget置顶的方法
一般来是说窗体置顶和取消只要 setWindowFlags(Qt::WindowStaysOnTopHint); setWindowFlags(Qt::Widget); 要 ...
- js之滚动置顶效果
0.js获取高度 ? 1 2 3 4 5 6 document.all // 只有ie认识 document.body.clientHeight // 文档的高,屏幕 ...
- Javascript笔记----实现Page页面右下角置顶按钮.
从用博客开始,发现博客园中很多博友的博客中在Page右下角都有个图标,不论屏幕怎么拉伸,都始终停留在右下角.点击后页面置顶.后面想想写一个Demo来实现这种效果吧. 一. 图标右下角固定. 1.SS ...
- JavaScript学习笔记-元素在滚动条滑动一定高度后自动置顶
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
随机推荐
- COM编程之IUnknown接口
COM组件其实是一种特殊的类,遵循一个统一的标准,使到各个软件都可以通过某种方法访问这个类的函数和方法,也就可以做到组件通用. com就是统一的标准--通过接口来调用com组件.接口是你的com组件能 ...
- Eclipse 代码提示不显示的问题
在备份Android SDK和Eclipse的时候出了问题,然后只能重新下载,SDK下得我都要吐血了,超慢.然后,我发现Eclipse有了新版本的,于是就下载了个新版的,结果出了问题了.所有的Andr ...
- GDI+入门——带你走进Windows图形的世界
一.GDI+基础 1.GDI+简单介绍 GDI+是微软的新一代二维图形系统,它全然面向对象,要在Windows窗口中显示字体或绘制图形必需要使用GDI+.GDI+提供了多种画笔.画刷.图像等图形对象, ...
- .Net将多个DLL打包为一个DLL(ILMerge)
在做.Net底层编码过程中,为了功能独立,有可能会生成多个DLL,引用时非常不便.这方面微软提供了一个ILMerge工具原版DOS工具,可以将多个DLL合并成一个.下载完成后需要安装一下,然后通过DO ...
- 在 Android 中 Intent 的概念及应用
一.显式Intent: startActivity(new Intent(MainActivity.this, 类名.class)); 二.隐式Intent: 1.在AndroidManiFest ...
- Cramfs、JFFS2、YAFFS2的全面对比
Cramfs.JFFS2.YAFFS2的全面对比http://blog.csdn.net/daofengdeba/article/details/7721340 由于嵌入式系统自身存在一些特殊要求,使 ...
- Yii2归档安装法
打开dos 操作命令 1.先把init.bat 拖到dos命令窗口 打开 (如果拖过去没打开 可以回车Enter一下) 这里需要注意一下 下图红圈中是两种环境 0->开发环境 1-&g ...
- Oracle中的EXCEPTION
Oracle系统预定义的异常 比如:SELF_IS_NULL.VALUE_ERROR.ZERO_DIVIDE等Oracle中自带的异常类型 使用方法: DECLARE V_Result ); BEGI ...
- python成长之路13
一:SqlAlchemy ORM ORM:Object Relational Mapping 对象关系映射是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换 SQLAlchemy是 ...
- vagrant 入门3
创建第一个Vagrant虚拟环境以及工程(续集): (8) Provisioning: 通常情况下Box只做最基本的设置,而不是一次到位的设置好所有的环境.Vagrant通常使用chef或者Puppe ...