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,就會找錯

相關文章
相關標籤/搜索