读取properties文件的6种方式,建议收藏!

开通VIP,畅享免费电子书等14项超值服

首页

好书

留言交流

下载APP

联系客服

2023.07.10广东

你好,我是田哥

手写分布式配置中心一步一个脚印正在进行中。

这年头基本上都是使用SpringBoot开发,然后都知道在项目中会有个application.properties配置文件(也有的是application.yaml,反正就是用来保存我们的一些配置信息),通常我们会把一些配置信息写到properties文件中,比如:数据库连接信息、第三方接口信息(密钥、用户名、密码、地址等),连接池、Redis配置信息、各种第三方组件配置信息等。

单体服务,甚至一些小型的分布式架构中,项目的配置都是依赖一个application.properties配置文件来解决(可能有的项目会搞一个环境区分,比如:application-dev.properties、application-pro.properties等)。不过,可能伴随着业务的发展和架构不断升级,服务的数据以及每个服务涉及到配置信息会越来越多,并且对于配置管理的要求也是越来越高,比如配置信息的实时性、独立性等。

同时,我们在微服务架构下,可能还会涉及到不同环境下的配置管理、灰度发布、动态限流、动态降级等需求,包括对于配置内容的安全与权限,所以传统的配置维护方式很难达到需求。

于是,分布式配置中心就在这样的环境下产生了。

本文我们先搞清楚java中读取properties配置文件,到底有哪些方法。

需求是我们项目中有个jdbc.properties配置文件,内如如下:

jdbc.driver=com.mysql.cj.jdbc.Driverjdbc.url=mysql://localhost:3306/databaseuseUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghaijdbc.username=rootjdbc.password=123456现在是想要在java代码中获取上面配置文件内容。

第一种方式我们采用:this.getClass().getResourceAsStream()+Properties

代码实现:

具体文件和代码的位置是,代码在src/main/java目录下,资源文件在src/main/resources/目录下。

会从当前类的目录下去找,这个文件如果不和该类在一个目录下,就找不到。

会从编译后的整个classes目录下去找,maven也会把资源文件打包进classes文件夹,所以可以找到。

ClassLoader就是从整个classes文件夹找的,所以前面无需再加/

类关系图:

从上面的类图可以看到Properties类继承至Hashtable,相信大家都知道Hashtable是存储key-value数据结构类,也刚好对应我们properties文件内容也是key-value形式。

getProperty(Stringkey):在此属性列表中搜索具有指定键的属性。如果在此属性列表中找不到该键,则会检查默认属性列表及其默认值(递归)。如果未找到该属性,则该方法返回默认值参数。

list(PrintStreamout)将此属性列表打印到指定的输出流。此方法对于调试很有用。

load(InputStreaminStream):从输入字节流中读取属性列表(键和元素对)。输入流采用加载(Reader)中指定的简单的面向行的格式,并假定使用ISO8859-1字符编码;即每个字节是一个Latin1字符。不在Latin1中的字符和某些特殊字符在使用Unicode转义符的键和元素中表示。此方法返回后,指定的流仍保持打开状态。

setProperty(Stringkey,Stringvalue):调用Hashtable的方法put。他通过调用基类的put方法来设置键值对。

store(OutputStreamout,Stringcomments):将此Properties表中的此属性列表(键和元素对)以适合使用load(InputStream)方法加载到Properties表的格式写入输出流。此Properties方法不会写出此Properties表的defaults表中的属性(如果有)。

storeToXML(OutputStreamos,Stringcomment,Stringencoding):使用指定的编码发出表示此表中包含的所有属性的XML文档。

clear():清除此哈希表,使其不包含任何键。

stringPropertyNames():返回此属性列表中的一组键,其中键及其对应的值是字符串,如果尚未从主属性列表中找到相同名称的键,则包括默认属性列表中的不同键。键或键不是String类型的属性将被省略。

publicStringgetProperty(Stringkey){Objectoval=super.get(key);Stringsval=(ovalinstanceofString)(String)oval:null;return((sval==null)&&(defaults!=null))defaults.getProperty(key):sval;}super.get(key);就是调用Hashtable中的get()方法,也就是此时返回value,同时这就对应返回了properties文件中key对应的value。

