com
|-github
|-test
| |-Test1.class
| |-testdata1.txt
|-Test2.class
|-testdata2.tx2
在這樣的編譯輸出目錄下,文件"testdata1.txt"的絕對路徑名爲:"/com/github/demo/testdata1.txt" 文件"testdata2.txt"的絕對路徑名爲:"/com/github/testdata2.txt"
如同getResourceAsStream方法文檔上的解釋:以/開頭時是絕對路徑,與類路徑不一樣的是路徑上的「."換成了"/"。
接下着咱們看相對路徑!
首先咱們必須明確「相對」路徑老是指相對於當前class的路徑!
例如,若是咱們使用
InputStream is= Test1.class.getResourceAsStream("testdata1.txt");
路徑不是以/開頭,說明這是一個相對路徑,相對的是Test1.class這個文件,因此,這裏的「testdata1.txt」所指的正確位置是與Test1.class處於同一目錄下的testdata1.txt文件,這一文件是存在的,所引不會報錯。
若是咱們按相對路徑的方式經過Test1去加載testdata2.txt,則路徑應該這樣描述:
InputStream is= Test1.class.getResourceAsStream("../testdata2.txt");
是的,用「.."表示上一級目錄。
若是咱們按相對路徑的方式經過Test2去加載testdata1.txt,則路徑應該這樣描述:
InputStream is= Test2.class.getResourceAsStream("test/testdata1.txt");
注意!test前是沒有/的,這是一個相對路徑,是相對於Test2所在包下的test子包裏的testdata1.txt文件,因此這個路徑也是正確無誤的!
2. ClassLoader.getResourceAsStream
class.getResourceAsStream最終調用是ClassLoader.getResourceAsStream
在使用ClassLoader.getResourceAsStream時,路徑直接使用相對於classpath的絕對路徑,而且不能已 / 開頭。html
有如下規則:
1. 若是參數以/開頭,則去除/。java
2. 不然把當前類的包名加在參數的前面。
InputStream resourceAsStream = ClassLoader.getSystemResourceAsStream("com/github/demo/1.txt");git