方法作用
用於獲取工程里的資源文件,返回 InputStream 輸入流對象
方法分類 (以下 path 均為編譯后的class文件所在目錄,而不是源碼文件所在目錄 )
- Class.getResourceAsStream(String path) : path 不以’/'開頭時默認是從此類所在的包下取資源,以’/'開頭則是從ClassPath根下獲取。其只是通過path構造一個絕對路徑,最終還是由ClassLoader獲取資源。
- Class.getClassLoader.getResourceAsStream(String path) :默認則是從ClassPath根下獲取,path不能以’/'開頭,最終是由ClassLoader獲取資源。
- ServletContext. getResourceAsStream(String path):默認從WebAPP根目錄下取資源,Tomcat下path是否以’/'開頭無所謂,當然這和具體的容器實現有關。
- Jsp下的application內置對象就是上面的ServletContext的一種實現。
使用方法
其次,getResourceAsStream 用法大致有以下幾種:
Class.getResourceAsStream(String path) 使用
當資源文件與該類在一個目錄下時
- 要加載的文件和.class文件在同一目錄下,例如:com.x.y 下有類me.class ,同時有資源文件myfile.xml
那么,應該有如下代碼:
me.class.getResourceAsStream("myfile.xml");
當資源文件在該類所在文件的子目錄下時
- 在me.class目錄的子目錄下,例如:com.x.y 下有類me.class ,同時在 com.x.y.file 目錄下有資源文件myfile.xml
那么,應該有如下代碼:
me.class.getResourceAsStream("file/myfile.xml");
當資源文件即不在類的項目目錄下,也不在該類所在目錄的子目錄下時,要使用項目的絕對路徑(該路徑已'/'開頭)來定位,
- 不在me.class目錄下,也不在子目錄下,例如:com.x.y 下有類me.class ,同時在 com.x.file 目錄下有資源文件myfile.xml
那么,應該有如下代碼:
me.class.getResourceAsStream("/com/x/file/myfile.xml");
用是否已'/'開頭來分類
前面有 “/”
“ / ”代表了工程的根目錄,例如工程名叫做myproject,“ / ”代表了myproject
me.class.getResourceAsStream("/com/x/file/myfile.xml");
前面沒有 “/”
代表當前類的目錄
me.class.getResourceAsStream("myfile.xml");
me.class.getResourceAsStream("file/myfile.xml");
Class.getClassLoader.getResourceAsStream(String path) 使用
通過類加載器來進行資源文件的加載。本方法中的 path 默認是項目的根路徑,也就是上面說的不帶 '/'的絕對路徑。
ServletContext. getResourceAsStream(String path) 使用
path 目錄默認使用 webapp 下的目錄,不是eclipse或其他IDE中項目所在的目錄,而是將項目發布到的 Tomcat 服務下的 webapps 下, 在webapps/appName/下獲取資源文件。
最后,自己的理解:
getResourceAsStream讀取的文件路徑只局限與工程的源文件夾中,包括在工程src根目錄下,以及類包里面任何位置,但是如果配置文件路徑是在除了源文件夾之外的其他文件夾中時,該方法是用不了的。
