使用Properties读取配置文件的示例详解

 更新时间:2023年06月26日 10:17:05   作者:东方甲乙木土  
开发SpringBoot项目时,使用配置文件配置项目相关属性是必不可少的,所以下文为大家准备了使用Properties读取配置文件的示例代码,希望对大家有所帮助

1. 配置文件信息

1.1 项目默认配置文件

开发SpringBoot项目时,使用配置文件配置项目相关属性是必不可少的,SpringBoot也为我们提供了一些默认的配置文件格式。

  • application.properties,以键值对的方式配置属性值
  • application.yml:以数据对象的方式配置属性值

配置文件存放位置:src/resource/

按照SpringBoot给定的格式和位置创建文件并定义相关属性值后,SpringBoot项目会在启动时自动加载属性值。

1.2 自定义配置文件

除了官方指定的配置文件,我们还可以自定义一个配置文件,并在合适的时候使用其中的配置信息,如db.properties、jdbc.properties、mybatis.properties。

但是由于SpringBoot对application.properties配置文件的自动加载,大部分的属性定义都可以在主配置文件中完成了,并使用@value等方法获取配置内容。

但是如果我们需要将一系列相关配置放在一个单独的.properties文件中,这种情况下如何在项目中加载配置文件并读取其中内容呢?这个时候就需要Properties出场了。

2. Properties

2.1 认识Properties类

Properties类对应SpringBoot中的application.properties文件,定义为一系列属性的集合,可以从流中读取属性或将属性保存到流中,且属性中值都是字符串格式。

Properties类作为一个集合,继承了Hashaable类,因此是线程安全的。

class Properties extends Hashtable<Object,Object>{
    ...
    public Properties() {
        this(null);
    }
    ...
}

Properties初始化实例时也比较简单,只需要使用new关键字调用类的无参构造方法创建对象即可。

Properties properties = new Properties();

2.2 读取流

Properties类中提供了load()方法来读取流中的内容,创建对象后,调用对象的load()方法,并提供字节流作为参数,就可以读取字节中属性内容。

简要的读取流程可以描述为:

  • 创建Properties类对象
  • 使用对象的load()方法读取流文件
  • 对象中读取属性数据后,使用getProperty()方法获取属性值

根据方法参数的不同,Properties中定义了两个同名的load()方法,两种方法本质上都是调用了内部的load0()方法,用来从字节流中获取数据内容。

//以Reader对象作为参数读取
public synchronized void load(Reader reader) throws IOException {
    load0(new LineReader(reader));
}
​
//以InputStream作为参数读取
public synchronized void load(InputStream inStream) throws IOException {
    load0(new LineReader(inStream));
}

读取到配置文件后,Properties对象还提供了getProperty(String key)方法来获取指定属性的值,如果在配置中当前属性不存在,则返回null值;

或者使用另一个getProperty(String key, String defaultValue)方法在获取属性时指定一个默认值,如果属性不存在则使用指定值代替null。

//获取key对应值,如果key不存在,则返回null
public String getProperty(String key) {
    Object oval = super.get(key);
    String sval = (oval instanceof String) ? (String)oval : null;
    return ((sval == null) && (defaults != null)) ? defaults.getProperty(key) : sval;
}
​
//如果不存在key,则返回defaultValue
public String getProperty(String key, String defaultValue) {
    String val = getProperty(key);
    return (val == null) ? defaultValue : val;
}

2.3 输出到流

使用Properties对象将属性输出到字节流中的流程可以表示为:

  • 实例化一个Properties对象,
  • Properties对象使用setProperty()方法设置属性和值,
  • 调用对象的store()方法将对象通过字节流保存到相应文件。

对应的方法定义有:

//设置属性,本质是Hashtable的put方法
public synchronized Object setProperty(String key, String value) {
    return put(key, value);
}
​
//输出为字符流对象Writer
public void store(Writer writer, String comments)
        throws IOException
{
    store0((writer instanceof BufferedWriter)?(BufferedWriter)writer
           : new BufferedWriter(writer),
           comments,
           false);
}
​
//输出为OutputStream流
public void store(OutputStream流 out, String comments)
        throws IOException
{
    store0(new BufferedWriter(new OutputStreamWriter(out, "8859_1")),
           comments,
           true);
}

