国际化&&加载.properties配置文件的方式

国际化与格式化

即使再小的帆也能远航~

一.内容

概念

java国际化思路

java支持的国家和语言

完成java程序国际化

Properties集合

加载.properties配置文件的方式

二.目录

概念

国际化是指应用程序运行时,可根据客户端请求来自的国家/地区、语言的不同而显示不同的界面。例如,如果请求来自中文操作系统的客户端,则应用程序中的各个提示信息和帮助等都使用中文文字;如果客户端使用英文操作系统,则应用程序能自动识别,并做出英文的响应。

java国际化思路

Java程序的国际化思路是将程序中的标签、提示等信息放在资源文件中,程序需要支持哪些国家、语言环境,就对应提供相应的资源文件。

Java程序的国际化主要通过三个类来完成:
1、java.util.ResourceBundle:用于加载国家、语言资源包
2、java.util.Locale:用于封装特定的国家/区域、语言环境。
3、java.text.MessageFormat:用于格式化带占位符的字符串。

为了实现程序的国际化,必须先提供程序所需的资源文件。资源文件的内容时很多key-value对,其中key是程序使用的部分,而value则是程序界面的显示字符串

资源文件的命名可以有如下三种形式:
1、baseName_language_country.properties
2、baseName_language.properties
3、baseName.properties
其中baseName是资源文件的基本名,可随意指定,而language和country都不可以随意变化而必须是Java所支持的语言和国家。

java支持的国家和语言

Java支持绝大部分的国家和语言,如果需要获取Java所支持的国家和语言,则可调用Locale类的getAvailableLocales()方法,该方法返回个Locale数组,该数组包含了Java所支持的国家和语言。

Local的构造方法
Locale(String language) 
          根据语言代码构造一个语言环境。 
Locale(String language, String country) 
          根据语言和国家/地区构造一个语言环境。 
Locale(String language, String country, String variant) 
          根据语言、国家/地区和变量构造一个语言环境 
Local的常用方法
String getCountry() 
返回此语言环境的国家/地区代码,将为空字符串或大写的 ISO 3166 两字母代码。
String getLanguage() 
返回此语言环境的语言代码,可以是空字符串或小写的 ISO 639 代码。
String getDisplayLanguage() 
返回适合向用户显示的语言环境语言名。 
String getDisplayCountry() 
返回适合向用户显示的语言环境国家/地区名
static Locale[] getAvailableLocales() 
返回所有已安装语言环境的数组。//静态的!! 
static Locale getDefault() 
获取系统默认的国家/语言环境//静态的!!!
示例
public class LocalDemo {
    public static void main(String[] args) {
        //Local对象封装了语言和国家信息
        Locale[] locales = Locale.getAvailableLocales();
        for (Locale locale : locales) {
            System.out.println(locale.getLanguage()+"语言信息:"+ locale.getDisplayLanguage());
            System.out.println(locale.getCountry()+"国家信息:"+ locale.getDisplayCountry());
        }
    }
}

//结果
语言信息:
国家信息:
ar语言信息:阿拉伯文
AE国家信息:阿拉伯联合酋长国
ar语言信息:阿拉伯文
JO国家信息:约旦
ar语言信息:阿拉伯文
SY国家信息:叙利亚
hr语言信息:克罗地亚文
.................
.................

完成java程序国际化

国际化是指应用程序运行时,可根据客户端请求来自的国家/地区、语言的不同而显示不同的界面。

比如做一个中英双版本的网站~

