关于
class.getResourceAsStream(String name)
与
class.getClassLoader().getResourceAsStream(String name)
的路径
name
问题
首先用类加载资源文件的方式可以有以下三种:
(包结构图)
1) InputStream inStream =
DaoFactory.
class
.getResourceAsStream("dao.properties");
2) inStream=DaoFactory.
class
.getResourceAsStream("/com/jdbc/dao/dao
.properties")
3)
inStream=DaoFactory.
class
.getClassLoader().getResourceAsStream("
com/jdbc/dao/dao.properties");
第一种和第二种方式是采用
Class
对象去加载,
第三种采用
ClassLoader
对象去加
载资源文件,之所以
Class
对象也可以加载资源文件是因为
Class
类封装的
ClassLoader
的
getResourceAsStream
方法。从
Class
类中的源码中可以看出:
之所以这样做无疑还是方便客户端的调用,省的每次获取
ClassLoader
才能加载
资源文件的麻烦。
路径问题:
1.
第三种是最本质的做法,前两种也是基于第三种去实现的。
JVM
会
使用
Bootstrap Loader
去加载资源文件。所以路径还是这种相对于工程的根目
录即
"com/jdbc/dao/dao.properties"
(
不需要“/”)。
2.
第一种是采用的相对路径,资源文件相对于当前这个类即
(
DaoFactory
类)的位置,这种方式
Class
对象做了一些处理。即
resloveName
(
name
)这个方法。最终
name
还是会转换成适合第三方式的
name
参数
3.
第二种是采用绝对路径,绝对路径是相对于
classpath
根目录的路径
(工程里
src
目录对应
bin
目录(存放
.class
文件的目录))。
(
Class
类中
resolveName
方法)