-
Class.getResourceAsStream(String path)
- path不以“/”開頭時,默認是從當前類所在的包下面獲取資源
- path以“/”開頭時,則是從項目的classPath根下獲取資源
JDK設置這樣的規則,是很好理解的,path不以“/”開頭時,我們就能獲取與當前類所在的路徑相同的資源文件,而以“/”開頭時可以獲取classPath根下任意路徑的資源。
-
ClassLoader.getResourceAsStream(String path)
- 默認是從classpath根下獲取,path不能以“/”開頭,path是指類加載器的加載范圍,在資源加載的過程中,使用逐級向上的委托的形式加載的,“/”表示Boot ClassLoader中的加載范圍,因為這個類加載器是C++實現的,所以加載范圍為null。
-
ServletContext.getResourceAsStream(String path)
- 默認從WebAPP根目錄下取資源,Tomcat下path是否以“/”開頭無所謂,當然這和具體的容器實現有關。
-
問題
今天在測試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>
參考文章