写点什么

你会几种读取 / 加载 properties 配置文件方法

  • 2022 年 1 月 25 日
  • 本文字数:4289 字

    阅读完需:约 14 分钟

摘要:在 java 项目中经常会使用到配置文件,这里就介绍几种加载配置文件的方法。


本文分享自华为云社区《【Java】读取/加载 properties配置文件的几种方法》,作者:Copy 工程师。

说明


在 java 项目中经常会使用到配置文件,这里就介绍几种加载配置文件的方法

目录结构



我是使用的 maven 搭建的项目,resources 其实就是在根目录下

配置文件很简单



一、 基于 ClassLoader 读取配置文件


注意:有局限性 只能在类路径下比较方便


Properties properties = new Properties();// 注意这里的路径是根据根目录写的InputStream in = ReadProperties.class.getClassLoader().getResourceAsStream("conf/demo.properties");properties.load(in);System.out.println("1111111111111---->:"+properties.getProperty("name"));
输出:1111111111111---->:xing
复制代码

二、基于 InputStream 读取配置文件


Properties properties2 = new Properties();// 以下两种获取文件流的方式都可以,对于小文件第一种更快一点
// 通过BufferedReader获取文件流try (BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath))) { properties2.load(bufferedReader); System.out.println("22222222222---->:"+properties2.getProperty("name"));}catch (Exception e){ e.printStackTrace();}// 通过FileInputStreamm获取文件流InputStream in2 = new FileInputStream(new File(filePath));properties2.load(in2);System.out.println("22222222222---->:"+properties2.getProperty("name"));
输出:22222222222---->:xing22222222222---->:xing
复制代码


三、基于 ResourceBundle 读取配置文件


// 1. 通过ResourceBundle.getBundle() 静态方法来获取文件 这种方式不需要添加后缀名 // 注意这里的ResourceBundle.getBundle("conf/demo") 这里不需要写配置文件的后缀 只需要名字即可 xml没试过 这里是propertiesResourceBundle resourceBundle = ResourceBundle.getBundle("conf/demo");System.out.println("333333333333----->:"+resourceBundle.getString("name"));// 2. 通过InputStream读取文件InputStream in3 = new FileInputStream(new File(filePath));ResourceBundle resourceBundle2 = new PropertyResourceBundle(in3);System.out.println("333333333333----->:"+resourceBundle2.getString("name"));
输出:333333333333----->:xing333333333333----->:xing
复制代码

四、基于 PropertiesConfiguration 读取配置文件 需要使用第三方的包


这是我推荐使用的方法,毕竟有大腿在,干嘛不去抱大腿,嘿嘿。我使用的包是 commons-configuration2.x 。记住这是版本 2 ,不是版本 1, 2 和 1 有很大的差别的。


<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-configuration2 --><dependency>    <groupId>org.apache.commons</groupId>    <artifactId>commons-configuration2</artifactId>    <version>2.2</version></dependency>
复制代码


