我们在开发软件项目时,经常需要读取项目的一些配置数据。例如,项目里用到的数据库链接地址、Tomcat服务端口号、数据文件备份地址等信息都需要放到一个配置文件里,由程序读取并获取。这样做的好处是,当需要改变数据库连接地址、Tomcat服务端口号、数据文件备份地址等信息时,不需要修改代码,只需要修改配置文件内容就可以了。
Map接口还有一个重要的实现类Properties类,主要用于读取Java的配置文件,配置文件中很多变量是经常改变的,用于满足不同的项目部署环境要求。
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的属性值。
案例1:建立PropertiesTest1类,实例化Properties对象,进行配置项的存取操作。
在map包下新建PropertiesTest1类。代码如下:
package map;
import java.util.Properties;
/**
* @ClassName: PropertiesTest1
* @Description: 集合框架(Properties配置类)案例1
* @author 编程训练营
* @date
*
*/
public class PropertiesTest1 {
/**
* @Title: main
* @Description: Java程序入口main方法
* @param @param args 参数
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
// 实例化Properties对象
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方法获取属性值。
程序执行结果如下图所示:
Properties类主要用于配置文件的读取和修改,需要将属性写入到配置文件中,或者从配置文件读取属性。Properties类也提供了配置文件的存取方法。
3、Properties类 的配置文件的读取
● void load(Reader reader) throws IOException
该方法用于从输入字符流中读取属性列表,因为该方法会抛出IO异常,因此在调用此方法时,应使用try-catch语句捕获IO异常。
● void save(Writer writer, String comments) throws IOException
该方法将当前属性列表写入到输出字符流中,因为该方法会抛出IO异常,因此在调用此方法时,应使用try-catch语句捕获IO异常。
● storeToXML(OutputStream os, String comment)
该方法将当前属性列表写入到XML文件中,因为该方法会抛出IO异常,因此在调用此方法时,应使用try-catch语句捕获IO异常。
● storeToXML(OutputStream os, String comment, String encoding)
该方法将当前属性列表写入到XML文件中,文件的编码由encoding指定。因为该方法会抛出IO异常,因此在调用此方法时,应使用try-catch语句捕获IO异常。
案例2:建立PropertiesTest2类,实例化Properties对象,进行配置文件的写入操作。
在map包下新建PropertiesTest2类。代码如下:
package map;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
/**
* @ClassName: PropertiesTest2
* @Description: 集合框架(Properties配置类)案例2
* @author 编程训练营
* @date
*
*/
public class PropertiesTest2 {
/**
* @Title: main
* @Description: Java程序入口main方法
* @param @param args 参数
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
// 实例化Properties对象
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.txt")), "Property");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("ip=" + ip + ",port=" + port);
}
}案例2代码与案例1的代码基本相同,不同的是添加了保存属性列表到database.txt的语句。database.txt文件会保存到Java项目的根目录下,如果希望保存到其它目录,可以指定文件存储路径。例如d:\ properties\database.txt,该存储路径将会把配置文件保存到D盘properties目录下。
写入的database.xml文件内容如下:
#Property #Fri Dec 27 09:23:07 CST 2019 port=8080 psw=123456 name=admin ip=192.168.62.190
配置文件内容行前带“#”符号的是配置文件的注释。每一行为一个配置项,每个配置项由key-value键值对构成,“=”符号左边是配置项的key,“=”符号右边是配置项的value,
案例3:建立PropertiesTest3类,实例化Properties对象,进行配置文件的读取操作。
在map包下新建PropertiesTest3类。代码如下:
package map;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Properties;
/**
* @ClassName: PropertiesTest3
* @Description: 集合框架(Properties配置类)案例3
* @author 编程训练营
* @date
*
*/
public class PropertiesTest3 {
/**
* @Title: main
* @Description: Java程序入口main方法
* @param @param args 参数
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
Properties pps = new Properties();
//读取配置文件
try {
pps.load(new FileInputStream("database.txt"));
} 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方法读取案例2创建的配置文件,然后调用propertyNames方法获取属性项枚举集合,Enumeration接口定义了一些方法,通过这些方法可以枚举(一次获得一个)对象集合中的元素,其中hasMoreElements()方法判断当前枚举是否包含更多的元素,nextElement()获取当前枚举的下一个元素。
程序执行结果如下图所示:

Properties类表示了一个持久的属性集,它可保存在流中或从流中加载,属性列表中每个键及其对应值都是一个字符串。Properties类一般用于项目配置文件的存取。