Java中Properties配置类用法详解
作者:一一哥Sun
一. Properties简介
1. 概述
在Java开发中,我们经常需要读取和写入配置文件,用来存储程序中的一些配置信息,例如数据库的连接信息、邮件和Web服务器的信息、消息队列的信息等等。配置文件一般都是key-value形式,且它的key-value一般都是String-String类型的,因此我们完全可以用Map<String, String>来表示它。
但因为配置文件特别常用,所以Java集合库给我们提供了一个Properties类来表示一组“配置”,专门用来处理key-value形式的配置信息。Properties类可以表示一个持久的属性集,每个键及其对应的值都是字符串类型,它可以把配置信息保存在一个IO流中,或是从一个IO流中加载配置信息,因此很适合用来处理配置文件。
Properties的内部本质上是一个Hashtable,该类从Hashtable中继承了get()和put()方法,这些方法的参数签名是Object。但由于历史遗留原因,Properties的设计实际上是有问题的,不过为了保持兼容性,现在已经没法修改了。所以我们在使用Properties时,不要去调用这些从Hashtable继承来的方法,而应该使用Properties自身关于读写配置的方法,比如getProperty()和setProperty()等方法。
2. 配置文件
既然今天我们想利用Properties类来对配置文件进行读取,所以首先我们得认识一下什么是配置文件。在Java中,配置文件其实有多种格式,可以是 .txt、.xml、.properties、.yml、.json等格式,今天要给大家介绍的就是基于.properties格式的配置文件。
在Java中,其实默认的配置文件就是以.properties为扩展名的,该文件中的每行信息都是以key=value表示的,并用#进行注释。以下是一个典型的配置文件:
# db.properties #数据库的url jdbc.url=jdbc:mysql://localhost:3306/mydb #用户名 jdbc.username=root #密码 jdbc.password=root
我们可以在eclipse等IDE工具中直接创建.properties文件,然后把上面的这些配置信息复制进去即可。
3. 常用方法
我们在使用Properties类读写配置文件时,常常会用到以下方法:
public synchronized void load(InputStream inStream) throws IOException public synchronized void store(OutputStream out, String comments) throws IOException
其中,load()方法用于从指定的输入流中读取属性列表(键和元素对),store()方法用于将Properties中的键值对存储到指定的输出流中。
4. 读取步骤
在Java中利用Properties类读取配置文件的信息,一般要经历如下三步:
创建 Properties 实例;
调用 load()方法 读取配置文件;
调用 getProperty()方法 获取具体的配置信息。
了解了以上这些内容之后,接下来,会通过几个例子来给大家详细地介绍Properties的使用方法。
二. 读写Properties配置文件
首先我们通过一个案例,来学习如何读取Properties配置文件里的信息。
1. 创建Properties文件
为了方便测试,我们可以先在项目中创建一个.properties的配置文件。这里就把该配置文件命名为db.properties了,如下图所示:
大家要注意,在早期的JDK中, .properties配置 文件采用了ASCII编码,具体来说是ISO8859-1编码。在这种编码中,如果文件中存在中文,这些中文必须使用user name=\u4e2d\u6587
的形式来表示,非常别扭。而从JDK 9开始, .properties配置 文件就可以使用UTF-8编码了。
由于load(InputStream)方法默认总是以ASCII编码来读取字节流,所以会导致读取信息时产生乱码,我们可以使用另一个load(Reader)重载方法来读取:
Properties props = new Properties(); props.load(new FileReader("db.properties", StandardCharsets.UTF_8));
InputStream是字节流,Reader是字符流,因为字符流在内存中已经以char类型表示了,所以不涉及到编码问题。这样通过以上代码,我们就可以正常读取包含中文的配置信息了。
2. 读取Properties文件
2.1 加载配置文件
接下来我们可以使用Properties类的load()方法,来读取上面创建的配置文件,例如:
import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Properties; /** * @author 一一哥Sun */ public class Demo23 { public static void main(String[] args) { //创建Properties对象 Properties properties = new Properties(); try { //设置db.properties配置文件,利用字节流来加载文件 //寻找.properties文件路径方式一 //从当前项目的根目录下寻找db.properties文件 URL url = Demo23.class.getResource("/db.properties"); String path = url.getPath(); System.out.println("path="+path); InputStream inputStream = new FileInputStream(path); //寻找.properties文件路径方式二 //InputStream inputStream = Demo23.class.getResourceAsStream("/db.properties"); //加载字节流 properties.load(inputStream); System.out.println("properties="+properties); } catch (IOException e) { e.printStackTrace(); } } }
在一个普通的Java项目中,如果我们想读取.properties配置文件,可以有两种方式:
类名.class.getResource("配置文件路径及名称") :该方式会得到一个URL对象,它代表了配置文件的路径;
类名.class.getResourceAsStream("配置文件路径及名称") :该方式会直接得到InputStream对象。
在上面的代码中,我们读取到了名为db.properties的配置文件,并将其存储在一个Properties对象中。
2.2 读取配置信息
在上面的代码中,我们从配置文件中读取了三个键值对,分别是jdbc.url、jdbc.username和jdbc.password。在读取配置文件后,接下来我们就可以通过getProperty()方法来获取配置信息了。如果配置文件中不存在这些键,getProperty()方法将会返回null。
import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Properties; /** * @author 一一哥Sun */ public class Demo23 { public static void main(String[] args) { //创建Properties对象 Properties properties = new Properties(); try { //设置db.properties配置文件,利用字节流来加载文件 //寻找.properties文件路径方式一 //从当前项目的根目录下寻找db.properties文件 URL dbUrl = Demo23.class.getResource("/db.properties"); String path = dbUrl.getPath(); System.out.println("path="+path); InputStream inputStream = new FileInputStream(path); //寻找.properties文件路径方式二 //InputStream inputStream = Demo23.class.getResourceAsStream("/db.properties"); //加载字节流 properties.load(inputStream); System.out.println("properties="+properties); //从配置文件中根据指定的key来读取配置信息 String url = properties.getProperty("jdbc.url"); String username = properties.getProperty("jdbc.username"); String password = properties.getProperty("jdbc.password"); System.out.println("[url]="+url+" ,[username]="+username+" ,[password]="+password); } catch (IOException e) { e.printStackTrace(); } } }
要注意,我们在调用 getProperty()方法 获取配置信息时,如果指定的key不存在,会返回 null 。但我们可以提供一个默认值,这样当key不存在时会返回一个默认值。 并且如果有多个.properties文件,可以反复调用load()读取,后读取的key-value会覆盖已读取的key-value。
2.3 使用默认值读取信息
在读取配置文件时,如果某个键不存在,getProperty()方法将返回null。为了避免出现NullPointerException,我们可以为getProperty()方法指定一个默认值,例如:
String url = properties.getProperty("jdbc.url", "jdbc:mysql://localhost:3306/mydb"); String username = properties.getProperty("jdbc.username", "root"); String password = properties.getProperty("jdbc.password", "root");
在以上代码中,如果配置文件中不存在jdbc.url这个键,getProperty方法会返回我们设置的默认值"jdbc:mysql://localhost:3306/mydb"。
3. 写入Properties文件
接下来我们再通过一个案例,来学习如何把配置信息写入到Properties文件里。
3.1 写入配置文件
我们可以使用Properties类的store方法来写入配置文件,例如:
import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.util.Properties; /** * @author */ public class Demo24 { public static void main(String[] args) { //设置配置信息 Properties properties = new Properties(); properties.setProperty("jdbc.url", "jdbc:mysql://localhost:3306/mydb2"); properties.setProperty("jdbc.username", "root"); properties.setProperty("jdbc.password", "syc"); try { URL dbUrl = Demo24.class.getResource("/db.properties"); String path = dbUrl.getPath(); System.out.println("path="+path); OutputStream outputStream = new FileOutputStream(path); //写入配置信息 properties.store(outputStream, "Database connection properties"); // 寻找.properties文件路径方式二 InputStream inputStream = Demo24.class.getResourceAsStream("/db.properties"); // 加载字节流 properties.load(inputStream); System.out.println("properties=" + properties); } catch (IOException e) { e.printStackTrace(); } } }
以上代码中,将三个键值对写入到了名为db.properties的配置文件中,并添加了一行注释“Database connection properties”。
3.2 使用默认值写入信息
另外在Properties类中,其实本身就有一个默认的Properties对象,可以用来设置一些默认属性值。我们可以使用Properties类的getDefaultProperties()方法来获取默认的Properties对象,然后使用setProperty()方法来设置默认属性值,例如:
Properties defaultProperties = Properties.getDefaultProperties(); defaultProperties.setProperty("jdbc.url", "jdbc:mysql://localhost:3306/mydb"); defaultProperties.setProperty("jdbc.username", "root"); defaultProperties.setProperty("jdbc.password", "root"); Properties properties = new Properties(defaultProperties);
以上代码中,我们先获取了默认的Properties对象,然后设置了jdbc.url、jdbc.username和jdbc.password三个默认属性值。接着,我们创建了一个新的Properties对象,并将默认的Properties对象传递给它。这样,在读取配置文件时,如果某个键不存在,getProperty方法就会先在当前Properties对象中查找,如果找不到,就会在默认Properties对象中查找。
四. 读写XML配置文件
其实Properties类不仅可以操作.properties配置文件,也可以操作.xml格式的文件,接下来再给大家讲一下如何操作xml文件。
1. 创建XML文件
首先我们来创建一个xml格式的配置文件,如下所示
<?xml version="1.0" encoding="UTF-8"?> <!-- 声明一个properties属性节点 --> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <entry key="jdbc.url">jdbc:mysql://localhost:3306/mydb</entry> <entry key="jdbc.username">root</entry> <entry key="jdbc.password">root</entry> </properties>
大家要注意,这里我们要使用<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
语句来声明一个properties根结点,大家可以根据自己的需要定义自己的节点名称。
2. 读取XML配置文件
要想读取XML格式的配置文件,可以使用loadFromXML()方法从XML文件中读取配置信息,例如:
import java.io.IOException; import java.io.InputStream; import java.util.Properties; /** * @author 一一哥Sun */ public class Demo25 { public static void main(String[] args) { // 创建Properties对象 Properties properties = new Properties(); try { // 从当前项目的根目录下寻找db.properties文件 InputStream inputStream = Demo25.class.getResourceAsStream("/config.xml"); // 加载字节流,从XML文件中读取配置信息 properties.loadFromXML(inputStream); // 从配置文件中根据指定的key来读取配置信息 // 读取信息时设置默认值 String url = properties.getProperty("jdbc.url","jdbc:mysql://localhost:3306/mydb2"); String username = properties.getProperty("jdbc.username", "syc"); String password = properties.getProperty("jdbc.password", "syc"); System.out.println("[url]="+url+" ,[username]="+username+" ,[password]="+password); } catch (IOException e) { e.printStackTrace(); } } }
以上代码读取了名为config.xml的XML配置文件,并将其存储在一个Properties对象中。在读取XML格式的配置文件后,我们就可以通过getProperty方法来获取配置信息了。
3. 写入XML配置文件
同时,我们也可以使用storeToXML()方法,将Properties中的键值对信息存储到XML格式的输出流中,例如:
import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.util.Properties; /** * @author */ public class Demo26 { public static void main(String[] args) { // 设置配置信息 Properties properties = new Properties(); properties.setProperty("jdbc.url", "jdbc:mysql://localhost:3306/mydb2"); properties.setProperty("jdbc.username", "root"); properties.setProperty("jdbc.password", "syc"); try { URL dbUrl = Demo26.class.getResource("/config.xml"); String path = dbUrl.getPath(); OutputStream outputStream = new FileOutputStream(path); // 写入配置信息 properties.storeToXML(outputStream, "Database connection properties"); // 寻找.properties文件路径方式二 InputStream inputStream = Demo26.class.getResourceAsStream("/config.xml"); // 加载字节流 properties.loadFromXML(inputStream); System.out.println("xml=" + properties); } catch (IOException e) { e.printStackTrace(); } } }
在以上代码中,我们将三个键值对写入了一个名为config.xml的XML配置文件中,并添加了一行注释“Database connection properties”。
五. 结语
在本文中,为大家详细介绍了Java中的Properties配置类,它是用来处理配置文件的一个实用工具类,该类可以从文件系统、classpath或其他任何地方读取.properties文件。我们在读写Properties时,注意仅使用getProperty()和setProperty()方法,不要调用继承而来的get()和put()等方法。
通过本文的介绍,相信大家已经掌握了Properties类的基本用法,包括读写配置文件、设置默认值、读写XML格式的配置文件等等。在实际开发中,我们可以结合Properties类来实现程序的配置功能,提高程序的灵活性和可维护性。
以上就是Java中Properties配置类用法详解的详细内容,更多关于Java Properties配置类的资料请关注脚本之家其它相关文章!