在java开发中关于class.getResourceAsStream(String name)与 class.getClassLoader().getResourceAsStream(String

来源:互联网 发布:德州冠军软件 编辑:程序博客网 时间:2024/06/11 21:01

在java开发中关于class.getResourceAsStream(Stringname)与class.getClassLoader().getResourceAsStream(String name)的路径的问题

如有上述目录:

package de.qmjs.jdbc.jdbcUtils;

 

publicclasstest {

 

    /**

     * @param args

     */

    publicstaticvoid main(String[] args) {

       //TODO Auto-generated method stub

       System.out.println(test.class.getResourceAsStream("DaoConfig.properties"));//第一种

    System.out.println(test.class.getResourceAsStream("/de/qmjs/jdbc/dao/DaoConfig.properties"));//的二中

    System.out.println(test.class.getClassLoader().getResourceAsStream("de/qmjs/jdbc/dao/DaoConfig.properties"));//第三种

    }

 

}写上面一个测试类:

结果如下

 

第一种和第二种方式是采用Class对象去加载,第三种采用ClassLoader对象去加载资源文件,之所以Class对象也可以加载资源文件是因为Class类封装的ClassLoadergetResourceAsStream方法。从Class类中的源码中可以看出:

路径问题:

1. 第三种是最本质的做法,前两种也是基于第三种去实现的。JVM会使用BootstrapLoader去加载资源文件。所以路径还是这种相对于工程的根目录即"com/jdbc/dao/dao.properties"(不需要“/”)

2. 第一种是采用的相对路径,资源文件相对于当前这个类即(DaoFactory类)的位置,这种方式Class对象做了一些处理。即resloveNamename)这个方法。最终name还是会转换成适合第三方式的name参数,但是第一种在测试时返回的确实空。

3. 第二种是采用绝对路径,绝对路径是相对于classpath根目录的路径(工程里src目录对应bin目录(存放.class文件的目录))。

所以:

建议使用第三种,避免硬编码。

 

原创粉丝点击