需要创建两个properties文件,把不同的标签存入properties文件(properties文件是常用的三大配置文件(.properties; .xml; .yaml)之一,是一种保存键值对的文件,每行一个键值对对象.形如: key=value)

  1. 创建另外一个类路径的文件夹:配置文件夹,来存放properties文件(不要将properties文件放在src目录下,src也是类路径的一个文件夹,但src下的
    java文件会被编译,是用来放类文件的)
    具体做法(idea为例):

    1. 项目名右键–>new–>Directory,取名为config;(此时就是一个普通文件夹)
    2. config右键–>Mark Directory as–>Resource Root;(变成类路径文件夹)
  2. 在国际化中,.properties文件是用来做国际化资源文件的. 存放不同国家与地区语言下的一些字符串信息.
    命名方式:

    基础名_语言名_地区.properties
    
  3. 创建一个.properties文件,存放某一个国家的语言,

    具体做法:
    config右键–>new–>properties–>命名

    # my_en_US
    username=Username
    password=Password
    index=Index
    
    # my_zh_CN.properties
    username=用户名
    password=密码
    index=首页
    

    注:如果config右键–>new的时候没有找到properties这个模板,先建这个模板:
    File–>settings–>Editor–>File and Code Templates–>在第一个Files下点"+“号–>Name, Extension都写"properties”–>两个方框勾对号–>Apply,Ok

  4. 用java代码演示(并没有实际效果,因为实际效果是由用户在页面点)

    public class ResourceBundle {
        public static void main(String[] args) {
            Locale localeCn = new Locale("zh", "CN");
            Locale localeUs = new Locale("en", "US");
            java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("my", localeCn);
            String username = bundle.getString("username");
            System.out.println(username);
        }
    }
    
    //结果
    用户名
    
    Process finished with exit code 0
    

Properties集合

