InputStream inputStream = AddressService.class.getClassLoader()
.getResourceAsStream("sop12.xml");

現在在這裡總結一下Java中getResourceAsStream的用法。
首先,Java中的getResourceAsStream有以下幾種:
1. Class.getResourceAsStream(String path) : path 不以’/'開頭時預設是從此類所在的包下取資源,以’/'開頭則是從
ClassPath根下擷取。其隻是通過path構造一個絕對路徑,最終還是由ClassLoader擷取資源。
2. Class.getClassLoader.getResourceAsStream(String path) :預設則是從ClassPath根下擷取,path不能以’/'開頭,最終是由
ClassLoader擷取資源。
3. ServletContext. getResourceAsStream(String path):預設從WebAPP根目錄下取資源,Tomcat下path是否以’/'開頭無所謂,
當然這和具體的容器實作有關。
4. Jsp下的application内置對象就是上面的ServletContext的一種實作。
其次,getResourceAsStream 用法大緻有以下幾種:
第一: 要加載的檔案和.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("file/myfile.xml");
最後,自己的了解:
getResourceAsStream讀取的檔案路徑隻局限與工程的源檔案夾中,包括在工程src根目錄下,以及類包裡面任何位置,但是如果配置檔案路徑是在除了源檔案夾之外的其他檔案夾中時,該方法是用不了的。
附注:java.lang.ClassLoader.gClassLoader()源碼
java.lang.ClassLoader.getResource()源碼
java.lang.Class.getResourceAsStream(String name)源碼
java.lang.Class.getResource(String
name)源碼
在委托前,使用下面的算法從給定的資源名構造一個絕對資源名:
如果 name 以 '/' 開始 ('\u002f'),則絕對資源名是 '/' 後面的name 的一部分。
否則,絕對名具有以下形式:
其中 modified_package_name 是此對象的包名,該名用 '/' 取代了 '.' ('\u002e')。
==================================================================================================
作者:歐陽鵬 歡迎轉載,與人分享是進步的源泉!