有關getClassLoader().getResourceAsStream(fileName)、class.getResourceAsStream(fileName)和().getContextClassLoader().getResourceAsStream(fileName)的區別


    一:前言

    在自己獲取屬性時,碰見了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
  



免責聲明!

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



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