Properties类的了解和使用

Properties类的了解和使用

前言:我们学习java的类一定去看源码对这个类的介绍,并熟悉一些常用的用法,今天我们就来学学properties这个类。

1.什么是properties或者说properties有什么用?

​ 我们在很多避免硬编码的应用场景下需要使用properties文件来加载程序需要的配置信息,比如JDBC。Properties类则是properties文件和程序的中间桥梁,不论是从properties文件读取信息还是写入信息到properties文件都要经由Properties类。

2.Properties类

Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。

因为 Properties 继承于 Hashtable,所以可对 Properties 对象应用 putputAll 方法。但不建议使用这两个方法,因为它们允许调用者插入其键或值不是 String 的项。相反,应该使用 setProperty 方法。如果在“不安全”的 Properties 对象(即包含非 String 的键或值)上调用 storesave 方法,则该调用将失败。类似地,如果在“不安全”的 Properties 对象(即包含非 String 的键)上调用 propertyNameslist 方法,则该调用将失败。

该类是线程安全

2.1Properties类的方法:

2.1.1 常用方法介绍

  • setProperty

    public Object setProperty(String key, String value)
    
  • getProperty

    public String getProperty(String key)
    
  • load

    public void load(Reader reader) throws IOException
    //按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)
    
    public void load(InputStream inStream) throws IOException
    //从输入流中读取属性列表(键和元素对) 
    

    这里要注意的是键和值可以以 : 或者 = 拆分区域,下面三种方式均可以实现键值对的匹配

    Truth = Beauty
            Truth:Beauty
     Truth                  :Beauty
    
  • store

    public void store(Writer writer, String comments) throws IOException
    //以适合使用 load(Reader) 方法的格式,将此 Properties 表中的属性列表(键和元素对)写入输出字符
    
    public void store(OutputStream out, String comments) throws IOException
    //以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。  
    

propertyNames

public Enumeration<?> propertyNames()
//返回属性列表中所有键的枚举,如果在主属性列表中未找到同名的键,则包括默认属性列表中不同的键。 
  • stringPropertyNames

    public Set<String> stringPropertyNames()
    //返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,则还包括默认属性列表中不同的键。其键或值不是 String 类型的属性被忽略。
    
  • list

    public void list(PrintStream out)
    //将属性列表输出到指定的输出流,对于调试有用
        
    public void list(PrintWriter out)
    //将属性列表输出到指定的输出流
    

2.2.2 常用方法使用

import java.io.*;
import java.util.Enumeration;
import java.util.Properties;
import java.util.Set;

public class UseProperty {
    public static void main(String[] args) {
        Properties prop1 = new Properties();
        prop1.setProperty("a", "aaa");
        prop1.setProperty("b", "bbb");
        prop1.setProperty("c", "ccc");

        Properties prop2 = new Properties();
        prop2.setProperty("x","xxx");
        prop2.setProperty("y","yyy");
        prop2.setProperty("z","zzz");

        //使用store方法将prop写入到properties文件,OutputStream
        storePropByOutputStream(prop1);

        //load方法加载已经存在的properties文件,使用InputStream读取
        loadPropByInputStream();

        //使用store方法将prop写入到properties文件,Writer
        storePropByWriter(prop2);

        //load方法加载已经存在的properties文件,使用Reader读取
        loadPropByReader();

        //stringPropertyNames()方法
        System.out.println("<-------使用方法stringPropertyNames()遍历Properties列表----->");
        Set<String> set = prop2.stringPropertyNames();
        for(String key:set){
            String value = prop2.getProperty(key);
            System.out.println(key+":"+value);
        }

        System.out.println("<-------使用方法propertyNames()遍历Properties列表----->");
        Enumeration enume =  prop1.propertyNames();
        while(enume.hasMoreElements()){
            String key = (String)enume.nextElement();
            String value = prop1.getProperty(key);
            System.out.println(key+":"+value);
        }


    }

    public static void storePropByOutputStream(Properties prop){
        try (OutputStream ops = new FileOutputStream(new File("resources\\a.properties"))) {
            prop.store(ops, "config-a");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void storePropByWriter(Properties prop){
        try (Writer writer = new FileWriter(new File("resources\\b.properties"))) {
            prop.store(writer, "config-b");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void loadPropByInputStream(){
        try (InputStream ips = new FileInputStream(new File("resources\\a.properties"))) {
            Properties prop = new Properties();
            prop.load(ips);
            Enumeration enumeration =  prop.propertyNames();
            System.out.println("<-----load by stream----->");
            while(enumeration.hasMoreElements()){
                String key = (String)enumeration.nextElement();
                String value = prop.getProperty(key);
                System.out.println(key+":"+value);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void loadPropByReader(){
        try (Reader reader = new FileReader(new File("resources\\b.properties"))) {
            Properties prop = new Properties();
            prop.load(reader);
            Enumeration enumeration =  prop.propertyNames();
            System.out.println("<-----load by reader----->");
            while(enumeration.hasMoreElements()){
                String key = (String)enumeration.nextElement();
                String value = prop.getProperty(key);
                System.out.println(key+":"+value);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
}

运行结果:

<-----load by stream----->
b:bbb
a:aaa
c:ccc
<-----load by reader----->
x:xxx
z:zzz
y:yyy
<-------使用方法stringPropertyNames()遍历Properties列表----->
x:xxx
z:zzz
y:yyy
<-------使用方法propertyNames()遍历Properties列表----->
b:bbb
a:aaa
c:ccc
posted @ 2020-12-24 10:01  会微笑的leo  阅读(900)  评论(0)    收藏  举报