使用類載入器查詢和讀取資源

Java 中的資源載入包括以下步驟:

  1. 找到將找到資源的 ClassClassLoader
  2. 尋找資源。
  3. 獲取資源的位元組流。
  4. 讀取和處理位元組流。
  5. 關閉位元組流。

最後三個步驟通常通過將 URL 傳遞給庫方法或建構函式來載入資源來完成。在這種情況下,你通常會使用 getResource 方法。還可以在應用程式程式碼中讀取資源資料。在這種情況下,你通常會使用 getResourceAsStream

絕對和相對資源路徑

可以從 classpath 載入資源由表示路徑。該路徑的語法類似於 UNIX / Linux 檔案路徑。它由正斜槓(/)字元分隔的簡單名稱組成。甲相對路徑與名稱開始,一個絕對路徑與分離開始。

正如 Classpath 示例所描述的那樣,JVM 的類路徑通過在類路徑中覆蓋目錄和 JAR 或 ZIP 檔案的名稱空間來定義名稱空間。當解析絕對路徑時,類載入器會將初始/解釋為名稱空間的根。相反,可以相對於名稱空間中的任何資料夾 解析相對路徑。使用的資料夾取決於用於解析路徑的物件。

獲取類或類載入器

可以使用 Class 物件或 ClassLoader 物件定位資源。Class 物件可以解析相對路徑,因此如果你有(類)相對資源,通常會使用其中一個。有多種方法可以獲得 Class 物件。例如:

  • 類文字會給你,你可以在 Java 原始碼名稱的任何類的 Class 物件; 例如 String.classString 型別提供了 Class 物件。

  • Object.getClass() 將為你提供任何物體型別的 Class 物件; 例如 "hello".getClass() 是獲得 String 型別的另一種方式。

  • Class.forName(String) 方法將(如果需要)動態載入一個類並返回其 Class 物件; 例如 Class.forName("java.lang.String")

通常通過在 Class 物件上呼叫 getClassLoader() 來獲得 ClassLoader 物件。也可以使用靜態 ClassLoader.getSystemClassLoader() 方法獲取 JVM 的預設類載入器。

get 的方法

擁有 ClassClassLoader 例項後,你可以使用以下方法之一找到資源:

筆記:

  • ClassLoaderClass 版本方法之間的主要區別在於解釋相對路徑的方式。

    • Class 方法解析與類包對應的資料夾中的相對路徑。
    • ClassLoader 方法將相對路徑視為絕對路徑; 即在類路徑名稱空間的根資料夾中解析它們。
  • 如果找不到所請求的資源(或資源),則 getResource 和 getResourceAsStreammethods returnnull, and thegetResourcesmethods return an emptyEnumeration`。

  • 返回的 URL 將使用 URL.toStream() 解析。它們可以是 file: URL 或其他常規 URL,但如果資源位於 JAR 檔案中,它們將是標識 JAR 檔案及其中特定資源的 50 個 URL。

  • 如果你的程式碼使用 getResourceAsStream 方法(或 URL.toStream())來獲取 InputStream,則它負責關閉流物件。未能關閉流可能導致資源洩漏。