使用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编译时与运行时概念与实例详解

    java编译时与运行时概念与实例详解

    本篇文章通过实例对 java程序编译时与运行时进行了详解,需要的朋友可以参考下
    2017-04-04
  • 学会Pulsar Consumer的使用方式

    学会Pulsar Consumer的使用方式

    这篇文章主要介绍了Pulsar Consumer的使用方式,全文使用大量的代码来做了详细的讲解,感兴趣的小伙伴可以参考一下这篇文章,希望读完能对你有很大的帮助
    2021-08-08
  • Java虚拟机之类加载

    Java虚拟机之类加载

    这篇文章主要介绍了Java虚拟机之类加载,文中有非常详细的代码示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • Nacos集群模式下服务无法注册问题

    Nacos集群模式下服务无法注册问题

    这篇文章主要介绍了Nacos集群模式下服务无法注册问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • IDEA 2020.1打开时闪退的问题及解决方法(完美解决方法)

    IDEA 2020.1打开时闪退的问题及解决方法(完美解决方法)

    这篇文章主要介绍了IDEA 2020.1打开时闪退问题及解决方法,本文给大家分享我的处理方案,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • Java集合框架之Map详解

    Java集合框架之Map详解

    这篇文章主要为大家详细介绍了Java集合框架之Map,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 简单实现Servlet文件下载功能

    简单实现Servlet文件下载功能

    这篇文章主要教大家如何简单实现Servlet文件下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • java的SimpleDateFormat线程不安全的几种解决方案

    java的SimpleDateFormat线程不安全的几种解决方案

    但我们知道SimpleDateFormat是线程不安全的,处理时要特别小心,要加锁或者不能定义为static,要在方法内new出对象,再进行格式化,本文就介绍了几种方法,感兴趣的可以了解一下
    2021-08-08
  • Java自定义函数调用方法解析

    Java自定义函数调用方法解析

    这篇文章主要介绍了java自定义函数调用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java中Date和LocalDate区别与介绍

    Java中Date和LocalDate区别与介绍

    本文主要介绍了Java中Date和LocalDate区别与介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07

最新评论