對Class getResourceAsStream和ClassLoader getResourceAsStream方法
阿新 • • 發佈:2018-11-13
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
這是個很基礎的問題了,這裡提供一些示例,幫助快速理解和記憶這個問題。在該方法的文件:http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getResourceAsStream%28java.lang.String%29
關於Class.getResourceAsStream
首先, 我們必須先了解根路徑“/”是如何定義的,這對我們使用getResourceAsStream準確載入檔案是很重要的。首先,我們要明白這個根路徑是對應類所處類路徑上的根目錄!什麼意思呢?假如一個專案經過編譯之後生成了如下class檔案和目錄結構:
com |-github |-demo | |-A.class | |-1.txt |-B.class |-2.txt
在這樣的編譯輸出目錄下,檔案"1.txt"的絕對路徑名為:"/com/github/demo/1.txt" 檔案"2.txt"的絕對路徑名為:"/com/github/2.txt" 如同getResourceAsStream方法文件上的解釋:以/開頭時是絕對路徑,與類路徑不同的是路徑上的“."換成了"/"。
接下著我們看相對路徑!
首先我們必須明確“相對”路徑總是指相對於當前class的路徑!
例如,如果我們使用
路徑不是以/開頭,說明這是一個相對路徑,相對的是A.class這個檔案,所以,這裡的“1.txt”所指的正確位置是與A.class處於同一目錄下的1.txt檔案,這一檔案是存在的,所引不會報錯。
如果我們按相對路徑的方式通過A去載入2.txt,則路徑應該這樣描述:
InputStream is= A.class.getResourceAsStream("../2.txt");
是的,用“.."表示上一級目錄。
如果我們按相對路徑的方式通過B去載入1.txt,則路徑應該這樣描述:
InputStream is= B.class.getResourceAsStream("demo/1.txt");
注意!demo前是沒有/的,這是一個相對路徑,是相對於B所在包下的demo子包裡的1.txt檔案,所以這個路徑也是正確無誤的!
關於ClassLoader.getResourceAsStream
class.getResourceAsStream最終呼叫是ClassLoader.getResourceAsStream
只是在這之前對引數進行了調整。如果引數已/開頭,則去除/,否則把當前類的包名加在引數的前面。
在使用ClassLoader.getResourceAsStream時,路徑直接使用相對於classpath的絕對路徑,並且不能已 / 開頭。
InputStream resourceAsStream = ClassLoader.getSystemResourceAsStream("com/github/demo/1.txt");