Java中读取properties配置文件的八种方式总结

2024-03-31 04:32

本文主要是介绍Java中读取properties配置文件的八种方式总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、前言

在做Java项目开发过程中,涉及到一些数据库服务连接配置、缓存服务器连接配置等,通常情况下我们会将这些不太变动的配置信息存储在以 .properties 结尾的配置文件中。当对应的服务器地址或者账号密码信息有所变动时,我们只需要修改一下配置文件中的信息即可。同时为了让Java程序可以读取 .properties配置文件中的值,JavaJDK中提供了java.util.Properties类可以实现读取配置文件。

二、Properties类

Properties 类位于 java.util.Properties中,是Java 语言的处理配置文件所使用的类,其中的xxx.Properties类主要用于集中的持久存储Java的配置文件内容,可以读取后缀是.properties.cfg的配置文件。

Properties继承了Hashtable 类,以Map 的形式进行放置值,put(key,value)get(key),文本注释信息可以用"#"来注释。

Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。

Properties 文件内容的格式是:键=值 形式,Key值不能够重复。 例如:

jdbc.driver=com.mysql.jdbc.Driver
  • Properties类的继承关系图:
    Properties类继承关系图
  • Properties类的源码关系图:
    在这里插入图片描述
  • 主要方法介绍:
    在这里插入图片描述

它提供了几个核心的方法:

  • getProperty ( String key): 用指定的键在此属性列表中搜索属性。也就是通过参数 key ,得到 key 所对应的 value。

  • load ( InputStream inStream): 从输入流中读取属性列表(键和元素对)。通过对指定的文件(比如说上面的 test.properties 文件)进行装载来获取该文件中的所有键 - 值对。以供 getProperty ( String key) 来搜索。

  • setProperty ( String key, String value) : 调用 Hashtable 的方法 put 。他通过调用基类的put方法来设置 键 - 值对。

  • store ( OutputStream out, String comments): 以适合使用 load 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。与 load 方法相反,该方法将键 - 值对写入到指定的文件中去。

  • clear (): 清除所有装载的 键 - 值对。该方法在基类中提供。

三、Properties常用方法实践

Properties类我们从文件的写入和读取来实践其具体用法,下面演示练习将以下数据库配置信息写入到jdbc.properties文件中

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8
jdbc.username=root
jdbc.password=123456
  • 项目目录结构如下
    在这里插入图片描述

四、Java写入Properties

Properties类调用setProperty方法将键值对保存到内存中,此时可以通过getProperty方法读取,propertyNames方法进行遍历,但是并没有将键值对持久化到属性文件中,故需要调用store方法持久化键值对到属性文件中。

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Properties;/*** @desc:  写入Mysql数据库了连接信息到jdbc.properties中* @author: cao_wencao* @date: 2020-12-29 13:41*/
public class PropertiesStoreTest {public static void main(String[] args) {Properties properties = new Properties();OutputStream output = null;try {output = new FileOutputStream("src/main/resources/jdbc.properties");properties.setProperty("jdbc.driver", "com.mysql.jdbc.Driver");properties.setProperty("jdbc.url","jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8" );properties.setProperty("jdbc.username", "root");properties.setProperty("jdbc.password", "123456");// 保存键值对到文件中properties.store(output, "Thinkingcao modify");} catch (IOException io) {io.printStackTrace();} finally {if (output != null) {try {output.close();} catch (IOException e) {e.printStackTrace();}}}}
}

输出结果,在resources目录下多一个文件jdbc.properties,内容如下:

#Thinkingcao modify
#Tue Dec 29 13:43:48 CST 2020
jdbc.url=jdbc\:mysql\://localhost\:3306/mybatis?characterEncoding\=utf8
jdbc.username=root
jdbc.driver=com.mysql.jdbc.Driver
jdbc.password=123456

五、Java读取Properties

Java读取Properties文件的方法有很多,下面介绍8种方式,分别读取resource目录下的jdbc.properties和resource/config/application.properties。

  • application.properties文件内容如下
minio.endpoint=http://localhost:9000
minio.accessKey=minioadmin
minio.secretKey=minioadmin
minio.bucketName=demo

1. 从当前的类加载器的getResourcesAsStream来获取

/*** 1. 方式一* 从当前的类加载器的getResourcesAsStream来获取* InputStream inputStream = this.getClass().getResourceAsStream(name)** @throws IOException*/@Testpublic void test1() throws IOException {InputStream inputStream = this.getClass().getResourceAsStream("jdbc.properties");Properties properties = new Properties();properties.load(inputStream);properties.list(System.out);System.out.println("==============================================");String property = properties.getProperty("jdbc.url");System.out.println("property = " + property);}

2. 从当前的类加载器的getClassLoader().getResourcesAsStream来获取

 /*** 2. 方式二* 从当前的类加载器的getResourcesAsStream来获取* InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(name)** @throws IOException*/@Testpublic void test2() throws IOException {InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("config/application.properties");Properties properties = new Properties();properties.load(inputStream);properties.list(System.out);System.out.println("==============================================");String property = properties.getProperty("minio.endpoint");System.out.println("property = " + property);}

3. 使用Class类的getSystemResourceAsStream静态方法 和使用当前类的ClassLoader是一样的

