自從轉投Java陣營后,一直發下Java程序的路徑讀取異常麻煩,因此查閱了比較多的版本內容,整合了一份自己的學習筆記。主要使用Class及通過ClassLoader來動態獲取文件路徑。
查閱鏈接如下: Class及ClassLoader下獲取Resource原理
Class及ClassLoader下獲取Resource圖文解析
首先,在IDE下面寫的.java文件最終會被編譯成一個.class的類。上面兩種方法去讀取文件都是基於.class的相對路徑進行索引。
通過Class和ClassLoader兩個類下的Resource方法獲取路徑主要區別是參數是否以"/"開頭。
1. 通過Class.getResource方法獲取文件路徑
△getResource方法
(1) getResource方法必須輸入參數,該方法沒有提供空參數的方法重載,因此該方法必須輸入參數。
(2) Class.getResource("")與Class.getResource("/") 的主要區別:空字符串下對應返回class文件所在包的位置,"/"參數返回的是class文件所在的根目錄(所在包的上級目錄)
2. 通過ClassLoader.getResource方法獲取文件路徑
ClassLoader.getResource方法同樣帶有一個String 類型的目錄參數,但ClassLoader.getResource方法參數不支持參數為"/",因為該實例方法返回的就是類所在的根目錄路徑。輸入帶"/"開頭的字符串,會返回null。
3. 示例以JDBCHelper類,分別獲取1.xml,2.xml 及dbcfg.properties文件
文件分布如圖所示:

1 @Test 2 public void testFilePath() throws Exception 3 { 4 // 以class.getResource方法獲取文件路徑 5 System.out.println("------getFileURL by class.getResource------"); 6 URL fileURL = JDBCHelper.class.getResource("1.xml"); 7 System.out.println("1.xml Exit? " + isfileExit(fileURL)); 8 9 fileURL = JDBCHelper.class.getResource("/2.xml"); 10 System.out.println("2.xml Exit? " + isfileExit(fileURL)); 11 12 fileURL = JDBCHelper.class.getResource("/config/dbcfg.properties"); 13 System.out.println("properties Exit? " + isfileExit(fileURL)); 14 System.out.println("------getFileURL by classLoader.getResource------"); 15 16 fileURL = JDBCHelper.class.getClassLoader().getResource("com/scl/test/transcaction/1.xml"); 17 System.out.println("1.xml Exit? " + isfileExit(fileURL)); 18 19 fileURL = JDBCHelper.class.getClassLoader().getResource("2.xml"); 20 System.out.println("2.xml Exit? " + isfileExit(fileURL)); 21 22 fileURL = JDBCHelper.class.getClassLoader().getResource("config/dbcfg.properties"); 23 System.out.println("properties Exit? " + isfileExit(fileURL)); 24 25 } 26 27 public boolean isfileExit(URL fileURL) throws Exception 28 { 29 if (fileURL == null) { return false; } 30 String URLStr = URLDecoder.decode(fileURL.getFile(), "utf8"); 31 File f = new File(URLStr); 32 if (f != null && f.exists()) 33 { 34 f = null; 35 return true; 36 } 37 else 38 { 39 return false; 40 } 41 42 }
結果如下:
以上為getResource方法的總結,看來基礎還是得加強