一:前言
在自己獲取屬性時,碰見了XX.class.getResourceAsStream(fileName),自己對這個其實不是很理解,上網查了下資料,又看到了上述的幾個,所以就研究了下。
二:內容
先說說着幾個區別吧
getClassLoader().getResourceAsStream("a.txt"):此方法的路徑不管是絕對路徑還是想對路徑,都是從path下找得,即使"./a.txt"的形式去尋找,在此處我們要注意空指向異常的情況(可以看看這里寫的http://cache.baiducontent.com/cm=9d78d513d99c12eb0fb1837e7c4380200e55f0326284915468d5e316ce370d160771e2cb30536713a0b66b6671f30e02b4e47132690c7af1dd8a9f4baea68f7871d57223706bdd124d9b58e5dc46529e778d1bb3f25cf0ba8768d5f18cc4de20089c44040c84f3895803&p=9274c54ad5c246e74bbe9b7c4605bb&newp=867cc54ad5c246bc4bbe9b7c4f0a9f231610db2151d6d11f6cc7&user=baidu&fm=sc&query=maven+getClassLoader%CE%AAnull&qid=bf473e2d0001b6a7&p1=3)。其中寫到了Bootstrap ClassLoader (啟動類加載器或者叫引導類加載器)加載jdk核心的APIs,這些APIs一般位於jdk_home/lib下;它是一個本地接口,所以不能從java代碼中得到它的信息。例如, log(java.lang.String.class.getClassLoader())得到的是null(引用自http://blog.csdn.net/benjieming_wang/article/details/5623492)。classLoader是一種類加載器.
現在我就來附上代碼說明吧:
package org.wh.properties; import java.io.IOException; import java.io.InputStream; import java.util.Iterator; import java.util.Properties; import java.util.Set; public class PropertiesDemo01 { Properties prop; public void setProp(Properties prop) { this.prop = prop; } public static void main(String args[]){ loadConfig(); } public static Properties loadConfig(){ Properties prop = new Properties(); //Class的getResource()方法是從當前.class文件路徑查找資源,而ClassLoader則是從jar包中查找 //InputStream input = Properties.class.getResourceAsStream("/jdbcUtils.properties"); InputStream input1 = PropertiesDemo01.class.getClassLoader().getResourceAsStream("jdbcUtils.properties"); System.out.println("jdk的類加載器"+Properties.class.getClassLoader());//結果:jdk的類加載器:null System.out.println("demo:"+PropertiesDemo01.class.getClassLoader());//結果:demo:sun.misc.Launcher$AppClassLoader@addbf1 try { prop.load(input1); @SuppressWarnings("rawtypes") Set keyValue=prop.keySet(); for(Iterator a=keyValue.iterator();a.hasNext();){ String key=(String) a.next(); String value=prop.getProperty(key); System.out.println("-key的值--"+key+"value--的值-"+value); } } catch (IOException e) { e.printStackTrace(); } return prop; } }
結論:如果在這里用jdk的內部類就會報空指向異常,我們可以看到Properties.class.getClassLoader()得到的結果是null;
class.getResourceAsStream(fileName):fileName中加了“/”則代表了絕對路徑,否則就是相對路徑。代碼可見上述
再說說Thread.currentThread().getContextClassLoader():這個是當前線程的類加載器,
package org.wh.properties; public class Test { public static void main(String[] args) { System.out.println(Thread.currentThread().getContextClassLoader());//當前線程的類加載器 System.out.println(Test.class.getClassLoader());//當前類的類加載器 System.out.println(ClassLoader.getSystemClassLoader());//系統初始的類加載器 } }
參考資料可以看看這里:http://stackoverflow.com/questions/676250/different-ways-of-loading-a-file-as-an-inputstream