3. 读取配置文件的几种方式

了解Properties读取文件的流程后,来看一下实际在项目中读取自定义配置文件内容的方式都有哪些。

1.类的getResourceAsStream方法

//类的getResourceAsStream方法,路径加"/"时代表读取resources目录下内容
InputStream inputStream = PropertiesUtils.class.getResourceAsStream方法,路径加"/"时代表读取resources目录下内容("/test.properties");
Properties properties = new Properties();
properties.load(inputStream);
System.out.println(properties.getProperty("test.content"));

2.类启动器的getResourceAsStream方法

//类启动器的getResourceAsStream方法,默认获取路径为src/resources下的文件
InputStream inputStream = PropertiesUtils.class.getClassLoader().getResourceAsStream("test.properties");
Properties properties = new Properties();
properties.load(inputStream);
System.out.println(properties.getProperty("test.content"));

3.PropertiesLoaderUtils工具类的loadAllProperties()方法

// PropertiesLoaderUtils类的loadAllProperties()方法,读取resources目录
Properties properties = PropertiesLoaderUtils.loadAllProperties("test.properties");
System.out.println(properties.getProperty("test.content"));

以上就是使用Properties读取配置文件的示例详解的详细内容,更多关于Properties读取配置文件的资料请关注脚本之家其它相关文章!

相关文章

  • java 算法 6种排序小结

    java 算法 6种排序小结

    这篇文章主要介绍了java 算法 6种排序,排序原理及实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • 使用maven打包/跳过某个modules

    使用maven打包/跳过某个modules

    本文总结了在Maven项目中跳过或单独构建模块的方法,包括使用`-pl`、`-am`和`-amd`参数来选择性地执行模块构建,以及通过`-Dmaven.test.skip`跳过测试,以提高构建效率
    2024-12-12
  • JAVA实现PDF转HTML文档的示例代码

    JAVA实现PDF转HTML文档的示例代码

    本文是基于PDF文档转PNG图片,然后进行图片拼接,拼接后的图片转为base64字符串,然后拼接html文档写入html文件实现PDF文档转HTML文档,感兴趣的可以了解一下
    2021-05-05
  • SpringBoot封装自己的Starter的实现方法

    SpringBoot封装自己的Starter的实现方法

    这篇文章主要介绍了SpringBoot封装自己的Starter的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • Mybatis Select Count(*)的返回值类型介绍

    Mybatis Select Count(*)的返回值类型介绍

    这篇文章主要介绍了Mybatis Select Count(*)的返回值类型,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 详解Spring中实现接口动态的解决方法

    详解Spring中实现接口动态的解决方法

    最近在工作遇到的一个,发现网上的资料较少,所以想着总结分享下,下面这篇文章主要给大家介绍了关于Spring中实现接口动态的解决方法,文中通过完整的示例代码给大家介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧。
    2017-07-07
  • Java Redis Redisson配置教程详解

    Java Redis Redisson配置教程详解

    这篇文章主要介绍了Java Redis Redisson配置教程,包括Session共享配置及其他Redisson的Config配置方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • Java实现萝卜勇者游戏的示例代码

    Java实现萝卜勇者游戏的示例代码

    《萝卜勇者》是由国内玩家自制的一款独立游戏,玩家扮演萝卜勇士闯关,打败各种邪恶的敌人,获得最后的胜利。本文将利用Java实现这一游戏,感兴趣的可以了解一下
    2022-02-02
  • SpringBoot访问接口自动跳转login页面的问题及解决

    SpringBoot访问接口自动跳转login页面的问题及解决

    这篇文章主要介绍了SpringBoot访问接口自动跳转login页面的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Hashmap非线程安全关于hash值冲突处理

    Hashmap非线程安全关于hash值冲突处理

    这篇文章主要为大家介绍了Hashmap非线程安全关于hash值冲突的处理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04

最新评论