美文网首页
Properties类源码学习

Properties类源码学习

作者: 会微笑的leo | 来源:发表于2020-12-23 09:32 被阅读0次

前言:我们学习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

相关文章

  • Properties类源码学习

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

  • common模块阅读10: Message

    说明 这个类就是描述最基本消息的,包含消息体,topic,properties等 类图 继承关系如下 源码 代码不...

  • Java | Properties类操作

    一、Java Properties类 Properties 类(Java.util.Properties)用于读取...

  • Java 读写Properties配置文件

    1.Properties类与Properties配置文件 Properties类继承自Hashtable类并且实现...

  • Java IO之Properties类,序列化流和打印流

    1 Properties类 1.1 Properties类介绍   Properties 类表示了一个持久的属性集...

  • Properties类

    Properties类 Properties(配置文件类): 主要用于生产配置文件与读取配置文件的信息。 往pro...

  • 四十四、Properties类

    一、Properties类介绍 Properties 类表示了一个持久的属性集。Properties 可保存在流中...

  • Enumeration接口

    在学习properties类的过程使用到Enumeration接口,因此学习记录下。 Enumeration接口中...

  • java读取.properties配置文件

    1、使用java.util中Properties类和类加载器 private static Properties ...

  • Java IO(四)

    Properties类 Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中...

网友评论

      本文标题:Properties类源码学习

      本文链接:https://www.haomeiwen.com/subject/sotenktx.html