servlet--利用getResourceAsStream获取properties文件资源的方法解析(二)

前言

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/

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值