文章导读
【Properties类也是Map接口的实现类,主要用于读取Java的配置文件,Properties类使用键值对的形式来保存配置文件的配置项。本文介绍如何使用Properties类读写配置文件。】
在开发软件项目时,经常需要读取项目的一些配置数据。例如,项目里用到的数据库链接地址、Tomcat服务端口号、数据文件备份地址等信息都需要放到一个配置文件里,由程序读取并使用。使用配置文件的好处是,当需要改变数据库连接地址、Tomcat服务端口号、数据文件备份地址等信息时,不需要修改代码,只需要修改配置文件的配置项就可以了。
Java提供了Properties类用于实现配置文件的写入和读取,Properties类应用Map接口实现对Java配置文件的写入和读取操作。
本文分成三个小节介绍Properties类。第一小节介绍Properties类的构造函数及属性存取方法;第二小节使用Properties类创建一个配置文件并写入配置项;第三小节使用Properties类读取已创建的配置文件。
第一小节 Properties类的构造函数及属性存取方法
1、Properties类 的构造函数
Properties 提供了二个常用的构造函数,说明如下:
● Properties ()
使用该构造函数,创建一个空的属性列表,没有默认值。
● Properties (Properties defaults)
使用该构造函数,创建一个空的属性列表,具有指定的默认值。
2、Properties类 的属性存取
同其它Map接口实现类一样,Properties类也提供了get和put方法用于元素的存取。但不建议使用这两个方法,因为这两个方法允许调用者插入新的键值对,或者值不是 String类型的数据,应该使用 setProperty和getProperty方法。
● Object setProperty (String key, String value)
该方法用于在属性列表中添加一个属性项,如果key指定的属性项已存在,则修改该属性项。
● String getProperty (String key)
该方法用于获取指定key的属性值。
Properties类属性存取示例代码如下:
package com.milihua.propertiesdemo;
import java.util.Properties;
public class PropertiesDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Properties prop = new Properties();
prop.setProperty("ip","192.168.62.190");
prop.setProperty("port","8080");
prop.setProperty("name","admin");
prop.setProperty("psw","123456");
// 获取ip的值
String ip = prop.getProperty("ip");
// 获取port的值
String port = prop.getProperty("port");
System.out.println("ip=" + ip + ",port=" + port);
}
}程序实例化对象Properties,并调用setProperty方法添加了ip、port、name、psw四个属性项。然后,调用getProperty方法获取属性值。程序输出结果如下图所示:

图1 PropertiesDemo输出结果
Properties类主要用于配置文件的读取和修改,需要将属性写入到配置文件中,或者从配置文件读取属性。
第二小节 使用Properties类创建配置文件
使用Properties类可以创建一个新的配置文件,并写入配置项。Properties类的Save方法可以保存新创建的配置文件到指定磁盘位置。Save方法说明如下:
● void save(Writer writer, String comments) throws IOException
该方法将当前属性列表写入到输出字符流中,因为该方法会抛出IO异常,因此在调用此方法时,应使用try-catch语句捕获IO异常。
Properties类创建配置文件示例代码如下:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
public class PropertiesDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Properties prop = new Properties();
prop.setProperty("ip","192.168.62.190");
prop.setProperty("port","8080");
prop.setProperty("name","admin");
prop.setProperty("psw","123456");
// 获取ip的值
String ip = prop.getProperty("ip");
// 获取port的值
String port = prop.getProperty("port");
//保存文件
try {
prop.store(new FileOutputStream(new File("database.xml")), "数据库配置属性");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("ip=" + ip + ",port=" + port);
}
}程序代码与属性存取示例代码基本相同,不同的是添加了保存属性列表到database.xml文件的语句。写入的database.xml文件内容如下图所示:

图2 database.xml配置文件内容
从图中可以看出,代码创建的属性项都已写入配置文件。唯一的问题是第一行显示了乱码,乱码内容是在调用store方法存储配置文件时传入了中文注释内容“数据库配置属性”,当写入配置文件用的编码和读取配置文件用的编码不一致时,就会出现中文乱码问题。因此建议在写配置文件时尽量不要使用中文内容。
第三小节 使用Properties类读取配置文件
Properties类提供了load方法用于读取配置文件。load方法说明如下:
● void load(Reader reader) throws IOException
该方法用于从输入字符流中读取属性列表,因为该方法会抛出IO异常,因此在调用此方法时,应使用try-catch语句捕获IO异常。
Properties类读取配置文件示例代码如下:
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Properties;
public class ReadPropertiesDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Properties pps = new Properties();
//读取配置文件
try {
pps.load(new FileInputStream("database.xml"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//获取属性列表
Enumeration<?> enum1 = pps.propertyNames();//得到配置文件的名字
//遍历属性列表
while(enum1.hasMoreElements()) {
String strKey = (String) enum1.nextElement();
String strValue = pps.getProperty(strKey);
System.out.println(strKey + "=" + strValue);
}
}
}程序调用load方法读取上例中创建的配置文件,然后调用propertyNames方法获取属性项枚举集合,最后遍历枚举集合输出属性项。程序输出结果如下图所示:

图3 ReadPropertiesDemo输出结果
从上图可以看出,程序正确输出了配置文件的所有属性项。
文章小结
Properties类实现了Map接口,利用map来存储key-value配置项,key是配置项的键,value是配置项的值。Properties类通过配置项的key获取配置项的value。当用Properties类的load方法加载配置项时,Properties类自动解析配置文件,将配置文件直接映射成Map结构,方便配置文件的读取。
思考与练习
用Properties类建立JDBC配置文件,然后遍历并读取配置文件,配置文件配置项如下:
jdbc.username=root
jdbc.password=123456
jdbc.url=jdbc:mysql://192.168.50.25:3306
jdbc.driverClassName=com.mysql.jdbc.Driver
其中,等号左边为配置项的key,等号右边为配置项的value。