背景介绍
在java程序中有时我们需要加载项目中的某些资源文件(如:config.properties之类),以便获取里面的值,这样可以避免某些需要经常修改的数据硬编码入业务程序中
实现方式
实现这种方式需求其实有很多种方式,下面简单介绍三种,各陈利弊:
-
第一种
ClassLoader classLoader = this.getClass().getClassLoader();
Properties prop = new Properties();
prop.load(classLoader.getResourceAsStream("/Application.properties"));
prop.get("");//通过此方法获取文件中的值
弊端:
会发现修改了.properties后,即使重新执行,读入的仍为修改前的参数。此问题的原因在于ClassLoader.getResourceAsStream读入后,会将.properties保存在缓存中,重新执行时会从缓存中读取,而不是再次读取.properties文件
- 第二种
Properties prop = new Properties();
InputStream is = new FileInputStream(绝对路径);
prop.load(is);
prop.get("");//通过此方法获取文件中的值
弊端:
此时,FileInputStream不会将.properties保存在缓存中,可以解决上面的问题。但是出现了另一个问题,即绝对路径,会导致程序的通用性不好。这个问题是由于ClassLoader.getResourceAsStream是直接寻找 classes下的文件,FileInputStream则需要用完整的绝对路径,至于FileInputStream为什么一定需要绝对路径自己去找度娘,不在这里累述
- 第三种
Properties prop = new Properties();
String path = Thread.currentThread().getContextClassLoader().getResource("/config").getPath();//只需从资源文件包下的路径写起即可,例如:这里是src/main/resource/config下的文件,所以我就只写了/config
InputStream is = new FileInputStream(path + "/abutment.properties");
prop.load(is);
String httpConnect = ConvertUtil.obj2str(prop.get("httpConnect"));
这种方法可以很好解决上面两种问题,是目前比较优的选择