java加载配置文件_Java 使用properties配置文件加载配置

本文介绍了在Java中如何从properties配置文件加载数据库配置信息,强调了将配置文件放在资源目录下并正确读取的重要性。通过示例展示了使用Class对象的getResourceAsStream方法从部署目录加载资源,以及获取Class对象的三种方式,避免了运行时找不到资源文件的问题。
摘要由CSDN通过智能技术生成

一般我们不把数据库的配置信息写死在代码中。

写好代码后,编译、调试,成功后只把输出目录中的东西(jar包、.class文件、资源文件等)拷贝到服务器上,由运维来管理。服务器上是没有源文件的(.java文件),我们我们把数据库的配置信息写死在代码中,运维就不能修改数据库的配置了,如果要换服务器、要换数据库、要改数据库的密码了,运维是改不了的,只能由我们修改源码,重新编译、部署。

通常的做法是,把配置信息写在配置文件(文本文件)中,从配置文件中加载配置信息,这样运维就可以直接修改配置了,无需改动源码。

示例:

1、项目根目录下新建文件夹resource,右键标识为资源根目录

0ceec832abab61514a6a0ead8abc2aca.png

Source Root是源码的根目录,默认为src;

Test Source Root是调试的根目录,比如JUnit调试的根目录;

Resource Root是资源文件的根目录,常用来放置配置文件,也可以放置其他资源文件,比如新建子文件夹images,下面放置图片。

2、在resource下新建文件mysql.properties,内容如下:

driver=com.mysql.cj.jdbc.Driver

url=jdbc:mysql://localhost:3306/my_db?serverTimezone=GMT

user=chy

password=abcd

3、在.java文件中获取配置信息

1 //从properties文件中加载数据库配置

2 Properties properties = newProperties();3 FileInputStream inputStream = new FileInputStream("resource/mysql.properties"); //注意路径4 properties.load(inputStream);5

6 String driver = properties.getProperty("driver");7 String url = properties.getProperty("url");8 String user = properties.getProperty("user");9 String pwd=properties.getProperty("password");10

11 Class.forName(driver);12 Connection connection =DriverManager.getConnection(url, user, pwd);13

14 //....

运行,效果正常。

但是,还是有问题。

FileInputStream inputStream = new FileInputStream("resource/mysql.properties");

这种加载资源的方式是从原项目中加载资源的,不是从部署的项目(输出目录)中加载资源的,你把部署好的项目拷给运维,运行报错:找不到这个资源文件。

实际上,你不把resource文件夹标识为资源根目录,效果也是对的。因为是从原项目中加载的资源文件。

标识为Resource Root后,运行|调试时才会把这个目录复制到输出目录(部署目录)。

正确的做法:通过反射(Class对象)来加载资源文件

InputStream inputStream = 当前类的Class对象.getResourceAsStream("/mysql.properties");

获取当前类的Class对象,有3种方式:

(1)通过当前类的实例来获取Class对象

InputStream inputStream = this.getClass().getResourceAsStream("/mysql.properties"); //注意路径

getClass()是实例方法,只能通过对象来引用,不能通过类名来引用。

这种方式有个缺陷,因为使用的是this,所以这句代码所在的方法不能是静态的(static,类方法)。

当然,硬要写成静态方法也行:

InputStream inputStream = new test.Test().getClass().getResourceAsStream("/mysql.properties");

不使用this,而是new一个当前类的实例。

(2)通过当前类的class属性来获取Class对象

InputStream inputStream=Test.class.getResourceAsStream("/mysql.properties"); //每个类都有class属性

(3)通过Class.forName("全类名")来获取Class对象

InputStream inputStream=Class.forName("test.Test").getResourceAsStream("/mysql.properties"); //forName()里是当前类的全类名

路径问题

可以看到,这2种写法,资源文件的路径都是/开头,路径中并没有resource文件夹。

这2种都是从输出目录(部署目录)中加载资源文件。只有标识为Resource Root的文件夹run|debug时才会拷贝到输出目录|目录,拷贝时不拷贝资源根目录resource,直接把resource下的子文件、子文件夹拷贝到输出目录中项目的根目录下,所以路径以/开头,/表示项目的根目录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值