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。
|
参考(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/)