本次獲取路徑,通過Class(字節碼文件類對象獲取)
以普通Java項目爲例,JavaEE有特定API獲取路徑就不多說了
首先要搞懂項目編譯輸出後的路徑與源代碼路徑的問題。一般來說源代碼中編寫資源文件路徑,
都要按照項目文件編譯輸出路徑爲準(輸出路徑,一般爲頂層package爲準),因爲.java文件都會被編譯.class文
件,以及一些資源文件一同拷貝。
(源代碼文件與資源文件以及它們的各層級路徑,都會輸出到你指定的輸出目錄。)輸出到指定的目錄。
該目錄是我們設置的,如下圖輸出所示(idea中設置)
同時爲了方便管理資源文件,通常新建一個資源文件夾,與源代碼文件夾分離。但是編譯輸出時仍按照當前目錄層
級結構一共複製到指定輸出目錄,所以源代碼文件中編寫資源文件路徑時,應該以輸出目錄爲準。
- 通過類加載器對象獲取路徑
public class Test {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
// H2ConnectionDemo.test();
//獲取項目編譯輸出後的根路徑
System.out.println(ClassLoader.getSystemResource("").getPath());
System.out.println(Test.class.getResource("/").getPath());
/*
* 結果
* /F:/code_space/idea_space/keepwd/target/classes/
* /F:/code_space/idea_space/keepwd/target/classes/
* */
//獲取當前類所在的包路徑
System.out.println(Test.class.getResource("").getPath());
System.out.println(Test.class.getResource(".").getPath());
/*結果
* /F:/code_space/idea_space/keepwd/target/classes/com/nubi/
* /F:/code_space/idea_space/keepwd/target/classes/com/nubi/
* */
//獲取當前類的包路徑的上以及路徑
System.out.println(Test.class.getResource("..").getPath());
/*結果
* /F:/code_space/idea_space/keepwd/target/classes/com/
* */
}
}
獲取頂層路徑千萬注意:
千萬不要寫成:
System.out.println(getClass().getResource(File.separator
));得不到正確的路徑,得到的結果是
file:/F:/code_space/idea_space/keepwd/target/classes/sample/%5c
。
應該這樣寫
System.out.println(Test.class.getResource("/").getPath());