欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

在JavaGradle項目中怎么獲取資源-創(chuàng)新互聯(lián)

在Java Gradle項目中怎么獲取資源?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

網(wǎng)站建設公司,為您提供網(wǎng)站建設,網(wǎng)站制作,網(wǎng)頁設計及定制網(wǎng)站建設服務,專注于成都企業(yè)網(wǎng)站建設,高端網(wǎng)頁制作,對發(fā)電機維修等多個行業(yè)擁有豐富的網(wǎng)站建設經(jīng)驗的網(wǎng)站建設公司。專業(yè)網(wǎng)站設計,網(wǎng)站優(yōu)化推廣哪家好,專業(yè)seo優(yōu)化排名優(yōu)化,H5建站,響應式網(wǎng)站。

一個Java Gradle項目會涉及到資源的訪問. 一般情況下會將當前項目所需的資源文件全部放置于resources文件夾下, 無論是main文件下的source code 還是test文件夾下的test code.


都或多或少的涉及到獲取resources文件夾下的資源. 本文主要目的就是詳細的總結(jié)一下如何獲取resources文件夾下的資源.

兩個getResource方法

來看一個簡單的Java Gradle項目(稱呼其為simpleresource)的項目結(jié)構(gòu)

在Java Gradle項目中怎么獲取資源

首先這個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é)果是:

在Java Gradle項目中怎么獲取資源

參考simpleresource的項目結(jié)構(gòu), 正確獲取 com.mainres 下的文件的正確做法是:

String name = "com/mainres/testmain.txt";

URL test = this.getClass().getClassLoader().getResource(name);

結(jié)果為:

在Java Gradle項目中怎么獲取資源

如果在表示資源路徑的字符串中加上 / 那么獲取到的URL依然為null

String name = "/com/mainres/testmain.txt";

URL test = this.getClass().getClassLoader().getResource(name);

在Java Gradle項目中怎么獲取資源

宗上所述, 使用類加載器獲取資源的方式傳遞的參數(shù)為資源相對路徑(相對于resources文件夾的路徑), 既然是相對路徑自然參數(shù) 不能夠以 / 開始.

有一個問題需要注意, 當傳遞參數(shù)為空字符串的時候, 得到路徑其實是classes文件夾的絕對路徑, 但當傳遞一個正確的資源路徑相對字符串時, 得到路徑卻是resources文件夾下的資源路徑.

String name = "";

URL test = this.getClass().getClassLoader().getResource(name);

在Java Gradle項目中怎么獲取資源

我的理解是本質(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é)果:

在Java Gradle項目中怎么獲取資源

使用 /

String name = "/";

URL test = this.getClass().getResource(name);

運行結(jié)果為:

在Java Gradle項目中怎么獲取資源

較大的區(qū)別是使用空字符串 "" 獲取的路徑是相對于包的目錄, 而使用 / 獲取的路徑是類加載器加載class文件的目錄, 這個和 ClassLoader 的 getResource 方法傳遞 "" 字符串的結(jié)果是一樣的. 所以如果要正確的獲取到資源文件,

那么使用 Class 的 getResource 方法如下:

String name = "/com/mainres/testmain.txt";

URL test = this.getClass().getResource(name);

運行結(jié)果:

在Java Gradle項目中怎么獲取資源

所以綜上所述, 一個簡單的防止兩個方法傳遞參數(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)

綿陽服務器托管