日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java Gradle項(xiàng)目中的資源正確獲取方式

瀏覽:19日期:2022-08-20 17:53:01

引言

一個(gè)Java Gradle項(xiàng)目會(huì)涉及到資源的訪問(wèn). 一般情況下會(huì)將當(dāng)前項(xiàng)目所需的資源文件全部放置于resources文件夾下, 無(wú)論是main文件下的source code 還是test文件夾下的test code.

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

兩個(gè)getResource方法

來(lái)看一個(gè)簡(jiǎn)單的Java Gradle項(xiàng)目(稱呼其為simpleresource)的項(xiàng)目結(jié)構(gòu)

Java Gradle項(xiàng)目中的資源正確獲取方式

首先這個(gè)project執(zhí)行build之后會(huì)在根目錄下創(chuàng)建一個(gè)out目錄, 這個(gè)目錄存放所有的編譯結(jié)果(class文件以及資源文件). 如上圖所示production文件夾對(duì)應(yīng)的是source code而test文件夾對(duì)應(yīng)的是test code.

所有的資源都會(huì)存儲(chǔ)在resources文件夾內(nèi)部. 當(dāng)程序運(yùn)行時(shí)獲取的資源就是這個(gè)resources文件夾下的資源.

我們使用最多的獲取資源的方法有兩個(gè) Class.getResource 和 ClassLoader.getResource 但是這兩個(gè)方法傳遞參數(shù)與結(jié)果不同, 下面詳細(xì)分析一下這兩個(gè)方法參數(shù)以及返回值.

先看 ClassLoader 中的 getResource 方法. 只需要獲取類加載器對(duì)象即可(獲取方式不再贅述). 先看這個(gè)方法的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.

從這個(gè)描述中可以得知提供資源的路徑(我理解的是相對(duì)路徑), 正常情況下該方法會(huì)返回資源完整的URL. 傳遞的參數(shù)有一個(gè)重要的注意事項(xiàng), 就是傳遞的參數(shù)不能夠以/ 開(kāi)始, 這也是我為什么稱呼這個(gè)參數(shù)為資源的相路徑. 舉個(gè)例子

URL test = this.getClass().getClassLoader().getResource('/');

運(yùn)行上述代碼返回的結(jié)果是:

Java Gradle項(xiàng)目中的資源正確獲取方式

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

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

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

結(jié)果為:

Java Gradle項(xiàng)目中的資源正確獲取方式

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

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

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

Java Gradle項(xiàng)目中的資源正確獲取方式

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

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

String name = '';

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

Java Gradle項(xiàng)目中的資源正確獲取方式

我的理解是本質(zhì)上是通過(guò)此方法獲取的其實(shí)類加載器加載的class字節(jié)碼目錄, 所以使用空字符串會(huì)看到實(shí)際輸出的是classes文件夾絕對(duì)路徑, 當(dāng)傳遞正確的資源路徑的時(shí)候, 代碼層面做轉(zhuǎn)換, 轉(zhuǎn)而獲取與classes文件夾同級(jí)的resources文件夾下的資源.

再看 Class 中的 getResurce 方法

由于這個(gè)方法傳遞參數(shù)是否是以 / 開(kāi)頭會(huì)產(chǎn)生不同的結(jié)果, 且使用這個(gè)方法也比較容易和 ClassLoader 中的 getResource 方法搞混淆, 所以本文多次強(qiáng)調(diào)傳遞的參數(shù)是否以 / 開(kāi)始.

首先看傳遞參數(shù)為 '' 和 / 的兩種情況得到的結(jié)果:

使用空字符串:

String name = '';

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

運(yùn)行結(jié)果:

Java Gradle項(xiàng)目中的資源正確獲取方式

使用 /

String name = '/';

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

運(yùn)行結(jié)果為:

Java Gradle項(xiàng)目中的資源正確獲取方式

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

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

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

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

運(yùn)行結(jié)果:

Java Gradle項(xiàng)目中的資源正確獲取方式

所以綜上所述, 一個(gè)簡(jiǎn)單的防止兩個(gè)方法傳遞參數(shù)搞混淆的記憶方式就是使用 Class 的 getResource 方法需要加 / 而使用 ClassLoader 的 getResource 方法不要加 /.

其實(shí)參考 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); }

本質(zhì)上講它也是調(diào)用ClassLoader 中的getResource 方法. 其中resolveName 這個(gè)方法對(duì)傳遞的參數(shù)做了轉(zhuǎn)換.

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; }

當(dāng)傳遞的參數(shù)帶有/ 時(shí)候, resolveName 會(huì)將/ 去除后的字符串返回, 最后調(diào)用ClassLoader 中的 getResource 方法.

小結(jié)

本文對(duì)比了一下Class 和 ClassLoader 中的getResource 方法的差異,如果單純從資源的獲取角度來(lái)看最終調(diào)用的都是ClassLoader 中的getResource 方法.

簡(jiǎn)單記憶即是使用Class 的getResource 方法資源路徑需要加/ 而使用ClassLoader 中的getResource 方法則不需要加/.

