Class.getResourceAsStream() 會指定要加載的資源路徑與當前類所在包的路徑一致。
例如你寫了一個MyTest類在包com.test.mycode 下,那么MyTest.class.getResourceAsStream("name")
會在com.test.mycode包下查找相應的資源。
如果這個name是以 '/' 開頭的,那么就會從classpath的根路徑下開始查找。
ClassLoader.getResourceAsStream() 無論要查找的資源前面是否帶'/' 都會從classpath的根路徑下查找。
所以: MyTest.getClassLoader().getResourceAsStream("name") 和
MyTest.getClassLoader().getResourceAsStream("name") 的效果是一樣的。
1. Class.getResourceAsStream(String path) :
path 不以'/'開頭時默認是從此類所在的包下取資源,以'/'開頭則是從ClassPath(Src根目錄)根下獲取。
其只是通過path構造一個絕對路徑,最終還是由ClassLoader獲取資源。
2. Class.getClassLoader.getResourceAsStream(String path) :
默認則是從ClassPath根下獲取,path不能以'/'開頭,最終是由ClassLoader獲取資源。
3. ServletContext. getResourceAsStream(String path):
默認從WebAPP根目錄下取資源,Tomcat下path是否以’/'開頭無所謂,當然這和具體的容器實現有關。
如果是在SRC 下,可以用第一種方式,如果是在WEB環境下,用/WEB-INF/classes/xxx.file 應該是可以的,但是這個我沒有試過。
補充:
JAVA中類的加載器:
一共有三種加載器
bootstrap classloader :負責加載JAVA核心類( jre 下lib和class目錄中的內容)
extension classloader :負責加載JAVA擴展類(jre 下lib/ext 目錄中的內容)
system classloader :負責加載應用指定的類 (環境變量classpath中配置的內容)