 /*** 3. 方式三* 使用Class类的getSystemResourceAsStream方法 和使用当前类的ClassLoader是一样的* InputStream inputStream = ClassLoader.getSystemResourceAsStream(name)** @throws IOException*/@Testpublic void test3() throws IOException {InputStream inputStream = ClassLoader.getSystemResourceAsStream("config/application.properties");Properties properties = new Properties();properties.load(inputStream);properties.list(System.out);System.out.println("==============================================");String property = properties.getProperty("minio.endpoint");System.out.println("property = " + property);}

4. 使用Spring-core包中的ClassPathResource读取

    /*** 4. 方式四* Resource resource = new ClassPathResource(path)** @throws IOException*/@Testpublic void test4() throws IOException {Resource resource = new ClassPathResource("config/application.properties");Properties properties = PropertiesLoaderUtils.loadProperties(resource);properties.list(System.out);System.out.println("==============================================");String property = properties.getProperty("minio.endpoint");System.out.println("property = " + property);}

5. 从文件中读取,new BufferedInputStream(InputStream in)

/*** 5. 方式五* 从文件中获取,使用InputStream字节,主要是需要加上当前配置文件所在的项目src目录地址。路径配置需要精确到绝对地址级别* BufferedInputStream继承自InputStream* InputStream inputStream = new BufferedInputStream(new FileInputStream(name)* 这种方法读取需要完整的路径,优点是可以读取任意路径下的文件,缺点是不太灵活* @throws IOException*/@Testpublic void test5() throws IOException {InputStream inputStream = new BufferedInputStream(new FileInputStream("src/main/resources/config/application.properties"));Properties properties = new Properties();properties.load(inputStream);properties.list(System.out);System.out.println("==============================================");String property = properties.getProperty("minio.endpoint");System.out.println("property = " + property);}

6.从文件中读取,new FileInputStream(String name)

/*** 6. 方式六* 从文件中获取,使用InputStream字节,主要是需要加上当前配置文件所在的项目src目录地址。路径配置需要精确到绝对地址级别* FileInputStream继承自InputStream* InputStream inputStream = new FileInputStream(name)* 这种方法读取需要完整的路径,优点是可以读取任意路径下的文件,缺点是不太灵活* @throws IOException*/@Testpublic void test6() throws IOException {InputStream inputStream = new FileInputStream("src/main/resources/config/application.properties");Properties properties = new Properties();properties.load(inputStream);properties.list(System.out);System.out.println("==============================================");String property = properties.getProperty("minio.endpoint");System.out.println("property = " + property);}

7. 使用PropertyResourceBundle读取InputStream流

 /*** 7. 方式七* 使用InputStream流来进行操作ResourceBundle,获取流的方式由以上几种。* ResourceBundle resourceBundle = new PropertyResourceBundle(inputStream);* @throws IOException*/@Testpublic void test7() throws IOException {InputStream inputStream = ClassLoader.getSystemResourceAsStream("config/application.properties");ResourceBundle resourceBundle = new PropertyResourceBundle(inputStream);Enumeration<String> keys = resourceBundle.getKeys();while (keys.hasMoreElements()) {String s = keys.nextElement();System.out.println(s + " = " + resourceBundle.getString(s));}}

8. 使用ResourceBundle.getBundle读取

