【Java基礎】通過getResourceAsStream() 加載資源文件


  1. Class.getResourceAsStream(String path)

    • path不以“/”開頭時,默認是從當前類所在的包下面獲取資源
    • path以“/”開頭時,則是從項目的classPath根下獲取資源

    JDK設置這樣的規則,是很好理解的,path不以“/”開頭時,我們就能獲取與當前類所在的路徑相同的資源文件,而以“/”開頭時可以獲取classPath根下任意路徑的資源。

  2. ClassLoader.getResourceAsStream(String path)

    • 默認是從classpath根下獲取,path不能以“/”開頭,path是指類加載器的加載范圍,在資源加載的過程中,使用逐級向上的委托的形式加載的,“/”表示Boot ClassLoader中的加載范圍,因為這個類加載器是C++實現的,所以加載范圍為null。
  3. ServletContext.getResourceAsStream(String path)

    • 默認從WebAPP根目錄下取資源,Tomcat下path是否以“/”開頭無所謂,當然這和具體的容器實現有關。
  4. 問題

    今天在測試Class.getResourceAsStream()獲取當前類所在包下面的資源文件時,一直無法正常獲取,總是返回null。花了很多時間才發現Idea在編譯類之后沒有把我包下面的配置文件copy過去。因為Idea從13版本開始只支持外部編譯,因此需要在pom.xml文件手動指定資源文件的目錄。在maven中添加了以下配置之后,包下面的配置文件也就copy過去了,所以再次運行代碼的時候就ok了。

    <build>
        <finalName>smart</finalName>
        <resources>
            <resource>
                <directory>src/main/java</directory><!--指定資源文件目錄-->
            </resource>
        </resources>
    </build>
    

參考文章

  1. http://swiftlet.net/archives/868
  2. http://blog.csdn.net/zhanghaipeng1989/article/details/19332489
  3. http://blog.163.com/moonlight_yz/blog/static/74736722013111052554300/


免責聲明!

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



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