走出Java資源加載的迷宮
Java開發中常常要加載各種各樣的資源文件,如property文件,xml配置文件,圖片文件等等。
Java的資源加載策略選擇比較多,很多資源加載方法都是基於不同的項目配置,沒有一種資源加載方法是萬能的。首先來看看Java中的幾種常見的資源加載方法:
一:通過ResourceBundle類來實現資源加載
這種方式通常被用來加載多語言支持的property文件,Java語言通過ResourceBundle可以非常好的支持國際化。假設在默認為英文的系統中有語言資源文件mybundle_en.properties,則調用代碼如下:
ResourceBundle myBundle =ResourceBundle.getBundle("mybundle");
資源文件mybundle_en.properties的位置應該在sourcefolder的根目錄下,假如資源文件位於包路徑com.mybundle.test下則上述代碼應該改寫為:
ResourceBundle myBundle =ResourceBundle.getBundle("com.mybundle.test.mybundle");
二:通過Class類的getResourceAsStream()方法來實現資源加載這種加載方式同時是最常用也是最容易讓開發者搞錯的方法,getResourceAsStream()方法使用默認文件名加載資源時,要求資源必須與Class文件同時相同的包路徑。加載代碼如下:
client.getClass().getResourceAsStream("mybundle.properties");
三:通過ClassLoader的getResourceAsStream()來實現資源文件加載通過ClassLoader來加載資源文件是一種非常有效和實用的方法,只要資源位於classpath的路徑下面,ClassLoader都可以通過適當的策略來找到你要加載的資源。但是應該注意的是如果你的資源位於SourceFloder的根目錄,如下代碼就可以完成:
this.getClass().getClassLoader().getResource("mybundle.properties");
如果你的資源文件位於獨立的config文件中,只需要把config配置到classpath的變量中,然後使用如下代碼即可:
this.getClass().getClassLoader().getResource("config/mybundle.properties");
三種資源加載方式比較與總結:
方法
參數
失敗時行為
用法示例代碼
ClassLoader.
getResourceAsStream()
絕對路徑加載時候不需要反斜槓/
Silent (return null)
This.getCalss().
getClassLoader().
getResourceAsStream(“
some/pkg/resource.prpperties
”);
Class.
getResourceAsStream()
有反斜槓/表現為絕對路徑
Silent(return null)
This.getClass().
getResourceAsStream(“
resource.properties”);
ResourceBundle.
getBundle()
不需要反斜槓/, .已經暗示絕對路徑
.properties為其默認的文件擴展名
Throws unchecked
java.util.MissingResource
Exception
ResourceBundle.getBundle(
“some.pkg.resource”)