1. 程式人生 > >理解根目錄,getClass().getResourceAsStream和getClass().getClassLoader().getResourceAsStream的區別

理解根目錄,getClass().getResourceAsStream和getClass().getClassLoader().getResourceAsStream的區別

 

1理解根目錄:


經常會看到如下配置:

<value>classpath*:/application.properties</value> 
<value>classpath:/application.properties</value>

這裡的classpath怎麼理解呢,其實指的就是根目錄,關於根目錄,需要了解:

1、src不是classpath, WEB-INF/classes,lib才是classpath,WEB-INF/ 是資源目錄, 客戶端不能直接訪問。

2、WEB-INF/classes目錄存放src目錄java檔案編譯之後的class檔案、xml、properties等資源配置檔案,這是一個定位資源的入口。

3、引用classpath路徑下的檔案,只需在檔名前加classpath:

<param-value>classpath:applicationContext-*.xml</param-value> 
<!-- 引用其子目錄下的檔案,如 -->
<param-value>classpath:context/conf/controller.xml</param-value>

4、lib和classes同屬classpath,兩者的訪問優先順序為: lib>classes。

5、classpath 和 classpath* 區別:

classpath:只會到你的class路徑中查詢找檔案;
classpath*:不僅包含class路徑,還包括jar檔案中(class路徑)進行查詢。


2getClass().getResourceAsStream和getClass().getClassLoader().getResourceAsStream的區別

檔案結構如下圖:

途中有兩個配置檔案,biabc.properties和abc.properties;Test類讀取方式如下:

  public void readProperty(){
        //從當前類所在包下載入指定名稱的檔案,getClass是到當前列
        InputStream in = this.getClass().getResourceAsStream("biabc.properties");
        // 從classpath根目錄下載入指定名稱的檔案,這是因為/即代表根目錄
//        InputStream in = this.getClass().getResourceAsStream("/abc.properties");
        //從classpath根目錄下載入指定名稱的檔案,這是因為getClassLoader就會到根目錄上
//        InputStream in = this.getClass().getClassLoader().getResourceAsStream("abc.properties");

        Properties properties = new Properties();
        // 使用properties物件載入輸入流
        try {
            properties.load(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //獲取key對應的value值
        System.out.println(properties.getProperty( "a"));
    }

借鑑;https://blog.csdn.net/javaloveiphone/article/details/51994268