首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 資源文件路徑載入完整指南:ClassLoader 與 Class.getResource() 深度解析

     編輯:Java 程式設計入門

兩種主流載入方式

  1. 透過 ClassLoader:ClassLoader.getSystemClassLoader().getResource(path)
  2. 透過 Class 物件:MyClass.class.getResource(path)(底層仍委派給載入該類的 ClassLoader)

類加載器層級結構

加載器來源負責載入
Bootstrap Class Loader (根)C++ 實作核心類庫 JRE/lib/rt.jar
Extension Class Loader (擴展)Java 實作擴展目錄 JRE/lib/ext/*.jar
Application Class Loader (應用/系統)Java 實作CLASSPATH 下所有類

三者為雙親委派模型(非繼承關係,而是組合關係),子加載器先委派父加載器載入,找不到再自行載入。

路徑規則詳細對照

方式一:ClassLoader.getResource()

  • 路徑不能以 '/' 開頭,視為相對類路徑根目錄。
  • 包名視為目錄,用 '/' 分隔:"com/example/config.properties"。

// 載入專案根類路徑下 demo/names.ser
URL url = ClassLoader.getSystemClassLoader().getResource("demo/names.ser");

方式二:Class.getResource()

  • 不以 '/' 開頭:相對路徑,相對於該 Class 所在包目錄。
  • 以 '/' 開頭:絕對路徑,相對於類路徑根目錄(同 ClassLoader 行為)。

public class Demo1 { ... }

// 1. 相對路徑:載入 Demo1 同包下的 names.ser
URL url1 = Demo1.class.getResource("names.ser");

// 2. 絕對路徑:載入類路徑根目錄下 demo/names.ser
URL url2 = Demo1.class.getResource("/demo/names.ser");

原始碼層面驗證(JDK 來源)

Class.getResource(String name) 內部流程:

  1. 呼叫私有方法 resolveName(name) 轉換路徑。
  2. 取得該類的 ClassLoader(getClassLoader0())。
  3. 若 ClassLoader 為 null(系統類),呼叫 ClassLoader.getSystemResource();否則呼叫 cl.getResource()。

resolveName() 關鍵邏輯:

  • 若 name.startsWith("/") → 去除首字元 '/',其餘作為相對類路徑根的路徑。
  • 否則 → 取得當前類完整名稱,將 '.' 替換為 '/',拼接 '/' + name,形成相對類路徑根的路徑。

故 Class.getResource() 本質上是對 ClassLoader.getResource() 的封裝,自動處理相對/絕對路徑轉換。

常見坑與最佳實踐

場景正確寫法錯誤示範
Maven 標準目錄 src/main/resources/config.ymlgetResource("/config.yml") 或 getResource("config.yml")(同包)getResource("resources/config.yml")
Spring Boot 專案優先使用 ResourceLoader / @Value("classpath:...") / ClassPathResource硬編碼絕對檔案路徑
打包成 JAR 後讀取僅能用 getResourceAsStream() 讀取流,不可用 File 操作new File(url.toURI()) 會在 JAR 內失敗
多模組專案共享資源建立共用模組,資源放其 resources,依賴該模組即可透過類路徑載入相對路徑 ../../module-x/src/main/resources

總結口訣

ClassLoader 路徑永不以斜線開頭;
Class.getResource 相對當前包,絕對加斜線。
JAR 內唯有流可讀,File 物件不可用。
Spring 資源抽象最省心,標準規範少踩坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved