ResourceBundle 与 Properties 读取配置文件

ResourceBundle与Properties的区别在于ResourceBundle通常是用于国际化的属性配置文件读取,Properties则是一般的属性配置文件读取。
**ResourceBundle 读取配置文件**
![这里写图片描述](https://img-blog.csdn.net/20180507091517945?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1N0YXJyeV9YaWFv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

**关键代码**
package com.alfred.main;

import java.util.Locale;
import java.util.ResourceBundle;

public class ResourceBundleMain {
    public static void main(String[] args) {
        System.out.println("default:"+Locale.getDefault());
        ResourceBundle resourceBundle0 = ResourceBundle.getBundle("myconfig");
        System.out.println(resourceBundle0.getString("say.hello"));
        System.out.println(resourceBundle0.getString("say.sorry"));
        System.out.println("=================");
        Locale locale1 = new Locale("zh", "CN");
        ResourceBundle resourceBundle1 = ResourceBundle.getBundle("myconfig",locale1);
        System.out.println(resourceBundle1.getString("say.hello"));
        System.out.println(resourceBundle1.getString("say.sorry"));
        System.out.println("=================");
        Locale locale2 = new Locale("en", "US");
        ResourceBundle resourceBundle2 = ResourceBundle.getBundle("myconfig",locale2);
        System.out.println(resourceBundle2.getString("say.hello"));
        System.out.println(resourceBundle2.getString("say.sorry"));
    }
}

  ResourceBundleMain.java

这里写图片描述
这里写图片描述
这里写图片描述
运行结果:

default:zh_CN
你好(zh_CN)
对不起(zh_CN)
=================
你好(zh_CN)
对不起(zh_CN)
=================
hello(en_US)
sorry(en_US)

可以看到,我们读取的是对应国际化后缀的配置文件,命名格式为:配置文件名语言代码国家代码.properties,在没有加”语言代码_国家代码”的情况下ResourceBundle默认读取的是系统所使用地区码的配置文件,例子中,系统默认为zh_CN,所以读取的就是zh_CN结尾的配置文件。

如果删除myconfig_zh_CN.properties文件,则打印结果如下:

default:zh_CN
你好(default)
对不起(default)
=================
你好(default)
对不起(default)
=================
hello(en_US)
sorry(en_US)

需要注意的是,在没指定配置文件路径的情况下,ResourceBundle读取的文件路径是classpath下。所以如果将myconfig.properties和myconfig_zh_CN.properties文件移动到com.alfred.main包下,那么就无法读取到文件,报错:Can’t find bundle for base name myconfig, locale zh_CN。
这里写图片描述
这时,需要加上文件路径,则可以正常读取

ResourceBundle resourceBundle0 = ResourceBundle.getBundle("com.alfred.main.myconfig");
实例中ResourceBundle使用到了Locale类,Locale对象表示了特定的地理、政治和文化地区。需要Locale来执行其任务的操作称为语言环境敏感的操作,它使用Locale为用户量身定制信息。例如,显示一个数值就是语言环境敏感的操作,应该根据用户的国家、地区或文化的风俗/传统来格式化该数值。

可以使用此类中的构造方法来创建Locale: 

Locale(String language)
Locale(String language, String country)
Locale(String language, String country, String variant)

创建完Locale后,就可以查询有关其自身的信息。使用getCountry可获取ISO国家代码,使用getLanguage则获取ISO语言代码。可用使用getDisplayCountry来获取适合向用户显示的国家名。同样,可用使用getDisplayLanguage来获取适合向用户显示的语言名。有趣的是,getDisplayXXX方法本身是语言环境敏感的,它有两个版本:一个使用默认的语言环境作为参数,另一个则使用指定的语言环境作为参数。
Locale locale1 = new Locale("zh", "CN");
System.out.println(locale1.getCountry());
System.out.println(locale1.getDisplayCountry());
System.out.println(locale1.getLanguage());
System.out.println(locale1.getDisplayLanguage());
Locale locale2 = new Locale("en", "US");
System.out.println(locale1.getDisplayCountry(locale2));
System.out.println(locale1.getDisplayLanguage(locale2));

打印结果:

CN
中国
zh
中文
China
Chinese

Properties使用
关键代码:

package com.alfred.main;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Properties;

public class PropertiesMain {
    /**
     * 根据Key读取Value
     *
     * @param filePath
     * @param key
     * @return
     */
    public static String getValueByKey(String filePath, String key) {
        Properties pps = new Properties();
        InputStream in = null;
        try {
            // in = new BufferedInputStream(new FileInputStream(filePath));
            in = PropertiesMain.class.getResourceAsStream(filePath);
            pps.load(in);
            String value = pps.getProperty(key);
            System.out.println(key + " = " + value);
            return value;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 读取Properties的全部信息
     *
     * @param filePath
     * @throws IOException
     */
    public static void getAllProperties(String filePath) throws IOException {
        Properties pps = new Properties();
        InputStream in = PropertiesMain.class.getResourceAsStream(filePath);
        pps.load(in);
        Enumeration en = pps.propertyNames(); // 得到配置文件的名字

        while (en.hasMoreElements()) {
            String strKey = (String) en.nextElement();
            String strValue = pps.getProperty(strKey);
            System.out.println(strKey + "=" + strValue);
        }
    }

    /**
     * 写入Properties信息
     *
     * @param filePath
     * @param pKey
     * @param pValue
     * @throws IOException
     */
    public static void writeProperties(String filePath, String pKey,
            String pValue) throws IOException {
        Properties pps = new Properties();

        InputStream in = new FileInputStream(filePath);
        // 从输入流中读取属性列表(键和元素对)
        pps.load(in);
        OutputStream out = new FileOutputStream(filePath);
        Object setProperty = pps.setProperty(pKey, pValue);
        System.out.println(setProperty);
        // 将此 Properties 表中的属性列表(键和元素对)写入输出流
        pps.store(out, "Update " + pKey + " name");
    }

    public static void main(String[] args) throws IOException {
        // 打印当前目录
        // System.out.println(new File(".").getAbsolutePath());
        // 如果使用FileInputStream方式读取文件流 ./config/myconfig.properties
        // 如果使用getResourceAsStream方式读取文件流 /myconfig.properties
        // String value = getValueByKey("/myconfig.properties", "say.hello");
        // System.out.println(value);
        // getAllProperties("/myconfig.properties");
        // writeProperties("./config/myconfig.properties","long", "2112");
    }

}

    PropertiesMain.java
Properties通过文件流读取配置文件,文件流可以使用”类class.getResourceAsStream(配置文件路径)”方式获取,也可以通过FileInputStream的方式获取。

此外通过Properties类还可以动态修改配置文件内容。修改时会自动加入修改日志,我们可以指定修改备注内容,如下:
这里写图片描述
Properties读取的配置文件路径与ResourceBundle有所不同,getResourceAsStream方式读取classpath路径下需加上斜杠(例如:/myconfig.properties),而如果使用文件流FileInputStream方式读取,那么可以使用绝对路径,如果使用相对路径的话,则需要确定当前项目路径(new File(“.”).getAbsolutePath()),之后在当前项目路径下使用相对路径(./config/myconfig.properties)。

猜你喜欢

转载自blog.csdn.net/Starry_Xiao/article/details/80221245