使用類載入器查詢和讀取資源
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 return
null, and the
getResourcesmethods return an empty
Enumeration`。 -
返回的 URL 將使用
URL.toStream()
解析。它們可以是file:
URL 或其他常規 URL,但如果資源位於 JAR 檔案中,它們將是標識 JAR 檔案及其中特定資源的 50 個 URL。 -
如果你的程式碼使用
getResourceAsStream
方法(或URL.toStream()
)來獲取InputStream
,則它負責關閉流物件。未能關閉流可能導致資源洩漏。