路徑獲取是配置文件讀取、資源加載、日志輸出的基礎操作。本文對比 5 種主流方式的返回值差異、適用場景與避坑指南,助你精準選型。
| # | 代碼片段 | 返回示例 (Windows) | 語義 | 適用場景 |
|---|---|---|---|---|
| 1 | this.getClass().getResource("").getPath() | /C:/workspace/proj/bin/com/test/ | 當前類編譯輸出目錄 | 讀取同包下資源文件 |
| 2 | new File("").getCanonicalPath() | C:\workspace\proj | 項目根目錄 (工作目錄) | 相對路徑定位配置/日志目錄 |
| 3 | this.getClass().getClassLoader().getResource("file.txt") | file:/C:/workspace/proj/bin/file.txt | Classpath 根下資源絕對 URL | 讀取 src/main/resources 下文件 |
| 4 | System.getProperty("user.dir") | C:\workspace\proj | JVM 啟動工作目錄 | 跨平台獲取專案根路徑 (推薦) |
| 5 | System.getProperty("java.class.path") | C:\workspace\proj\bin;C:\libs\xxx.jar | 完整類路徑 | 診斷類衝突、動態加載 Jar |
ClassLoader,返回 URL,路徑含 file:/ 前綴、URL 編碼空格 %20,需 URLDecoder.decode(url, "UTF-8") 解碼NoClassDefFoundError、ClassCastException (同類多載)public class PathUtils {
// 1. 獲取專案根目錄 (推薦)
public static String getProjectRoot() {
return System.getProperty("user.dir");
}
// 2. 讀取 classpath 資源 (Spring 無侵入)
public static InputStream getResourceAsStream(String path) {
return Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
}
// 3. 獲取當前類同級資源
public static URL getSiblingResource(Class> clazz, String name) {
return clazz.getResource(name);
}
}
new File() 讀取資源,改用 ClassLoader.getResourceAsStream()\、Linux /,統一用 File.separator 或 Paths.get()user.dir 指向模塊目錄,Maven 打包啟動指向 Jar 所在目錄,相對路徑邏輯需兼容