getResourceAsStream()与FileInputStream

https://cloud.tencent.com/developer/ask/28683markdown

 

getResourceAsStream()经过classname的类加载器加载文件。若是类来自JAR文件,那么就会从JAR文件中加载资源。spa

FileInputStream用于从文件系统读取文件。.net

 

https://blog.csdn.net/buster2014/article/details/53787224blog

props.load(new FileInputStream("db.properties")); 是读取当前目录的db.properties文件ssl

getClass.getResourceAsStream("db.properties"); 是读取当前类所在位置一块儿的db.properties文件
资源

getClass.getResourceAsStream("/db.properties"); 是读取ClassPath的根的db.properties文件,注意ClassPath若是是多个路径或者jar文件的,只要在任意一个路径目录下或者jar文件里的根下均可以,若是存在于多个路径下的话,按照ClassPath中的前后顺序,使用先找到的,其他忽略.get

 

 

完全搞懂Class.getResource和ClassLoader.getResource的区别和底层原理

Class.getResource和ClassLoader.getResource 最终调用的是ClassLoader 类的getResource方法。只不过Class.getResource是先调用Class 的 getResource 方法,在这个getResource  方法中,再去调用ClassLoader 类的getResource方法it

那么Class类中的getResource方法作了什么呢,主要的一句是 name = resolveName(name); 
---------------------
做者:张守康
来源:CSDN
原文:https://blog.csdn.net/zhangshk_/article/details/82704010
版权声明:本文为博主原创文章,转载请附上博文连接!io

 

设class包完整名为a.b.c
class.getResource  获取当前类加载器及其父加载器下a.b.c/下的资源
classloader.getResource  获取当前类加载器及其父加载器下全部jar包内资源(取第一个)
 
class.getResource(“/“) = classloader.getResource(“”)
 
因此从包名限定的角度说,前者比后者保险,假设2个jar包resource下都有资源文件a,则运行期具体拿哪一个未知,但若是a有个性的包名,则冲突的可能性就大大下降
 
        System.out.println(FingerPrint.class.getResource(""));
        System.out.println(FingerPrint.class.getClassLoader().getResource(""));
        System.out.println(FingerPrint.class.getResource("/"));
        System.out.println(FingerPrint.class.getClassLoader().getResource("/"));

        System.out.println(FingerPrint.class.getResource(""));
        System.out.println(FingerPrint.class.getClassLoader().getResource("expire.png"));
        System.out.println(FingerPrint.class.getResource("/expire.png"));
        System.out.println(FingerPrint.class.getClassLoader().getResource("/"));

 

jar:file:/Users/sunyuming/.m2/repository/com/jds/fast/fid-common/1.0.2/fid-common-1.0.2.jar!/com/jds/fid/fid_common/
file:/Users/sunyuming/work/MyTest/target/classes/
file:/Users/sunyuming/work/MyTest/target/classes/
null
jar:file:/Users/sunyuming/.m2/repository/com/jds/fast/fid-common/1.0.2/fid-common-1.0.2.jar!/com/jds/fid/fid_common/
jar:file:/Users/sunyuming/.m2/repository/com/jds/fast/fid-common/1.0.2/fid-common-1.0.2.jar!/expire.png
jar:file:/Users/sunyuming/.m2/repository/com/jds/fast/fid-common/1.0.2/fid-common-1.0.2.jar!/expire.png
nullast

 

能够看到,classloader的getResource可能优先在本jar包内寻找,因此若是本jar包resource下也有一个expire.png,就会找错

相关文章
相关标签/搜索