使用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读取配置文件的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot获取不到用户真实IP的解决方法

    SpringBoot获取不到用户真实IP的解决方法

    最近遇到个问题,项目部署后发现服务端无法获取到客户端真实的IP地址,本文就来介绍一下这个问题的解决方法,感兴趣的可以了解一下
    2023-08-08
  • java基于ConcurrentHashMap设计细粒度实现代码

    java基于ConcurrentHashMap设计细粒度实现代码

    这篇文章主要介绍了java基于ConcurrentHashMap设计细粒度实现代码,通过ConcurrentHashMap实现细粒度,具有一定参考价值,需要的朋友可以了解。
    2017-10-10
  • Java中的CopyOnWriteArrayList解析

    Java中的CopyOnWriteArrayList解析

    这篇文章主要介绍了Java中的CopyOnWriteArrayList解析,ArrayList是非线程安全的,也就是说在多个线程下进行读写,会出现异常,既然是非线程安全,那我们就使用一些机制把它变安全不就好了,需要的朋友可以参考下
    2023-12-12
  • idea打不开双击IDEA图标没反应的快速解决方案

    idea打不开双击IDEA图标没反应的快速解决方案

    这篇文章主要介绍了idea打不开双击IDEA图标没反应的快速解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • 深度解析Spring AI请求与响应机制的核心逻辑

    深度解析Spring AI请求与响应机制的核心逻辑

    我们在前面的两个章节中基本上对Spring Boot 3版本的新变化进行了全面的回顾,以确保在接下来研究Spring AI时能够避免任何潜在的问题,本文给大家介绍Spring AI请求与响应机制的核心逻辑,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • mybatis-plus 新增/修改如何实现自动填充指定字段

    mybatis-plus 新增/修改如何实现自动填充指定字段

    这篇文章主要介绍了mybatis-plus 新增/修改实现自动填充指定字段方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Android中PreferenceActivity使用详解

    Android中PreferenceActivity使用详解

    本文主要介绍了Android中PreferenceActivity使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 解决Mybatis-Plus操作分页后数据失效问题

    解决Mybatis-Plus操作分页后数据失效问题

    这篇文章主要介绍了解决Mybatis-Plus操作分页后数据失效问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Mybatis的类型转换接口TypeHandler

    Mybatis的类型转换接口TypeHandler

    这篇文章主要介绍了Mybatis的类型转换接口TypeHandler,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • SpringSecurity的@EnableWebSecurity注解详解

    SpringSecurity的@EnableWebSecurity注解详解

    这篇文章主要介绍了SpringSecurity的@EnableWebSecurity注解详解,@EnableWebSecurity是开启SpringSecurity的默认行为,它的上面有一个Import注解导入了WebSecurityConfiguration类,就是往IOC容器中注入了WebSecurityConfiguration这个类,需要的朋友可以参考下
    2023-11-11

最新评论