try {	// 直接通过路径读取文件    Configurations configurations = new Configurations();    FileBasedConfigurationBuilder.setDefaultEncoding(PropertiesConfiguration.class, "UTF-8");    PropertiesConfiguration propertiesConfiguration = configurations.properties(filePath);    System.out.println("444444444444----->:"+propertiesConfiguration.getString("name"));    //通过reader 读取文件 找了找好像没有通过InputStream读取文件的方式    PropertiesConfiguration propertiesConfiguration1 = new PropertiesConfiguration();    propertiesConfiguration1.read(new BufferedReader(new FileReader(new File(filePath))));    System.out.println("555555555555----->:"+propertiesConfiguration1.getString("name"));} catch (org.apache.commons.configuration2.ex.ConfigurationException e) {    e.printStackTrace();}
输出:444444444444----->:xing555555555555----->:xing
复制代码


整个类:


package com.xing.test;
import org.apache.commons.configuration2.PropertiesConfiguration;import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder;import org.apache.commons.configuration2.builder.fluent.Configurations;import java.io.*;import java.util.Properties;import java.util.PropertyResourceBundle;import java.util.ResourceBundle;
public class ReadProperties { public static void main(String[] args) throws IOException { String filePath = ReadProperties.class.getClassLoader().getResource("conf/demo.properties").getPath();
/** 方法一 * 基于ClassLoader读取配置文件 * 有局限性 只能在类路径下比较方便 */ Properties properties = new Properties(); // 注意这里的路径是根据target/classes 的路径写的 InputStream in = ReadProperties.class.getClassLoader().getResourceAsStream("conf/demo.properties"); properties.load(in); System.out.println("1111111111111---->:"+properties.getProperty("name")); /** 方法二 * 基于InputStream读取配置文件 * */ Properties properties2 = new Properties(); // 两种获取文件流的方式都可以,对于小文件第一种更快一点 // 通过BufferedReader获取文件流 try (BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath))) { properties2.load(bufferedReader); System.out.println("22222222222---->:"+properties2.getProperty("name")); }catch (Exception e){ e.printStackTrace(); } // 通过FileInputStreamm获取文件流 InputStream in2 = new FileInputStream(new File(filePath)); properties2.load(in2); System.out.println("22222222222---->:"+properties2.getProperty("name")); /** 方法三 * 基于ResourceBundle读取配置文件 * */ // 1. 通过ResourceBundle.getBundle() 静态方法来获取文件 这种方式不需要添加后缀名 ResourceBundle resourceBundle = ResourceBundle.getBundle("conf/demo"); System.out.println("333333333333----->:"+resourceBundle.getString("name")); // 2. 通过InputStream读取文件 InputStream in3 = new FileInputStream(new File(filePath)); ResourceBundle resourceBundle2 = new PropertyResourceBundle(in3); System.out.println("333333333333----->:"+resourceBundle2.getString("name")); /** 方法四 * 基于PropertiesConfiguration读取配置文件 需要使用第三方的包 * */
try { Configurations configurations = new Configurations(); FileBasedConfigurationBuilder.setDefaultEncoding(PropertiesConfiguration.class, "UTF-8"); PropertiesConfiguration propertiesConfiguration = configurations.properties(filePath); System.out.println("444444444444----->:"+propertiesConfiguration.getString("name")); //InputStream in4 = new FileInputStream(new File(filePath)); PropertiesConfiguration propertiesConfiguration1 = new PropertiesConfiguration(); propertiesConfiguration1.read(new BufferedReader(new FileReader(new File(filePath)))); System.out.println("555555555555----->:"+propertiesConfiguration1.getString("name")); } catch (org.apache.commons.configuration2.ex.ConfigurationException e) { e.printStackTrace(); } }}
复制代码

后记


通常在读取配置文件的时候都是写个工具类,在程序运行的时候就加载配置文件了。这里简单写了一个,凑合着看吧。


package com.xing.test;import org.apache.commons.configuration2.PropertiesConfiguration;import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder;import org.apache.commons.configuration2.builder.fluent.Configurations;import org.apache.commons.configuration2.ex.ConfigurationException;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;public class PropertiesUtils {
private static final Log log = LogFactory.getLog(PropertiesUtils.class);
private static Configurations configurations = null; private static PropertiesConfiguration propertiesConfiguration = null; private static void initProperties(){ configurations = new Configurations(); FileBasedConfigurationBuilder.setDefaultEncoding(PropertiesConfiguration.class, "UTF-8"); try { propertiesConfiguration = configurations.properties(PropertiesUtils.class.getClassLoader().getResource("conf/demo.properties")); } catch (ConfigurationException e) { log.error("配置文件初始化失败",e); } } static { initProperties(); }
/** * 获取String类型的value * @param key * @return */ public static String getValueString(String key){ if (propertiesConfiguration == null){ initProperties(); } return propertiesConfiguration.getString(key); }
/** * 获取int类型的value * @param key * @return */ public static int getValueInt(String key){ if (propertiesConfiguration == null){ initProperties(); } return propertiesConfiguration.getInt(key, 0); }
}
复制代码


其实这个包还可以自动重载的功能,修改了配置文件不需要重启服务器即可加载重载配置文件。


点击关注,第一时间了解华为云新鲜技术~

发布于: 2 小时前阅读数: 3
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
你会几种读取/加载 properties配置文件方法