Properties集合是唯一一个和IO流相结合的集合

  • Properties 类表示了一个持久的属性集。Properties可保存在流中或从流中加载。继承了Hashtable<k,v>.

  • 属性列表中每个键及其对应值都是一个字符串。properties集合是一个双列集合,key和value默认都是字符串

  • 常用构造方法

    Properties() 
    创建一个无默认值的空属性列表。
    
  • 常用方法

    void load(InputStream inStream) 
    从输入流中读取属性列表(键和元素对)。 
    //把硬盘中的文件(键值对),读取到集合中使用
        
    void load(Reader reader) 
    按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。 
    //把硬盘中的文件(键值对),读取到集合中使用
    
    void store(OutputStream out, String comments) 
    以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。
    //将集合中的临时数据,持久化写入硬盘中存储
        
    void store(Writer writer, String comments) 
    以适合使用 load(Reader) 方法的格式,将此 Properties 表中的属性列表(键和元素对)写入输出字符。 
    //将集合中的临时数据,持久化写入硬盘中存储
        
        
    //操作字符串的特有方法
        
    Object setProperty(String key, String value) 
    调用 Hashtable 的方法 put 
        
    String getProperty(String key) 
    用指定的键在此属性列表中搜索属性 //通过key找到value
        
    Set<String> stringPropertyNames() 
    返回此属性列表中的键集,其中该键及其对应值是字符串
    //相当于Map集合的Keyset集合
    

    代码示例

    public class PropertiesDemo {
        public static void main(String[] args) {
            //创建Properties集合对象
            Properties prop=new Properties();
            //使用setProperty方法往集合中添加数据,key,value只能是字符串
            prop.setProperty("山东", "济南");
            prop.setProperty("河北","石家庄");
            prop.setProperty("西藏","拉萨");
            prop.setProperty("中国","北京");
            //使用stringPropertyName将Properties集合中的key拿出,存储到set集合中
            Set<String> set = prop.stringPropertyNames();
            //遍历set集合,取出每一个key
            for (String key : set) {
                //使用getProperty方法通过key获取value
                String value = prop.getProperty(key);
                System.out.println(key+"-->"+value);
            }
        }
    }
    
    //结果
    中国-->北京
    河北-->石家庄
    西藏-->拉萨
    山东-->济南
    
    Process finished with exit code 0
    
  • properties集合中的store方法

    void store(OutputStream out, String comments)
    void store(Writer writer, String comments) 
    OutputStream out :字节输出流,不能写中文
    Writer writer :字符输出流,可以写中文
    String comments:注释,用来解释保存的文件是做什么用的
                    不能使用中文,会产生乱码.默认是Unicode编码
                    一般使用""全空字符
    

    使用步骤:

    1. 创建Properties集合对象
    2. 创建字节输出流或字符输出流对象,构造方法中绑定要输出的目的地
    3. 使用Properties集合中的store方法,把集合中的临时数据,持久化写入到硬盘中存储
    4. 释放资源

    代码示例:

    public class PropertiesDemo {
        public static void main(String[] args) throws IOException {
            //1.创建Properties集合对象,添加数据
            Properties prop=new Properties();
            prop.setProperty("山东", "济南");
            prop.setProperty("河北","石家庄");
            prop.setProperty("西藏","拉萨");
            prop.setProperty("中国","北京");
           //2.创建字节输出流或字符输出流对象,构造方法中绑定要输出的目的地
            FileWriter fw = new FileWriter("data1.txt");
            //3.使用Properties集合中的store方法,把集合中的临时数据,持久化写入到硬盘中存储
            prop.store(fw,"sava data");
            //4.释放资源
            fw.close();
        }
    }
    
    
    //结果
    
    Process finished with exit code 0
    //打开data1.txt看一看
    
    #sava data
    #Thu Aug 19 23:59:22 CST 2021
    中国=北京
    西藏=拉萨
    河北=石家庄
    山东=济南
    
  • properties集合中的load方法

    void load(InputStream inStream) 
    void load(Reader reader) 
    InputStream inStream:字节输入流,不能读取含有中文的键值对
    Reader reader: 字符输入流,能读取含有中文的键值对
    

    使用步骤:

    1. 创建Properties集合对象
    2. 使用properties集合对象中的方法load读取保存键值对的文件
    3. 遍历properties集合

    注意:

    1. 存储键值对的文件中,键与值默认的连接符号可以使用=,空格(其他字符)
    2. 存储键值对的文件中,可以使用#进行注释,该注释的键值对不会再被读取
    3. 存储键值对的文件中,键与值默认的都是字符串,不用再加引号

    代码示例:

    public class PropertiesDemo {
        public static void main(String[] args) throws IOException {
            //1.创建Properties集合对象,添加数据
            Properties prop=new Properties();
           //2.使用properties集合对象中的方法load读取保存键值对的文件
            prop.load(new FileReader("data1.txt"));
            //遍历properties集合
            Set<String> set = prop.stringPropertyNames();
            for (String key : set) {
                String value = prop.getProperty(key);
                System.out.println(key+"<--"+value);
            }
        }
    }
    
    //结果:
    中国<--北京
    西藏<--拉萨
    河北<--石家庄
    山东<--济南
    
    Process finished with exit code 0
    

    加载.properties配置文件的方式

    第一种:通过properties集合load方法的方式

    具体见上.

    第二种:通过ResourceBundle的方式加载

    ResourceBundle:资源束

  • 常用方法

    static ResourceBundle getBundle(String baseName, Locale locale) 
    使用指定的基本名称、语言环境和调用者的类加载器获取资源包。 
        
    String getString(String key) 
    从此资源包或它的某个父包中获取给定键的字符串 
    
  • 代码演示

    public class ResourceBundle {
        public static void main(String[] args) {
            Locale localeCn = new Locale("zh", "CN");
            Locale localeUs = new Locale("en", "US");
            java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("my", localeCn);
            String username = bundle.getString("username");
            System.out.println(username);
        }
    }
    

    第三种方式:通过类加载器的方式

    		//获取properties集合对象
            Properties pro = new Properties();
            //通过ClassLoader中的getResourceAsStream将配置文件读取到字节流中
            InputStream is = GetProperties.class.getClassLoader().getResourceAsStream("pro.properties");
            //将文件内容存入properties集合中
            pro.load(is);
            //获取文件中所有的键
            Set<String> keys = pro.stringPropertyNames();
            //遍历所有的内容
            for (String s : keys){
                System.out.println(s + "=" + pro.getProperty(s));
            }
    
    
  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高小小天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值