 /*** 8. 方式八* ResourceBundle.getBundle的路径访问和 Class.getClassLoader.getResourceAsStream类似,默认从根目录下读取,也可以读取resources目录下的文件* ResourceBundle rb = ResourceBundle.getBundle("b") //不需要指定文件名的后缀,只需要写文件名前缀即可*/@Testpublic void test8(){//ResourceBundle rb = ResourceBundle.getBundle("jdbc"); //读取resources目录下的jdbc.propertiesResourceBundle rb2 = ResourceBundle.getBundle("config/application");//读取resources/config目录下的application.propertiesfor(String key : rb2.keySet()){String value = rb2.getString(key);System.out.println(key + ":" + value);}}

输出结果:

minio.endpoint:http://localhost:9000
minio.bucketName:demo
minio.secretKey:minioadmin
minio.accessKey:minioadmin

六、Properties配合Spring框架使用

  • 加载.properties方式一
<!-- 1.加载 jdbc.properties 配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties" system-properties-mode="NEVER"/>

除了上面这种方式之外,还有下面这种List集合的方式

  • 加载.properties方式二
 <!-- 4.引入外部配置文件 由于后期可能会引入多个配置文件 所以采用list的形式 --><bean id="propertyPlaceholder"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="locations"><list><value>classpath:/config/jdbc.properties</value><value>classpath:/config/application.properties</value></list></property></bean>

七、完整代码

import org.junit.Test;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;/*** @desc: Properties读取配置文件属性值的方式* @author: cao_wencao* @date: 2020-12-29 10:08*/
public class PropertiesTest {/*** 1. 方式一* 从当前的类加载器的getResourcesAsStream来获取* InputStream inputStream = this.getClass().getResourceAsStream(name)** @throws IOException*/@Testpublic void test1() throws IOException {InputStream inputStream = this.getClass().getResourceAsStream("jdbc.properties");Properties properties = new Properties();properties.load(inputStream);properties.list(System.out);System.out.println("==============================================");String property = properties.getProperty("jdbc.url");System.out.println("property = " + property);}/*** 2. 方式二* 从当前的类加载器的getResourcesAsStream来获取* InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(name)** @throws IOException*/@Testpublic void test5() throws IOException {InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("config/application.properties");Properties properties = new Properties();properties.load(inputStream);properties.list(System.out);System.out.println("==============================================");String property = properties.getProperty("minio.endpoint");System.out.println("property = " + property);}/*** 3. 方式三* 使用Class类的getSystemResourceAsStream方法 和使用当前类的ClassLoader是一样的* InputStream inputStream = ClassLoader.getSystemResourceAsStream(name)** @throws IOException*/@Testpublic void test4() throws IOException {InputStream inputStream = ClassLoader.getSystemResourceAsStream("config/application.properties");Properties properties = new Properties();properties.load(inputStream);properties.list(System.out);System.out.println("==============================================");String property = properties.getProperty("minio.endpoint");System.out.println("property = " + property);}/*** 4. 方式四* Resource resource = new ClassPathResource(path)** @throws IOException*/@Testpublic void test2() throws IOException {Resource resource = new ClassPathResource("config/application.properties");Properties properties = PropertiesLoaderUtils.loadProperties(resource);properties.list(System.out);System.out.println("==============================================");String property = properties.getProperty("minio.endpoint");System.out.println("property = " + property);}/*** 5. 方式五* 从文件中获取,使用InputStream字节,主要是需要加上当前配置文件所在的项目src目录地址。路径配置需要精确到绝对地址级别* BufferedInputStream继承自InputStream* InputStream inputStream = new BufferedInputStream(new FileInputStream(name)* 这种方法读取需要完整的路径,优点是可以读取任意路径下的文件,缺点是不太灵活* @throws IOException*/@Testpublic void test3() throws IOException {InputStream inputStream = new BufferedInputStream(new FileInputStream("src/main/resources/config/application.properties"));Properties properties = new Properties();properties.load(inputStream);properties.list(System.out);System.out.println("==============================================");String property = properties.getProperty("minio.endpoint");System.out.println("property = " + property);}/*** 6. 方式六* 从文件中获取,使用InputStream字节,主要是需要加上当前配置文件所在的项目src目录地址。路径配置需要精确到绝对地址级别* FileInputStream继承自InputStream* InputStream inputStream = new FileInputStream(name)* 这种方法读取需要完整的路径,优点是可以读取任意路径下的文件,缺点是不太灵活* @throws IOException*/@Testpublic void test6() throws IOException {InputStream inputStream = new FileInputStream("src/main/resources/config/application.properties");Properties properties = new Properties();properties.load(inputStream);properties.list(System.out);System.out.println("==============================================");String property = properties.getProperty("minio.endpoint");System.out.println("property = " + property);}/*** 7. 方式七* 使用InputStream流来进行操作ResourceBundle,获取流的方式由以上几种。* ResourceBundle resourceBundle = new PropertyResourceBundle(inputStream);* @throws IOException*/@Testpublic void test7() throws IOException {InputStream inputStream = ClassLoader.getSystemResourceAsStream("config/application.properties");ResourceBundle resourceBundle = new PropertyResourceBundle(inputStream);Enumeration<String> keys = resourceBundle.getKeys();while (keys.hasMoreElements()) {String s = keys.nextElement();System.out.println(s + " = " + resourceBundle.getString(s));}}/*** 8. 方式八* ResourceBundle.getBundle的路径访问和 Class.getClassLoader.getResourceAsStream类似,默认从根目录下读取,也可以读取resources目录下的文件* ResourceBundle rb = ResourceBundle.getBundle("b") //不需要指定文件名的后缀,只需要写文件名前缀即可*/@Testpublic void test8(){//ResourceBundle rb = ResourceBundle.getBundle("jdbc"); //读取resources目录下的jdbc.propertiesResourceBundle rb2 = ResourceBundle.getBundle("config/application");//读取resources/config目录下的application.propertiesfor(String key : rb2.keySet()){String value = rb2.getString(key);System.out.println(key + ":" + value);}}/*** 单独抽取的方法,用户检测能否正确操纵Properties** @param inputStream* @throws IOException*/private void printKeyValue(InputStream inputStream) throws IOException {Properties properties = new Properties();properties.load(inputStream);Set<Object> keys = properties.keySet();for (Object key : keys) {System.out.println(key + " = " + properties.get(key));}}
}

这篇关于Java中读取properties配置文件的八种方式总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/863401

相关文章

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B