前言
InputStream is = DBUtil.class.getClassLoader().getResourceAsStream(
"utils/config.properties");
上一篇详细介绍了代码中使用DBUtil类和class的原因,接下来继续介绍getClassLoader()和getResourceAsStream()方法
三、getClassLoader()
功能:取得该Class对象的类加载器。
何谓类装载器?以DBUtil.java文件为例,首先DBUtil.java源文件被编译成字节码文件,即DBUtil.class文件。当用户使用DBUtil这个类时,JAVA虚拟机(JVM)会通过加载、连接、初始化3个步骤来对该类进行初始化,最终形成可以被虚拟机直接使用的 Java 类型放入内存。其中加载这一步,就是利用类加载器,通常由JVM提供,具体过程指的是将类的class文件读入到内存,并为之创建一个java.lang.Class对象,当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象。也就是说,当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象。也就是这部分在前篇中进行了相关介绍。
为什么在这里要获得类加载器呢?其实是从路径考虑的。不写getClassLoader()方法也可以动态获得config.properties文件。
InputStream is = DBUtil.class.getResourceAsStream("config.properties");
InputStream is = DBUtil.class.getClassLoader().getResourceAsStream(
"utils/config.properties");
两段代码对比,应该发现getResourceAsStream()中的地址有所不同,第一个没包名,而第二个写了。这是由于两者获得的路径不同,由类加载器获得是class文件的根目录,如下列显示:
D:/apache-tomcat-8.5.38/wtpwebapps/MVC/WEB-INF/classes/
由.class文件获得的是路径是DBUtil.class文件所在位置,如下列所示:
D:/apache-tomcat-8.5.38/wtpwebapps/MVC/WEB-INF/classes/utils/
四、getResourceAsStream()
功能:根据参数给定的名称,查找文件资源,并且进行加载为字节输入流
由于把DBUtil和config.properties存储时放在一起,如下图所示,部署发布后,DBUtil.class依然能和config.properties在一起。
通过DBUtil.class.getClassLoader()就能动态地确定了config.properties文件所在目录,然后进行准确定位,找到文件,进行加载,成为字节输入流,并把它赋值给InputStream(字节输入流类)的一个实例,暂时存储,等待后一步的使用。
需要补充说明关于该方法的一个路径问题,前面提到了,以下两行代码中getResourceAsStream括号中的写法不同,是由于通过class对象和利用类加载器得到的当前位置不同。
InputStream is = DBUtil.class.getResourceAsStream(
"config.properties");
InputStream is = DBUtil.class.getClassLoader().getResourceAsStream(
"utils/config.properties");
因此使用相对路径时,对文件的定位不一样,那如果是绝对路径呢?那就应该一样了,即如下所示:
InputStream is = DBUtil.class.
getResourceAsStream("/utils/config.properties");
InputStream is = DBUtil.class.getClassLoader().getResourceAsStream(
"/utils/config.properties");
大家需要注意绝对路径和相对路径的使用。
总结
关于动态地址获得配置文件就介绍完了。如果大家想很明确的看到上文所提到的对应地址可以采用如下语句。
System.out.println(DBUtil.class.getClassLoader().getResource(""));
结果是:
file:/D:/apache-tomcat-8.5.38/wtpwebapps/MVC/WEB-INF/classes/
System.out.println(DBUtil.class.getResource(""));
结果是:
file:/D:/apache-tomcat-8.5.38/wtpwebapps/MVC/WEB-INF/classes/utils
getResouce()方法也可以获得文件资源,但它的返回值是当前位置url,如果getResouce中加入"/"输出的就是根目录了
System.out.println(DBUtil.class.getClassLoader().getResource("/"));
System.out.println(DBUtil.class.getResource("/"));
以上两段代码的效果将会一样,都是
file:/D:/apache-tomcat-8.5.38/wtpwebapps/MVC/WEB-INF/classes/