1. 概述
java.util.Properties
继承于Hashtable
,来表示一个持久的属性集。它使用键值结构存储数据,每个键及其对应值都是一个字符串。该类也被许多Java类使用,比如获取系统属性时,System.getProperties
方法就是返回一个Properties
对象。
2. Properties类
java.util.Properties
集合extends Hashtable<k,v> implements Map<k,v>
Properties
类表示了一个持久的属性集。Properties
可保存在流中或从流中加载。Properties
集合是一个唯一和IO流相结合的集合
- 可以使用Properties集合中的方法
store
,把集合中的临时数据,持久化写入到硬盘中存储 - 可以使用Properties集合中的方法
load
,把硬盘中保存的文件(键值对),读取到集合中使用
属性列表中每个键及其对应值都是一个字符串。
-
Properties
集合是一个双列集合,key和value默认都是字符串
2.1 构造方法
-
public Properties()
:创建一个空的属性列表。
2.2 基本的存储方法
使用Properties
集合存储数据,遍历取出Properties
集合中的数据Properties
集合是一个双列集合,key
和value
默认都是字符串Properties
集合有一些操作字符串的特有方法
public Object setProperty(String key, String value)
: 保存一对属性。
调用 Hashtable 的方法 put。public String getProperty(String key)
:使用此属性列表中指定的键搜索属性值。
通过key找到value值,此方法相当于Map集合中的get(key)方法。public Set<String> stringPropertyNames()
:所有键的名称的集合。
返回此属性列表中的键集,其中该键及其对应值是字符串,此方法相当于Map集合中的keySet方法。
public class ProDemo {
public static void main(String[] args) throws FileNotFoundException {
// 创建属性集对象
Properties prop = new Properties();
// 添加键值对元素
prop.setProperty("方一凡","168");
prop.setProperty("乔英子","165");
prop.setProperty("王一笛","160");
//prop.put(1,true); // 不建议,最好使用自己特有的方法
// 打印属性集对象
System.out.println(prop);
// 通过键,获取属性值
System.out.println(prop.getProperty("方一凡"));
System.out.println(prop.getProperty("乔英子"));
System.out.println(prop.getProperty("王一笛"));
//使用stringPropertyNames把Properties集合中的键取出,存储到一个Set集合中
Set<String> set = prop.stringPropertyNames();
//遍历Set集合,取出Properties集合的每一个键
for (String key : set) {
//使用getProperty方法通过key获取value
String value = prop.getProperty(key);
System.out.println(key+"--"+value);
}
}
}
结果:
{乔英子=165, 方一凡=168, 王一笛=160}
168
165
160
乔英子--165
方一凡--168
王一笛--160
2.3 与流相关的方法
-
public void load(InputStream inStream)
: 从字节输入流中读取键值对。 -
public void load(Reader reader)
: 从字符输入流中读取键值对。
参数
-
InputStream inStream
:字节输入流,不能读取含有中文的键值对 -
Reader reader
:字符输入流,能读取含有中文的键值对
使用步骤
- 创建Properties集合对象
- 使用Properties集合对象中的方法load读取保存键值对的文件
- 遍历Properties集合
注意
- 存储键值对的文件中,键与值默认的连接符号可以使用=,空格(其他符号)
- 存储键值对的文件中,可以使用#进行注释,被注释的键值对不会再被读取
- 存储键值对的文件中,键与值默认都是字符串,不用再加引号
参数中使用了字节输入流,通过流对象,可以关联到某文件上,这样就能够加载文本中的数据了。
文本数据格式
必须是键值对形式,可以使用空格、等号、冒号等符号分隔。
filename=a.txt
length=209385038
location=D:\a.txt
加载代码演示:
public class ProDemo2 {
public static void main(String[] args) throws FileNotFoundException {
// 创建属性集对象
Properties pro = new Properties();
// 加载文本中信息到属性集
pro.load(new FileInputStream("read.txt"));
// 遍历集合并打印
Set<String> strings = pro.stringPropertyNames();
for (String key : strings ) {
System.out.println(key+" -- "+pro.getProperty(key));
}
}
}
结果:
filename -- a.txt
length -- 209385038
location -- D:\a.txt
2.4 store方法
可以使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中存储
void store(OutputStream out, String comments)
void store(Writer writer, String comments)
参数
-
OutputStream out
:字节输出流,不能写入中文 -
Writer writer
:字符输出流,可以写中文 -
String comments
:注释,用来解释说明保存的文件是做什么用的
注意
- 不能使用中文,会产生乱码,默认是Unicode编码
- 一般使用
""
空字符串
使用步骤
- 创建Properties集合对象,添加数据
- 创建字节输出流/字符输出流对象,构造方法中绑定要输出的目的地
- 使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中存储
- 释放资源
代码:
public class Demo01Properties {
public static void main(String[] args) throws IOException {
//1.创建Properties集合对象,添加数据
Properties prop = new Properties();
prop.setProperty("赵丽颖","168");
prop.setProperty("迪丽热巴","165");
prop.setProperty("古力娜扎","160");
//2.创建字节输出流/字符输出流对象,构造方法中绑定要输出的目的地
FileWriter fw = new FileWriter("E:\\h.txt");
//3.使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中存储
prop.store(fw,"save data");
//4.释放资源
fw.close(); // 执行一次就会覆盖文件
// prop.store(new FileOutputStream("E:\\h.txt"),""); // 乱码
// 这个流不用关,匿名对象使用完自己就关了
}
}
结果:
#save data
#Wed Jan 08 20:27:02 CST 2020
赵丽颖=168
迪丽热巴=165
古力娜扎=160