前言:我们学习java的类一定去看源码对这个类的介绍,并熟悉一些常用的用法,今天我们就来学学properties这个类。
1.什么是properties或者说properties有什么用?
我们在很多避免硬编码的应用场景下需要使用properties文件来加载程序需要的配置信息,比如JDBC。Properties类则是properties文件和程序的中间桥梁,不论是从properties文件读取信息还是写入信息到properties文件都要经由Properties类。
2.Properties类
Properties
类表示了一个持久的属性集。Properties
可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
因为 Properties
继承于 Hashtable
,所以可对 Properties
对象应用 put
和 putAll
方法。但不建议使用这两个方法,因为它们允许调用者插入其键或值不是 String
的项。相反,应该使用 setProperty
方法。如果在“不安全”的 Properties
对象(即包含非 String
的键或值)上调用 store
或 save
方法,则该调用将失败。类似地,如果在“不安全”的 Properties
对象(即包含非 String
的键)上调用 propertyNames
或 list
方法,则该调用将失败。
该类是线程安全的
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
网友评论