8.6.4 使用Properties读写属性文件

8.6.4 使用Properties读写属性文件

Properties类是Hashtable类的子类,正如它的名字所暗示的,该对象在处理属性文件时特别方便( Windows操作平台上的.ini文件就是一种属性文件)。

Properties功能

Properties类可以把Map对象和属性文件关联起来,从而可以把Map对象中的key-value对写入属性文件中,也可以把属性文件中的”属性名=属性值“加载到Map对象中

key和value都是String

由于属性文件里的属性名、属性值只能是字符串类型,所以Properties里的keyvaue都是字符串类型。所以Properties相当于一个keyvalue都是String类型的Map

Properties类方法

获取属性值

方法 描述
String getProperty(String key) 获取Properties中指定属性名对应的属性值,类似于Mapget(Object key)方法。
String getProperty(String key, String defaultValue) 该方法与前一个方法基本相似。该方法多一个功能,如果Properties中不存在指定的key时,则该方法返回第二个参数作为默认值。

设置属性值

方法 描述
Object setProperty(String key, String value) 设置属性值,类似于Hashtableput()方法。

读取属性文件

方法 描述
void load(InputStream inStream) 从属性文件(以输入流表示)中加载key-value对,把加载到的key-value对追加到Properties里(PropertiesHashtable的子类,它不保证key-value对之间的次序)。
void load(Reader reader) Reads a property list (key and element pairs) from the input character stream in a simple line-oriented format.

写入属性文件

方法 描述
void store(OutputStream out, String comments) Properties中的key-value对输出到指定的属性文件(以输出流表示)中。
void store(Writer writer, String comments) Writes this property list (key and element pairs) in this Properties table to the output character stream in a format suitable for using the load(Reader) method.

实例 Properties读写文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.*;
import java.io.*;

public class PropertiesTest
{
public static void main(String[] args)
throws Exception
{
Properties props = new Properties();
// 向Properties中增加属性
props.setProperty("username" , "yeeku");
props.setProperty("password" , "123456");
// 将Properties中的key-value对保存到a.ini文件中
props.store(new FileOutputStream("a.ini")
, "comment line"); //①
// 新建一个Properties对象
Properties props2 = new Properties();
// 向Properties中增加属性
props2.setProperty("gender" , "male");
// 将a.ini文件中的key-value对追加到props2中
props2.load(new FileInputStream("a.ini") ); //②
System.out.println(props2);
}
}

上面程序示范了Properties类的用法,其中
①代码处将Properties对象中的key-value对写入a.ini文件中;
②代码处则从a.ini文件中读取key-value对,并添加到props2对象中。
编译、运行上面程序,该程序输出结果如下:

1
{password=123456, gender=male, username=yeeku}

上面程序还在当前路径下生成了一个a.ini文件,该文件的内容如下:

1
2
3
4
#comment line
#Thu Jul 11 17:42:17 CST 2019
password=123456
username=yeeku

读写XML

Properties可以把key-value对以XML文件的形式保存起来,也可以从XML文件中加载key-value对,相关方法如下。

读取XML

方法 描述
void loadFromXML(InputStream in) 将指定输入流上的XML文档表示的所有属性加载到此Properties表中。

写入XML

方法 描述
void storeToXML(OutputStream os, String comment) 把属性表中的键值对保存到到XML文件中
void storeToXML(OutputStream os, String comment, String encoding) 把属性表中的键值对保存到XML文件中,并指定编码
void storeToXML(OutputStream os, String comment, Charset charset) Emits an XML document representing all of the properties contained in this table, using the specified encoding.

实例 Properties读写XML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package map.test.properties;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.InvalidPropertiesFormatException;
import java.util.Properties;

public class PropertiesXMLTest
{
public static void main(String[] args)
{
Properties props = new Properties();
// 向Properties中增加属性
props.setProperty("username", "yeeku");
props.setProperty("password", "123456");
// 将Properties中的key-value对保存到a.ini文件中
try
{
props.storeToXML(new FileOutputStream("a.xml"), "这是注释");
} catch (FileNotFoundException e1)
{
e1.printStackTrace();
} catch (IOException e1)
{
e1.printStackTrace();
}
// 新建一个Properties对象
Properties props2 = new Properties();
// 向Properties中增加属性
props2.setProperty("gender", "male");
// 将a.ini文件中的key-value对追加到props2中
try
{
props2.loadFromXML(new FileInputStream("a.xml"));
} catch (InvalidPropertiesFormatException e)
{
e.printStackTrace();
} catch (FileNotFoundException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
System.out.println(props2);
}
}

运行效果:

1
{password=123456, gender=male, username=yeeku}

生成XML文件内容如下:

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>这是注释</comment>
<entry key="password">123456</entry>
<entry key="username">yeeku</entry>
</properties>