在Java Gradle項目中怎么獲取資源?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
一個Java Gradle項目會涉及到資源的訪問. 一般情況下會將當前項目所需的資源文件全部放置于resources文件夾下, 無論是main文件下的source code 還是test文件夾下的test code.
都或多或少的涉及到獲取resources文件夾下的資源. 本文主要目的就是詳細的總結(jié)一下如何獲取resources文件夾下的資源.
兩個getResource方法
來看一個簡單的Java Gradle項目(稱呼其為simpleresource)的項目結(jié)構(gòu)
首先這個project執(zhí)行build之后會在根目錄下創(chuàng)建一個out目錄, 這個目錄存放所有的編譯結(jié)果(class文件以及資源文件). 如上圖所示production文件夾對應的是source code而test文件夾對應的是test code.
所有的資源都會存儲在resources文件夾內(nèi)部. 當程序運行時獲取的資源就是這個resources文件夾下的資源.
我們使用最多的獲取資源的方法有兩個 Class.getResource 和 ClassLoader.getResource 但是這兩個方法傳遞參數(shù)與結(jié)果不同, 下面詳細分析一下這兩個方法參數(shù)以及返回值.
先看 ClassLoader 中的 getResource 方法. 只需要獲取類加載器對象即可(獲取方式不再贅述). 先看這個方法的API文檔相關(guān)的描述:
Finds the resource with the given name. A resource is some data (images, audio, text, etc) that can be accessed by class code in a way that is independent of the location of the code. The name of a resource is a '/'-separated path name that identifies the resource.
This method will first search the parent class loader for the resource; if the parent is null the path of the class loader built-in to the virtual machine is searched. That failing, this method will invoke findResource(String) to find the resource.
從這個描述中可以得知提供資源的路徑(我理解的是相對路徑), 正常情況下該方法會返回資源完整的URL. 傳遞的參數(shù)有一個重要的注意事項, 就是傳遞的參數(shù)不能夠以/ 開始, 這也是我為什么稱呼這個參數(shù)為資源的相路徑. 舉個例子
URL test = this.getClass().getClassLoader().getResource("/");
運行上述代碼返回的結(jié)果是:
參考simpleresource的項目結(jié)構(gòu), 正確獲取 com.mainres 下的文件的正確做法是:
String name = "com/mainres/testmain.txt";
URL test = this.getClass().getClassLoader().getResource(name);
結(jié)果為:
如果在表示資源路徑的字符串中加上 / 那么獲取到的URL依然為null
String name = "/com/mainres/testmain.txt";
URL test = this.getClass().getClassLoader().getResource(name);
宗上所述, 使用類加載器獲取資源的方式傳遞的參數(shù)為資源相對路徑(相對于resources文件夾的路徑), 既然是相對路徑自然參數(shù) 不能夠以 / 開始.
有一個問題需要注意, 當傳遞參數(shù)為空字符串的時候, 得到路徑其實是classes文件夾的絕對路徑, 但當傳遞一個正確的資源路徑相對字符串時, 得到路徑卻是resources文件夾下的資源路徑.
String name = "";
URL test = this.getClass().getClassLoader().getResource(name);
我的理解是本質(zhì)上是通過此方法獲取的其實類加載器加載的class字節(jié)碼目錄, 所以使用空字符串會看到實際輸出的是classes文件夾絕對路徑, 當傳遞正確的資源路徑的時候, 代碼層面做轉(zhuǎn)換, 轉(zhuǎn)而獲取與classes文件夾同級的resources文件夾下的資源.
再看 Class 中的 getResurce 方法
由于這個方法傳遞參數(shù)是否是以 / 開頭會產(chǎn)生不同的結(jié)果, 且使用這個方法也比較容易和 ClassLoader 中的 getResource 方法搞混淆, 所以本文多次強調(diào)傳遞的參數(shù)是否以 / 開始.
首先看傳遞參數(shù)為 "" 和 / 的兩種情況得到的結(jié)果:
使用空字符串:
String name = "";
URL test = this.getClass().getResource(name);
運行結(jié)果:
使用 /
String name = "/";
URL test = this.getClass().getResource(name);
運行結(jié)果為:
較大的區(qū)別是使用空字符串 "" 獲取的路徑是相對于包的目錄, 而使用 / 獲取的路徑是類加載器加載class文件的目錄, 這個和 ClassLoader 的 getResource 方法傳遞 "" 字符串的結(jié)果是一樣的. 所以如果要正確的獲取到資源文件,
那么使用 Class 的 getResource 方法如下:
String name = "/com/mainres/testmain.txt";
URL test = this.getClass().getResource(name);
運行結(jié)果:
所以綜上所述, 一個簡單的防止兩個方法傳遞參數(shù)搞混淆的記憶方式就是使用 Class 的 getResource 方法需要加 / 而使用 ClassLoader 的 getResource 方法不要加 /.
其實參考 Class 類中的 getResource 方法:
public java.net.URL getResource(String name) { name = resolveName(name); ClassLoader cl = getClassLoader0(); if (cl==null) { // A system class. return ClassLoader.getSystemResource(name); } return cl.getResource(name); }
新聞名稱:在JavaGradle項目中怎么獲取資源-創(chuàng)新互聯(lián)
瀏覽路徑:http://chinadenli.net/article8/dgjgop.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、商城網(wǎng)站、品牌網(wǎng)站設計、面包屑導航、品牌網(wǎng)站制作、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容