Class.getResourceAsStream(path)与Thread.currentThread().getContextClassLoader().getResourceAsStream

Class.getResourceAsStream(Path)获取的是Class类所在的package下或者工程下,例如一个Student类所在jar目录或者工程目录为D;\myapp\com\bbs\Student.class则如果path为“"file.txt"即是Student.getResourceAsStream("file.txt")则将会搜索D:\myapp\com\bbs下的file.txt文件,此时当前目录就是D:\myapp\com\bbs。如果path为./file.txt结果相同,如果不存在则返回Null。如果是以"/"开头,java会认为是一个绝对路径,则会从classpath的顶级目录开始搜索,即是path为"/file.txt",此时搜索空间为D:\myapp,找到D:\myapp\file.txt文件。

Student.getClassLoader().getResourceAsStream(path)则不同,搜索空间是当前工程下的类路径下可以在程序启东时通过-classpath path1;path2来添加,path并且必须是相对路径,不可使用“”\“”开头.例如path为"./file.txt"或者“”file.txt“”,则将会在以工程目录为起点搜索,即是“”D:\myapp\file.txt“下,如果Path为"com\bbs"”则会在相对工程目录下的com\bbs下搜索file.txt。

Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName) :每一个Thread都有一个context classloader与之对应,这个contextloader类是由父进程提供的,默认的contextloader为父进程的context classloader。如果在整个Thread结构中,你都没有通过Thread类的构造函数初始化某个Thread 的context classloader的话,那么,整个Thread的context classloader都将默认是system classloader。

Method Parameter format Lookup failure behavior Usage example

ClassLoader.

getResourceAsStream()

"/"-separated names; no leading "/" (all names are absolute) Silent (returns null)

this.getClass().getClassLoader()

.getResourceAsStream

("some/pkg/resource.properties")

Class.

getResourceAsStream()

"/"-separated names; leading "/" indicates absolute names; all other names are relative to the class's package Silent (returns null)

this.getClass()

.getResourceAsStream

("resource.properties")

ResourceBundle.

getBundle()

"."-separated names; all names are absolute;.properties suffix is implied

Throws unchecked

java.util.MissingResourceException

ResourceBundle.getBundle

("some.pkg.resource")

参考(http://www.javaworld.com/article/2077352/java-se/smartly-load-your-properties.html)

参考(http://www.javaworld.com/article/2077344/core-java/find-a-way-out-of-the-classloader-maze.html)参考(https://www.ibm.com/developerworks/cn/java/j-lo-classloader/)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值