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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
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目錄下,你就要注意了