以上這篇Java Gradle項(xiàng)目中的資源正確獲取方式就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久国产精品美女| 日韩视频在线一区二区三区 | 精品久久久久中文字幕小说| 日韩黄色av| 四虎精品一区二区免费| 日韩视频不卡| 日韩午夜黄色| 日韩精品一级二级| 久久亚洲精品伦理| 亚洲欧美成人综合| 午夜日韩av| 香蕉人人精品| 久久久久久久久丰满| 99久久激情| 国产视频一区欧美| 中文字幕亚洲在线观看| 日韩视频一二区| 91精品福利观看| 国产精一区二区| 美女国产精品久久久| 国产精品成人3p一区二区三区| 国产精品调教视频| 国产精品白丝一区二区三区| 中文字幕一区二区精品区| 久久国产尿小便嘘嘘| 精品欠久久久中文字幕加勒比| 国产一区二区三区网| zzzwww在线看片免费| 国产在线视频欧美一区| 精品国产一区二区三区2021| 久久久久久久欧美精品| 国产免费成人| 日韩欧美久久| 日韩不卡手机在线v区| 在线日韩中文| 久久一区二区三区喷水| 日韩大片在线观看| 亚洲精品网址| 国产偷自视频区视频一区二区| 最新国产精品视频| 日韩精品久久久久久| 日韩高清电影免费| 高清在线一区| 成人小电影网站| 欧美日韩国产欧| 久久午夜影视| 欧美一区自拍| 你懂的亚洲视频| 久久电影tv| 91久久在线| 最新国产拍偷乱拍精品| 日韩激情网站| 国产精品免费大片| 一区二区三区四区日本视频| 日本美女一区| 欧美特黄一级大片| 亚洲精品进入| 麻豆久久久久久| 啪啪国产精品| 国产一区导航| 国产美女久久| 91嫩草亚洲精品| 国产精品密蕾丝视频下载| 久久久久久久久久久9不雅视频| 在线亚洲免费| 91成人精品观看| 黑森林国产精品av| 综合激情一区| 国产毛片一区二区三区| 久久精品国产大片免费观看| 国产精品日本| 欧美亚洲专区| 欧美成人日韩| 日韩欧美中文字幕在线视频| 成人片免费看| 玖玖精品视频| 天堂√中文最新版在线| 亚洲少妇自拍| 美女精品久久| 免费av一区二区三区四区| 不卡在线一区| 久久精品国产久精国产| 不卡一区综合视频| 欧美黄色精品| 久久久久免费av| 91精品日本| 久久影院午夜精品| 国产日本精品| 亚洲一级网站| 国语精品一区| 中文字幕一区二区三区四区久久 | 日韩一区欧美二区| 日本久久精品| 一区二区精品| 欧美理论视频| 天堂av在线| 精品理论电影在线| 日韩国产欧美三级| 中国女人久久久| 久久狠狠久久| 日韩不卡视频在线观看| 91亚洲无吗| 性色一区二区| 国产中文字幕一区二区三区| 91精品国产自产精品男人的天堂 | 日本成人一区二区| 亚洲一区二区三区高清| 亚洲精选久久| 日韩中文在线电影| 国产精品网在线观看| 91久久中文| 精品一区二区男人吃奶 | 国产一区日韩一区| 欧美激情一区| 亚洲国产日韩欧美在线| 国产精品一区二区精品| 亚洲一区日韩| 亚洲精品1区| 国产精品国产一区| 久久久免费人体| 婷婷视频一区二区三区| 视频一区二区中文字幕| 久久久五月天| 神马午夜久久| 91亚洲一区| 日韩av片子| 国产精品二区影院| 欧美亚洲日本精品| 麻豆精品蜜桃视频网站| 亚洲免费福利一区| 美女91精品| 亚洲精品.com| 日韩三区免费| 九九99久久精品在免费线bt| 精品一区二区三区免费看| 久久激情五月激情| 欧美激情日韩| 91精品国产一区二区在线观看| 亚洲91网站| 国产精品免费看| 99久久亚洲精品蜜臀| 成人国产精品久久| 欧美专区在线| 亚洲视频国产精品| 久久一二三区| 久久午夜影视| 一区在线视频观看| 免费成人性网站| 中文精品视频| 精品91久久久久| 亚洲免费中文| 视频在线在亚洲| 蜜臀av性久久久久蜜臀aⅴ流畅 | 亚洲免费成人av在线| 99视频精品| 亚洲午夜精品久久久久久app| 成人片免费看| 亚洲h色精品| 91精品一区国产高清在线gif | 免费精品视频最新在线| 少妇精品在线| 香蕉久久久久久久av网站| 一本色道精品久久一区二区三区| 亚洲专区视频| 亚洲久久视频| 国产精品videosex极品| 国产精品一级| 视频在线不卡免费观看| 欧美日韩一区二区三区在线电影| 国产调教一区二区三区| 蜜臀av性久久久久蜜臀aⅴ四虎| 综合激情五月婷婷| 国产福利亚洲| 97精品一区| 丝袜av一区| 欧美专区在线| 国产欧美另类| 老司机精品视频网| av亚洲免费| 久久国产亚洲| 亚洲精品激情| 欧美日韩伊人| 黄在线观看免费网站ktv| 久久国产毛片| 日本欧美大码aⅴ在线播放| 久久不卡国产精品一区二区| 欧美羞羞视频| 免播放器亚洲| 久久久久久色| 粉嫩av一区二区三区四区五区| 欧美日韩水蜜桃| 免费人成精品欧美精品| 亚洲久久视频| 日韩成人精品一区| 成人小电影网站| 色综合视频一区二区三区日韩 | 蜜桃av一区二区在线观看| 日韩精品三级| 日韩精品欧美| 亚洲欧美网站在线观看|