實測比較 7 種取得 Java 類路徑與工作目錄的方法,包含 ContextClassLoader、ClassLoader、Class.getResource、File 根目錄與 user.dir 系統屬性的輸出差異。
public class FileTest {
public static void main(String[] args) throws Exception {
System.out.println(Thread.currentThread().getContextClassLoader().getResource(""));
System.out.println(FileTest.class.getClassLoader().getResource(""));
System.out.println(ClassLoader.getSystemResource(""));
System.out.println(FileTest.class.getResource(""));
System.out.println(FileTest.class.getResource("/")); // Class 檔所在路徑
System.out.println(new File("/").getAbsolutePath());
System.out.println(System.getProperty("user.dir"));
}
}
file:/E:/Test/ReadXML/
file:/E:/Test/ReadXML/
file:/E:/Test/ReadXML/
file:/E:/Test/ReadXML/
file:/E:/Test/ReadXML/
E:\
E:\Test\ReadXML
| 方法 | 回傳值 | 用途 |
|---|---|---|
ContextClassLoader.getResource("") | 類別載入器路徑 (URL) | 執行緒上下文載入資源 |
Class.getClassLoader().getResource("") | 類別載入器路徑 (URL) | 該類別對應的載入器 |
ClassLoader.getSystemResource("") | 系統類別載入器路徑 (URL) | 啟動類別路徑 |
Class.getResource("") | 該類別套件路徑 (URL) | 相對路徑載入同包資源 |
Class.getResource("/") | Classpath 根路徑 (URL) | 絕對路徑載入資源 (推薦) |
new File("/").getAbsolutePath() | 檔案系統根目錄 | Windows 為磁碟根目錄 |
System.getProperty("user.dir") | JVM 啟動工作目錄 | 相對路徑基準 (最常用) |
MyClass.class.getResource("/config.properties")。new File(System.getProperty("user.dir"), "config.properties")。File("/") 代表專案根目錄,在 Linux/容器環境會指向真實根目錄。