详解Java的IO流Part3:Properties属性集的使用

概述:

java.util.Properties继承于Hashtable 表示一个持久的属性集
它使用键值结构存储数据 每个键及其对应值都是一个字符串
该类也被许多Java类使用 比如获取系统属性时System.getProperties方法就是返回一个Properties对象

Properties集合是唯一和IO流相结合的集合
可以使用Properties集合中的store()方法 将集合中的临时数据持久化写入硬盘中存储
还可以使用Properties集合中的load()方法 将硬盘中保存的键值对文件读取到集合中使用

Properties集合是一个双列集合 key和value默认都是字符串 因此 使用该集合时无须写泛型


构造方法:

public Properties():创建一个空的属性列表

基本存储方法:

public Object setProperty(String key, String value) :保存一对属性
底层调用的是Hashtable的put()方法
public String getProperty(String key):使用此属性列表中指定的键搜索属性值
通过key找到value值 相当于Map集合中的get(key)方法
public Set stringPropertyNames():返回所有键的名称的集合
其中 键和值是字符串 相当于Map集合中的keySet()方法

// 创建Properties集合对象
Properties properties=new Properties();
// 使用setProperties方法往集合中添加数据
properties.setProperty("A同学","18");
properties.setProperty("B同学","21");
properties.setProperty("C同学","19");

// 使用stringPropertiesNames方法将Properties集合中的键取出 存储到一个Set集合中
Set<String> strings = properties.stringPropertyNames();
for (String key:strings)
{
    String value = properties.getProperty(key);
    System.out.println("key:"+key+" value:"+value);
}

store() 存储

使用Properties集合中的store()方法 将集合中的临时数据持久化写入硬盘中存储

void store(OutputStream out,String comments)
void store(Writer writer,String comments)

参数:
OutputStream out:字节输出流 不能写入中文
Writer writer:字符输出流 可以写入中文
String comments:注释 用于解释说明保存的文件的用途
注释不能使用中文 会导致乱码 因为默认采用的是Unicode编码

使用步骤:
1、创建Properties集合对象 添加数据
2、创建字节输出流/字符输出流对象 构造方法中绑定要输出的目的地
3、使用Properties集合中的store方法 将集合中的临时数据持久化写入到硬盘中存储
4、释放资源

// 创建Properties集合对象
Properties properties=new Properties();
// 使用setProperties方法往集合中添加数据
properties.setProperty("A同学","18");
properties.setProperty("B同学","21");
properties.setProperty("C同学","19");

// 创建字符输出流对象 构造方法中绑定要输出的目的地
FileWriter fw=new FileWriter("F:\\IdeaProjects\\filetest\\d.txt");

// 使用Properties集合中的store方法 将集合中的临时数据持久化写入到硬盘中存储
properties.store(fw,"save test");

// 释放资源
fw.close();

保存后的文件格式:第一行为注释 第二行为保存日期
#save test
#Sun Mar 08 16:07:34 CST 2020
A同学=18
C同学=19
B同学=21


若用FileOutputStream保存中文 则保存后的文件会出现乱码

// 创建Properties集合对象
Properties properties=new Properties();
// 使用setProperties方法往集合中添加数据
properties.setProperty("A同学","18");
properties.setProperty("B同学","21");
properties.setProperty("C同学","19");

// 创建字符输出流对象 构造方法中绑定要输出的目的地
FileOutputStream fos=new FileOutputStream("F:\\IdeaProjects\\filetest\\e.txt");

// 使用Properties集合中的store方法 将集合中的临时数据持久化写入到硬盘中存储
properties.store(fos,"save test");

// 释放资源
fos.close();

#save test
#Sun Mar 08 16:10:12 CST 2020
A\u540C\u5B66=18
C\u540C\u5B66=19
B\u540C\u5B66=21


load() 读取

使用Properties集合中的lord()方法 将硬盘中保存的键值对文件读到集合中使用

void load(InputStream inStream)
void load(Reader reader)

参数:
InputStream inStream:字节输入流 无法读取包含中文的键值对
Reader reader:字符输入流 可以读取含中文的键值对

// 创建Properties集合对象
Properties properties=new Properties();
// 使用Properties集合对象中的load()方法 读取键值对中的文件
properties.load(new FileReader("F:\\IdeaProjects\\filetest\\d.txt"));
// 存储键值对的文件中 键和值默认都是字符串 无须手动加入引号
Set<String> strings = properties.stringPropertyNames();
for (String key:strings)
{
String value = properties.getProperty(key);
System.out.println("key:"+key+" value:"+value);
}

输出结果:
key:A同学 value:18
key:C同学 value:19
key:B同学 value:21

使用FileInputStream读取中文字符导致乱码

// 创建Properties集合对象
Properties properties=new Properties();
// 使用Properties集合对象中的load()方法 读取键值对中的文件
properties.load(new FileInputStream("F:\\IdeaProjects\\filetest\\d.txt"));
// 存储键值对的文件中 键和值默认都是字符串 无须手动加入引号
Set<String> strings = properties.stringPropertyNames();
for (String key:strings)
{
    String value = properties.getProperty(key);
    System.out.println("key:"+key+" value:"+value);
}

输出结果:
key:B同学 value:21
key:C同学 value:19
key:A同学 value:18


你可能感兴趣的:(Java,java)