ResourceBundle.getBundle()来读取自定义的properties配置文件

简介: ResourceBundle.getBundle()来读取自定义的properties配置文件
public class CreateHbaseTableDemo {
    public static void main(String[] args) {
        ResourceBundle resourceBundle= ResourceBundle.getBundle("hbase.properties");
        String port = resourceBundle.getString("zookeeperPort");
        String threadMax = resourceBundle.getString("threadMax");
        String keyValueMaxSize = resourceBundle.getString("KeyValueMaxSize");
        System.out.println(port);
        System.out.println(threadMax);
        System.out.println(keyValueMaxSize);
 
 
    }
}

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的类层次结构



image.png

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));
        }
    }
}


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

相关文章
|
生物认证
第二轮学习笔记: 扫描工具 -- nmap指纹识别与探测
第二轮学习笔记: 扫描工具 -- nmap指纹识别与探测
526 0
|
消息中间件 Java 物联网
一文搞懂MQTT,如何在SpringBoot中使用MQTT实现消息的订阅和发布
之前介绍了RabbitMQ以及如何在SpringBoot项目中整合使用RabbitMQ,看过的朋友都说写的比较详细,希望再总结一下目前比较流行的MQTT。所以接下来,就来介绍什么MQTT?它在IoT中有着怎样的作用?如何在项目中使用MQTT?
19805 63
一文搞懂MQTT,如何在SpringBoot中使用MQTT实现消息的订阅和发布
|
Java
Jstack 查看线程状态及定位占用 cpu 较高的 java 线程
Jstack 查看线程状态及定位占用 cpu 较高的 java 线程
1377 2
|
Cloud Native Apache 流计算
资料合集|Flink Forward Asia 2024 上海站
Apache Flink 年度技术盛会聚焦“回顾过去,展望未来”,涵盖流式湖仓、流批一体、Data+AI 等八大核心议题,近百家厂商参与,深入探讨前沿技术发展。小松鼠为大家整理了 FFA 2024 演讲 PPT ,可在线阅读和下载。
8996 18
资料合集|Flink Forward Asia 2024 上海站
|
12月前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
10870 5
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
存储 Ubuntu 数据安全/隐私保护
|
数据可视化 关系型数据库 MySQL
【MySQL】MySQL8.0 创建用户及授权 - 看这篇就足够了
本文介绍了在MySQL 8.0+版本中创建和管理用户的详细步骤,包括通过命令行进入MySQL、创建数据库、用户及授权等操作,并提供了具体命令示例。适合初学者参考学习,帮助实现系统的权限管理和安全控制。
7793 3
【MySQL】MySQL8.0 创建用户及授权 - 看这篇就足够了
|
Java API
【Java】已解决java.lang.NoSuchMethodException异常
【Java】已解决java.lang.NoSuchMethodException异常
1918 0
|
SQL 开发框架 .NET
聊聊 System.Linq.Dynamic,以及分享一个使用 System.Linq.Dynamic 扩展 LINQ 查询的详细例子
聊聊 System.Linq.Dynamic,以及分享一个使用 System.Linq.Dynamic 扩展 LINQ 查询的详细例子
439 0
|
SpringCloudAlibaba 前端开发 Java
SpringBoot整合Nacos自动刷新配置
Nacos作为SpringBoot服务的注册中心和配置中心。 在NacosServer中修改配置文件,在SpringBoot不重启的情况下,获取到修改的内容。 本例将在配置文件中配置一个 cml.age=100 的配置项,程序中编写一个方法读取配置文件,并通过 Get--->/test/age 接口提供给浏览器访问。 若配置文件中的 age 修改为 200 ,不用重新启动程序,直接访问 /test/age 接口,将获取到最新的值 200 若配置文件中没有age 的配置项,或干脆没有 cml 的配置项,访问 /test/age 接口将返回默认的值 18
1458 0