从零开始学Java71之Properties配置类怎么用

4. 读取步骤

在Java中利用Properties类读取配置文件的信息,一般要经历如下三步:

  1. 创建 Properties 实例;
  2. 调用 load()方法 读取配置文件;
  3. 调用 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;

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配置文件,可以有两种方式:

  1. 类名.class.getResource(“配置文件路径及名称”) :该方式会得到一个URL对象,它代表了配置文件的路径;
  2. 类名.class.getResourceAsStream(“配置文件路径及名称”) :该方式会直接得到InputStream对象。

在上面的代码中,我们读取到了名为db.properties的配置文件,并将其存储在一个Properties对象中。

2.2 读取配置信息

在上面的代码中,我们从配置文件中读取了三个键值对,分别是jdbc.url、jdbc.usernamejdbc.password。在读取配置文件后,接下来我们就可以通过getProperty()方法来获取配置信息了。如果配置文件中不存在这些键,getProperty()方法将会返回null。

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;

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;

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.usernamejdbc.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;

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) {
**先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7**

**深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/bf3869991f68f437b299b8e8569e406f.png)
![img](https://img-blog.csdnimg.cn/img_convert/e0c0fbeb4d4fbda2235d77b3f74f6cae.png)
![img](https://img-blog.csdnimg.cn/img_convert/a1dd45f5032d77e7e707bee55c8fcc9d.png)
![img](https://img-blog.csdnimg.cn/img_convert/dd5d525e4e671caa7b5b461cf2e1c52e.png)
![img](https://img-blog.csdnimg.cn/img_convert/2426ca8180c41bb777fdf702366b237f.png)
![img](https://img-blog.csdnimg.cn/img_convert/7e8f031894dc43f401631bd61cd79cfb.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**
TO-1714325540380)]
[外链图片转存中...(img-PvxUL2WQ-1714325540380)]
[外链图片转存中...(img-eSDFUKzp-1714325540381)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值