使用類載入器查詢和讀取資源
Java 中的資源載入包括以下步驟:
- 找到將找到資源的
Class或ClassLoader。 - 尋找資源。
- 獲取資源的位元組流。
- 讀取和處理位元組流。
- 關閉位元組流。
最後三個步驟通常通過將 URL 傳遞給庫方法或建構函式來載入資源來完成。在這種情況下,你通常會使用 getResource 方法。還可以在應用程式程式碼中讀取資源資料。在這種情況下,你通常會使用 getResourceAsStream。
絕對和相對資源路徑
可以從 classpath 載入資源由表示路徑。該路徑的語法類似於 UNIX / Linux 檔案路徑。它由正斜槓(/)字元分隔的簡單名稱組成。甲相對路徑與名稱開始,一個絕對路徑與分離開始。
正如 Classpath 示例所描述的那樣,JVM 的類路徑通過在類路徑中覆蓋目錄和 JAR 或 ZIP 檔案的名稱空間來定義名稱空間。當解析絕對路徑時,類載入器會將初始/解釋為名稱空間的根。相反,可以相對於名稱空間中的任何資料夾 來解析相對路徑。使用的資料夾取決於用於解析路徑的物件。
獲取類或類載入器
可以使用 Class 物件或 ClassLoader 物件定位資源。Class 物件可以解析相對路徑,因此如果你有(類)相對資源,通常會使用其中一個。有多種方法可以獲得 Class 物件。例如:
-
一類文字會給你,你可以在 Java 原始碼名稱的任何類的
Class物件; 例如String.class為String型別提供了Class物件。 -
Object.getClass()將為你提供任何物體型別的Class物件; 例如"hello".getClass()是獲得String型別的另一種方式。 -
Class.forName(String)方法將(如果需要)動態載入一個類並返回其Class物件; 例如Class.forName("java.lang.String")。
通常通過在 Class 物件上呼叫 getClassLoader() 來獲得 ClassLoader 物件。也可以使用靜態 ClassLoader.getSystemClassLoader() 方法獲取 JVM 的預設類載入器。
get 的方法
擁有 Class 或 ClassLoader 例項後,你可以使用以下方法之一找到資源:
筆記:
-
ClassLoader和Class版本方法之間的主要區別在於解釋相對路徑的方式。Class方法解析與類包對應的資料夾中的相對路徑。ClassLoader方法將相對路徑視為絕對路徑; 即在類路徑名稱空間的根資料夾中解析它們。
-
如果找不到所請求的資源(或資源),則
getResource和 getResourceAsStreammethods returnnull, and thegetResourcesmethods return an emptyEnumeration`。 -
返回的 URL 將使用
URL.toStream()解析。它們可以是file:URL 或其他常規 URL,但如果資源位於 JAR 檔案中,它們將是標識 JAR 檔案及其中特定資源的 50 個 URL。 -
如果你的程式碼使用
getResourceAsStream方法(或URL.toStream())來獲取InputStream,則它負責關閉流物件。未能關閉流可能導致資源洩漏。