Java 使用properties配置文件加载配置
一般我们不把数据库的配置信息写死在代码中。
写好代码后,编译、调试,成功后只把输出目录中的东西(jar包、.class文件、资源文件等)拷贝到服务器上,由运维来管理。服务器上是没有源文件的(.java文件),我们我们把数据库的配置信息写死在代码中,运维就不能修改数据库的配置了,如果要换服务器、要换数据库、要改数据库的密码了,运维是改不了的,只能由我们修改源码,重新编译、部署。
通常的做法是,把配置信息写在配置文件(文本文件)中,从配置文件中加载配置信息,这样运维就可以直接修改配置了,无需改动源码。
示例:
1、项目根目录下新建文件夹resource,右键标识为资源根目录
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 = new properties(); 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后,运行|调试时才会把这个目录复制到输出目录(部署目录)。
正确的做法:通过类加载器(反射)来加载资源文件
有2种写法。
第一种:
inputstream inputstream = this.getclass().getresourceasstream("/mysql.properties"); //注意路径
this.getclass()是获取当前对象的类加载器,getresourceasstream()是加载资源文件,以输入流的方式返回。
getclass()是实例方法,只能通过对象来引用,不能通过类名来引用。
这种方式有个缺陷,因为是this(实例),所以这句代码所在的方法不能是静态的(static,类方法)。
当然,硬要写成静态方法也行:
inputstream inputstream = new test.test().getclass().getresourceasstream("/mysql.properties");
不使用this,而是new一个当前类的实例。
第二种:
inputstream inputstream=class.forname("test.test").getresourceasstream("/mysql.properties"); //forname()里是当前类的全类名
这种对此句代码所在的方法没有要求,可以是类方法(static),也可以是实例方法。推荐。
路径问题
可以看到,这2种写法,资源文件的路径都是/开头,路径中并没有resource文件夹。
这2种都是从输出目录(部署目录)中加载资源文件。只有标识为resource root的文件夹run|debug时才会拷贝到输出目录|目录,拷贝时不拷贝资源根目录resource,直接把resource下的子文件、子文件夹拷贝到输出目录中项目的根目录下,所以路径以/开头,/表示项目的根目录。
上一篇: C++模板Template