第二种方式,我们通过当前类的加载器进行读取this.getClass().getClassLoader().getResourceAsStream()获取InputStream。

剩下的部分代码和第一种方式一样,这里就不在赘述了。

接下来我们采用ClassLoader类的static方法getSystemResourceAsStream()。

说白了就是获取InputStream的方式不同罢了,最终还是交给Properties去解析jdbc.properties文件内容。

我们在实际开发中,基本上都是离不开Spring了,所以,接下来我们使用Spring中的ClassPathResource读取配置文件。

org.springframework.core.io.support.PropertiesLoaderUtils。

PropertiesLoaderUtils.loadProperties(resource)源码部分:

publicstaticPropertiesloadProperties(EncodedResourceresource)throwsIOException{//创建一个Properties对象Propertiesprops=newProperties();//处理文件内容并赋值给propsfillProperties(props,resource);returnprops;}fillProperties(props,resource);方法:

publicvoidload(Propertiesprops,InputStreamis)throwsIOException{props.load(is);}这里又回到Properties类中的load()方法里了。

绕了半天也只是获取InputStream的方式不同而已

接下来我们来使用PropertyResourceBundle读取InputStream流,实现配置文件读取。

publicvoidreadProperties5()throwsIOException{InputStreaminputStream=ClassLoader.getSystemResourceAsStream("jdbc.properties");//InputStreaminputStream=ClassLoader.getSystemResourceAsStream("config/jdbc.properties");PropertyResourceBundlebundle=newPropertyResourceBundle(inputStream);System.out.println(bundle.getString("jdbc.driver"));System.out.println(bundle.getString("jdbc.url"));System.out.println(bundle.getString("jdbc.username"));System.out.println(bundle.getString("jdbc.password"));}好像也没什么,

我们来看看newPropertyResourceBundle(inputStream);源码部分:

publicPropertyResourceBundle(InputStreamstream)throwsIOException{Propertiesproperties=newProperties();properties.load(stream);lookup=newHashMap(properties);}这个构造方法里直接new了一个Properties对象。然后调用load方法解析。

所以,这种方式无非就是在Properties基础之上再封装了,也就是让我们使用起来更加方便。

所以,上面代码中的bundle.getString("jdbc.url")其实调用的是父类中方法;

publicfinalStringgetString(Stringkey){return(String)getObject(key);}最终调用到PropertyResourceBundle的handleGetObject()方法:

publicObjecthandleGetObject(Stringkey){if(key==null){thrownewNullPointerException();}returnlookup.get(key);}lookup就是一个HashMap:lookup=newHashMap(properties);

第五种方式中我们看到了ResourceBundle,接下来我们就是用ResourceBundle.getBundle()实现。

//不用输入后缀publicvoidreadProperties6(){ResourceBundlebundle=ResourceBundle.getBundle("jdbc");System.out.println(bundle.getString("jdbc.driver"));System.out.println(bundle.getString("jdbc.url"));System.out.println(bundle.getString("jdbc.username"));System.out.println(bundle.getString("jdbc.password"));}直接使用文件名称就可以了,不需要写文件后缀名。

java.util.ResourceBundle.getBundle(StringbaseName)方法获取使用指定的基本名称,不需要文件后缀名,默认的语言环境和调用者的类加载器获取资源包。

THE END
1.selenium自动化测试Java自动化测试开发中,需要将一些易变的配置参数放置再 XML 配置文件或者 properties 配置文件中。然而 XML 配置文件需要通过 DOM 或 SAX 方式解析,而读取 properties 配置文件就比较容易。因此今天宏哥讲解和分享如何读取properties配置文件的内容。 2.properties文件简介 java中的properties文件是一种配置文件,主要用于表https://cloud.tencent.com/developer/article/1953167
2.6.SpringBoot配置文件(ymlproperties)?使用配置文件?本文详细介绍了SpringBoot中YAML和properties两种配置文件的使用,包括它们的结构、规则和注入方式。@ConfigurationProperties适合批量注入配置,@Value适用于单个属性注入。文章还探讨了配置文件的占位符、读取、加载顺序以及不同环境的配置策略。 摘要由CSDN通过智能技术生成 https://blog.csdn.net/qq_45305209/article/details/130470289
3.加入properties文件后报错mob6454cc63af5e的技术博客加入properties文件后报错 Bin 目录用来存放编译的结果,bin是二进制binrary的英文缩写,因为最初C编译的程序文件都是二进制文件,它有Debug和Release两个版本,分别对应的文件夹为bin/Debug和bin/Release,这个文件夹是默认的输出路径,我们可以通过:项目属性—>配置属性—>输出路径来修改。https://blog.51cto.com/u_16099181/12838828
4.SpringBoot配置文件格式—properties和yml虽然properties文件比较常见,但是相对于properties而言,yaml更加简洁明了,而且使用的场景也更多,很多开源项目都是使用 yaml进行配置。除了简洁,yaml还有另外一个特点,就是yaml中的数据是有序的,properties中的数据是无序的,在一些需要路径匹配的配置中,顺序就显得尤为重要(例如我们在SpringCloud-Zuul中的配置),https://baijiahao.baidu.com/s?id=1766310050451174842&wfr=spider&for=pc
5.PROPERTIES文件扩展名:它是什么以及如何打开它?这些PROPERTIES 文件可以使用 五 种已知的软件应用程序查看,这些应用程序通常是由Microsoft Corporation开发的Microsoft Notepad。 它与 二 种主要文件类型相关联,但经常以Minecraft Properties File格式出现。 这些文件分为Game Files或 Settings Files。 在大多数情况下,这些文件属于Game Files。 https://www.solvusoft.com/zh-cn/file-extensions/file-extension-properties/
6.使用Properties读取配置文件的示例详解java开发SpringBoot项目时,使用配置文件配置项目相关属性是必不可少的,所以下文为大家准备了使用Properties读取配置文件的示例代码,希望对大家有所帮助+ 目录 1. 配置文件信息 1.1 项目默认配置文件 开发SpringBoot项目时,使用配置文件配置项目相关属性是必不可少的,SpringBoot也为我们提供了一些默认的配置文件格式。 https://www.jb51.net/program/2903076xw.htm
7.SpringBoot配置文件application.properties的概念及用法,详解属性优先级:Spring Boot 支持多个配置文件,属性可以通过多种方式设置(环境变量、命令行参数等)。要注意属性的优先级,以确保最终生效的是你期望的值。 格式要求:属性文件必须符合标准的.properties文件格式,即键值对之间用等号(=)分隔,不要添加额外的空格。 https://apifox.com/apiskills/spring-boot-application-properties/
8.科学网—ubuntu下zookeeperkafka部署3、cd /opt进入目录,解压文件sudo tar zxvf kafka_2.10-0.8.2.0.tgz 4、改解压后的文件名,mv kafka_2.10-0.8.2.0.tgz kafka 5、进入kafka/config目录,修改server.properties文件(vi server.properties)(i 输入 ,esc退出编辑,:wq保存修改) broker.id=2 https://blog.sciencenet.cn/blog-3054301-967546.html
9..properties(Java配置文件)各种语言都有自己所支持的配置文件,配置文件中很多变量是经常改变的,这样做也是为了方便用户,让用户能够脱离程序本身去修改相关的变量设置。像Python支持的配置文件是.ini文件,同样,它也有自己读取配置文件的类ConfigParse,方便程序员或用户通过该类的方法来修改.ini配置文件。在Java中,其配置文件常为.properties文件,格https://www.jianshu.com/p/a954485d9b82
10.Java中的Properties类详解Properties配置文件Properties(Java.util.Properties),该类主要用于读取Java的配置文件,不同的编程语言有自己所支持的配置文件,配置文件中很多变量是经常改变的,为了方便用户的配置,能让用户够脱离程序本身去修改相关的变量设置。就像在Java中,其配置文件常为.properties文件,是以键值对的形式进行参数配置的。 https://www.huoban.com/news/post/15761.html