java的Properties和ResourceBundle类

发布于 2020-09-25  324 次阅读


Properties是java中一个比较重要的类,主要用来读取java自己特有的配置文件(Properties文件),各种语言都有自己支持的配置文件,例如:python的ini文件,配置文件的使用的可以将程序经常变化的变量值,用外部读取的方式赋值,如:配置Hadoop需要修改xml文件,提高程序可用性和拓展性

一,properties类

作用:properties类表示一组持久的属性。 Properties可以保存到流中或从流中加载。 属性列表中的每个键及其对应的值都是一个字符串

结构

Properties属于Hashtable直接字类,属于key-value型的数据类型

注:properties的k-v只支持字符串类型,因为直接继承Hashtable,有put和putall方法,他们可以添加任意类型的k-v,违背了properties,不建议使用,可以使用setproperty添加

API:

重点介绍:

load方法 :  读取properties文件输入流中属性列表,加载进Properties结构中,这里可以从字节流和字符流读取

loadFromXML:读取XML文件的字节输入流,(只能是字节输入流)

setproperty:相当于Hashtable中put方法,用来增加数据

getproperty:相当于Hashtable中put方法的get方法,用来取值,必须指定key,可以设置默认值,假如文件有键吗值,可以把空值替代

stroe:将属性列表输出到外部文件

 

操作:

1,读取属性值

Map map=new HashMap<String,String>();
//InputStreamReader:转换流(可以指定编码集)
//第一种读取properties文件方式,通过io流
BufferedReader input=new BufferedReader(new InputStreamReader(new FileInputStream("wql.properties"),"UTF-8"));

Properties pro=new Properties();
//加载输入流列表
pro.load(input);

map.put("wql",pro.getProperty("wql"));
map.put("fq", pro.getProperty("fq"));

ArrayList<String> list=new ArrayList<>();
list.addAll(map.values());

Iterator<String> it=list.iterator();
while(it.hasNext()) {
System.out.print(it.next());

2,保存属性到外部文件

Reader read=new InputStreamReader(new FileInputStream("wql.properties"),"UTF-8");

Properties properties=new Properties();

properties.load(read);

properties.store(new FileWriter("d:\\FQ"), "为什么总有那么多感觉!!!");

二,Resourcebunlie类

ResourceBunlie并没有和properties一样继承了复杂的类,它是object的子类,简单来说它就是国际化的Properties,它可以根据国家和语言的不同选择性的读取配置文件(Local类支持)

继承关系:

properties文件名的书写格式:

指定义文件名_语言_地区.properties 

这样ResourceBunlie会判断语言地区选择相应的配置文件

API:

getBundle:这是一个静态方法,可带多个参数

public static final ResourceBundle getBundle(String baseName)//文件名
public static final ResourceBundle getBundle(String baseName,Locale locale)//加Locale类
public static ResourceBundle getBundle(String baseName, Locale locale,ClassLoader loader)//加类加载器
public static final ResourceBundle getBundle(String baseName,Control control)//控件返回资源包
public static ResourceBundle getBundle(String baseName, Locale targetLocale,ClassLoader loader, Control control)

getObject:通过键,返回object的值

getString:通过key,返回String类型的值

getStringArray:通过key,返回String数组

……

例:

Locale locale=new Locale("zh","CN");

ResourceBundle res=ResourceBundle.getBundle("FQ", locale);

System.out.print(res.getString("wql"));

三,properties文件

properties是一个文本文件

properties的文件语法只有两种:

1,注释:#代表注释

2,属性配置:属性名=属性值

其他语法全部不能识别

注:

1,properties会忽略属性值和属性名之间的空格

2,属性值可以换行当属性名不行

3,可以有属性名没有属性值,也可以有属性名=没有属性值,但不能属性的配置没有键(属性名)

4,属性值可以换行,用/表示换行,当属性名不能换行

properties文件的读取

方式一:使用IO和properties.load()方法
上面俩个例子都是这种方式
方式二:使用ClassLoader(反射)来获取流对象
类和类有getResourceAsStream方法来获取流
InputStream input=getClass().getClassLoader().getResourceAsStream("WQL.properties");

Properties pro = new Properties(); 

pro.load(input);

System.out.print(pro.getProperty("wql"));
方式三:通过ResourceBundle来读取
public static void main(String[] args) {
    Locale locale1 = new Locale("zh", "CN");
    ResourceBundle resb1 = ResourceBundle.getBundle("cache", locale1);
    System.out.println(resb1.getString("aaa"));

    ResourceBundle resb2 = ResourceBundle.getBundle("cache", Locale.getDefault());
    System.out.println(resb1.getString("aaa"));

    Locale locale3 = new Locale("en", "US");
    ResourceBundle resb3 = ResourceBundle.getBundle("cache", locale3);
    System.out.println(resb3.getString("aaa"));
}

路漫漫其修远兮,吾将上下而求索