如何使用示例从Java中的类路径加载资源
Java中的類路徑不僅用于加載.class文件,而且還可以用于加載資源,例如屬性文件,圖像,圖標(biāo),縮略圖或任何二進(jìn)制內(nèi)容。 Java提供了API來將這些資源讀取為InputStream或URL。 假設(shè)您在項(xiàng)目的config文件夾中有一個(gè)屬性文件 ,并且想要加載該屬性文件,該怎么做? 同樣,您的項(xiàng)目的icons目錄中有Web應(yīng)用程序的圖標(biāo)和縮略圖,如何加載它們? 答案是通過使用java.lang.Class'getResource()和getResourceAsStream()方法。 這些方法接受資源的路徑為String并分別返回URL和InputStream。 您可以通過調(diào)用getClass()方法或使用類literal獲取類的引用。 如果有一個(gè)對(duì)象,則可以調(diào)用getClass(),因?yàn)樗且粋€(gè)非靜態(tài)方法,另一方面,如果沒有任何對(duì)象,則可以簡(jiǎn)單地將.class與任何類的名稱一起使用,例如Sample.class將為您提供java.lang.Class的參考。 JDK 1.1提供了這些方法,您甚至可以在有權(quán)訪問核心Java庫(kù)的任何地方使用它們。 如果要?jiǎng)?chuàng)建J2ME游戲或應(yīng)用程序,則可以使用這些方法為游戲加載圖標(biāo)和圖塊,并為應(yīng)用程序加載所有其他資源。
在內(nèi)部,此方法將資源的加載請(qǐng)求委托給其類加載器。 如果對(duì)由BootStrap ClassLoader加載的對(duì)象調(diào)用getResourceAsStream()方法,則它將把它委托給ClassLoader.getSystemResourceAsStream(java.lang.String)方法。 我們將資源的路徑傳遞給此方法,但是用于搜索與給定類關(guān)聯(lián)的資源的規(guī)則是由該類的定義類加載器實(shí)現(xiàn)的。 由于您可以將絕對(duì)路徑和相對(duì)路徑都傳遞給Class.getResourceAsStream(),但是ClassLoader.getResourceAsStream()采用絕對(duì)路徑,因此這就是使用以下算法從給定資源名稱構(gòu)造絕對(duì)資源名稱的原因:
 如果名稱以'/'('\ u002f')開頭,則資源的絕對(duì)名稱是名稱中'/'之后的部分。 否則,絕對(duì)名稱的格式如下: 
 modified_pa??ckage_name / name,其中modified_pa??ckage_name是此對(duì)象的軟件包名稱,用“ /”代替“。”。 ('\ u002e')。 
這意味著,如果app.properties存儲(chǔ)在com.abc.config包中而不是當(dāng)前類的包中,則傳遞給該方法的資源名稱應(yīng)類似于/com/abc/config/app.properties。
如果您通過使用快捷鍵Ctrl + T并鍵入java.lang.Class來查看Eclipse IDE中java.lang.Class的代碼,則可以看到此方法的工作方式:
public InputStream getResourceAsStream(String name) {name = resolveName(name);ClassLoader cl = getClassLoader0();if (cl==null) {// A system class.return ClassLoader.getSystemResourceAsStream(name);}return cl.getResourceAsStream(name); }該算法是通過resolveName()方法實(shí)現(xiàn)的,如下所示:
/*** Add a package name prefix if the name is not absolute Remove leading "/"* if name is absolute*/private String resolveName(String name) {if (name == null) {return name;}if (!name.startsWith("/")) {Class c = this;while (c.isArray()) {c = c.getComponentType();}String baseName = c.getName();int index = baseName.lastIndexOf('.');if (index != -1) {name = baseName.substring(0, index).replace('.', '/')+"/"+name;}} else {name = name.substring(1);}return name;}  
 使用getResourceAsStream()方法加載資源時(shí)出現(xiàn)的主要問題是NullPointerException ,因?yàn)榇朔椒ㄈ绻也坏劫Y源,則返回null。 在下面的示例中,我們有一個(gè)Eclipse項(xiàng)目,并且我在config目錄中創(chuàng)建了一個(gè)名為app.properties的屬性文件。 現(xiàn)在要加載該文件,我只需要傳遞“ app.properties”,如果傳遞諸如“ config / app.properties”或“ /config/app.properties”之類的內(nèi)容,getResourceAsStream()將返回null,隨后代碼將拋出NullPointerException如下所示: 
為了避免此錯(cuò)誤,您必須在使用getResourceAsStream()之前檢查其輸出,由于這種方法,防御性編程就在那里。
這是我們完整的Java程序,可以從Java的classpath加載圖像,資源,文本文件或二進(jìn)制文件,資源可以是任何東西,重要的是必須可訪問。
package test;import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Properties;/*** Java Program to demonstrate how to load resources e.g. properties file from* classpath. There are two ways to load resources in Java, one by using* getResourceAsStream() and getResource() method from java.lang.Class. Main* difference between these two methods are that one returns an InputStream* while other returns a URL object.** @author Javin Paul*/ public class ResourceLoader{public static void main(String args[]) {// loading resource using getResource() methodInputStream in = Test.class.getResourceAsStream("app.properties");Properties config = new Properties();try {config.load(in);System.out.println(config.getProperty("name"));System.out.println(config.getProperty("version"));} catch (IOException e1) {e1.printStackTrace();}// loading resource using getResourceAsStream() methodURL resourceURL = Test.class.getResource("app.properties");Properties appConfig = new Properties();try {appConfig.load(resourceURL.openStream());System.out.println(appConfig.getProperty("name"));System.out.println(appConfig.getProperty("version"));} catch (IOException e) {e.printStackTrace();}}}Output: SampleApp 1.0.0 SampleApp 1.0.0如果仔細(xì)觀察,您會(huì)發(fā)現(xiàn)我們同時(shí)使用了getResource()和getResourceAsStream()方法從Java中的類路徑加載資源,在這種情況下只是屬性文件。 第一個(gè)示例看上去比第二個(gè)示例更加簡(jiǎn)潔,因?yàn)槲覀儾恍枰蜷_顯式流,getResourceAsStream()方法將返回一個(gè)InputStream ,可以在任何地方使用它。 這就是如何從Java中的類路徑加載資源的全部?jī)?nèi)容。
翻譯自: https://www.javacodegeeks.com/2014/08/how-to-load-resources-from-classpath-in-java-with-example.html
總結(jié)
以上是生活随笔為你收集整理的如何使用示例从Java中的类路径加载资源的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 哈弗枭龙 MAX 车型首次 OTA 今日
 - 下一篇: JPA / Hibernate实体状态转