目資源路徑分兩種,一種是普通Java項目的資源路徑,另一種是JavaEE項目的資源路徑。
-
獲取Java項目的包(源碼下的包 或者 jar包)的資源路徑
- // 方法1:通過this.getClass().getResoure("")獲取, 有"/"開頭表示以bin目錄為根目錄, 沒"/"開頭表示以當前文件夾為根目錄
- this.getClass().getResource("/").getFile();
- // 方法2:通過this.getClass().getClassLoader().getResource(""), 不允許以"/"開頭, 默認以bin目錄為根, 類似方法1中以"/"開頭的情況
- this.getClass().getClassLoader().getResource("").getFile();
- // 方法3:通過ClassLoader.getSystemResource("")獲取, 不允許以"/開頭", 默認以bin目錄為根, 同上
- ClassLoader.getSystemResource("").getFile();
- // 方法4:通過Thread.currentThread().getContextClassLoader().getResource("")獲取, 同上【推薦】
- Thread.currentThread().getContextClassLoader().getResource("").getFile();
- // 方法5:通過new File("bin").getCanonicalPath()獲取, 有"/"開頭, 則以系統盤為根, 沒"/"開頭, 表示以bin目錄為根
- new File("bin").getCanonicalPath();
- // 方法6:通過System.getProperty("user.dir") + File.separator + "bin"來獲取(不推薦)
- System.getProperty("user.dir") + File.separator + "bin";
據說方法4的系統兼容性最好,所以推薦第4種方法獲取資源路徑。
-
獲取JavaEE項目的資源路徑
對於獲取JavaEE中的資源,其實就是獲取WEB-INF目錄的父目錄下的資源,而且src的源碼編譯后的class文件,也會存放在WEB-INF/classes文件夾下,所以獲取JavaEE資源的方法,也適用於獲取Java普通資源,方法如下:
- // getRealPath()方法中的參數, 是否以"/"開頭效果都是一樣的, 都是以WEB-INF目錄的父目錄為根目錄進行查找
- request.getServletContext().getRealPath("");
總結:
-
通過getClassLoader().getResource()的方法, 只能獲取package(包括jar包的資源)里面的資源
-
若想獲取項目下普通目錄的資源,可以通過new File(path)的方式獲取,路徑默認以項目路徑為根,以bin開始表示獲取bin目錄,以src開始表示獲取src目錄,以XXX開始表示獲取項目下XXX目錄,該方法最靈活,就算是JavaEE項目同樣適用(例如WecContent,可以使用new File("WebContent")獲取),唯一缺點就是不能獲取jar里面的資源(因為jar包的資源不是以普通File的形式存儲的)