class /classloader getResourceAsStream()與FileInputStream


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

 

getResourceAsStream()通過classname的類加載器加載文件。如果類來自JAR文件,那么就會從JAR文件中加載資源。

FileInputStream用於從文件系統讀取文件。

 

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

props.load(new FileInputStream("db.properties")); 是讀取當前目錄的db.properties文件

getClass.getResourceAsStream("db.properties"); 是讀取當前類所在位置一起的db.properties文件

getClass.getResourceAsStream("/db.properties"); 是讀取ClassPath的根的db.properties文件,注意ClassPath如果是多個路徑或者jar文件的,只要在任意一個路徑目錄下或者jar文件里的根下都可以,如果存在於多個路徑下的話,按照ClassPath中的先后順序,使用先找到的,其余忽略.

 

 

徹底搞懂Class.getResource和ClassLoader.getResource的區別和底層原理

Class.getResource和ClassLoader.getResource 最終調用的是ClassLoader 類的getResource方法。只不過Class.getResource是先調用Class 的 getResource 方法,在這個getResource  方法中,再去調用ClassLoader 類的getResource方法

那么Class類中的getResource方法做了什么呢,主要的一句是 name = resolveName(name); 
---------------------
作者:張守康
來源:CSDN
原文:https://blog.csdn.net/zhangshk_/article/details/82704010
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

 

設class包完整名為a.b.c
class.getResource  獲取當前類加載器及其父加載器下a.b.c/下的資源
classloader.getResource  獲取當前類加載器及其父加載器下所有jar包內資源(取第一個)
 
 (而且會優先級為 父加載器——不一定本jar包(即執行代碼的所在jar包)的子加載器所有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/  證明有可能先從本jar包讀,從而忽略FingerPrint所在jar包中的資源
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
null

 

可以看到,classloader的getResource可能先在本jar包(即執行代碼的所在jar包)內尋找,所以如果本jar包resource下也有一個expire.png,就會找錯

具體來說,是從本jar包先,還是其它情況,請看:classloader getresource jar包資源沖突情況,父親為大,兄弟之間,誰先加載誰牛逼

 

2020.1.7

並不是class.getresource所有場景都有用的,當src下放着你的resource,而不是resource目錄下,你就要注意了

使用resource中的jar包資源作為UrlClassloader


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM