成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

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

引言

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

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

兩個getResource方法

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

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

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

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

我們使用最多的獲取資源的方法有兩個 Class.getResource 和 ClassLoader.getResource 但是這兩個方法傳遞參數(shù)與結(jié)果不同, 下面詳細(xì)分析一下這兩個方法參數(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ù)有一個重要的注意事項(xiàng), 就是傳遞的參數(shù)不能夠以/ 開始, 這也是我為什么稱呼這個參數(shù)為資源的相路徑. 舉個例子

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ù)為資源相對路徑(相對于resources文件夾的路徑), 既然是相對路徑自然參數(shù) 不能夠以 / 開始.

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

String name = '';

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

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

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

再看 Class 中的 getResurce 方法

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

首先看傳遞參數(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ū)別是使用空字符串 '' 獲取的路徑是相對于包的目錄, 而使用 / 獲取的路徑是類加載器加載class文件的目錄, 這個和 ClassLoader 的 getResource 方法傳遞 '' 字符串的結(jié)果是一樣的. 所以如果要正確的獲取到資源文件,

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

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

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

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

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

所以綜上所述, 一個簡單的防止兩個方法傳遞參數(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 這個方法對傳遞的參數(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ù)帶有/ 時候, resolveName 會將/ 去除后的字符串返回, 最后調(diào)用ClassLoader 中的 getResource 方法.

小結(jié)

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

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

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

標(biāo)簽: Java
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
久久久99精品久久| 一区二区三区资源| 亚洲香肠在线观看| 欧美人xxxx| 99热免费精品在线观看| 国产资源精品在线观看| 国产日韩欧美麻豆| 欧美日韩一二三| 国产精品亚洲综合久久| 91在线观看成人| 国产中文字幕一区| 五月婷婷综合在线| 亚洲欧美成aⅴ人在线观看 | 色欧美片视频在线观看在线视频| 99久久er热在这里只有精品66| 天天做天天摸天天爽国产一区| 国产日韩欧美综合在线| 在线一区二区三区| 亚洲深夜av| 国产精品v亚洲精品v日韩精品 | 亚洲一区二区成人| 精品黑人一区二区三区久久 | 国产精品―色哟哟| 国精品一区二区| 中文字幕一区免费在线观看| 亚洲欧洲日韩综合二区| 日韩视频在线观看国产| 国产在线不卡一卡二卡三卡四卡| 一区二区三区91| 欧美极品美女视频| 精品久久国产97色综合| 美女精品在线观看| 合欧美一区二区三区| 91麻豆.com| a级精品国产片在线观看| 国内精品写真在线观看| 91精品国产色综合久久ai换脸| 成人午夜在线免费| 26uuu色噜噜精品一区二区| 中日韩视频在线观看| 午夜日韩电影| 欧美激情一区| 亚洲久久成人| 噜噜噜噜噜久久久久久91| 亚洲二区三区四区| 亚洲欧美不卡| 欧美系列日韩一区| 日韩视频一区在线观看| 精品久久久久久久久久久久久久久| 欧美刺激午夜性久久久久久久| 日韩欧美资源站| 国产精品久线在线观看| 亚洲日本护士毛茸茸| 亚洲小少妇裸体bbw| 美美哒免费高清在线观看视频一区二区 | 欧美亚洲综合在线| 欧美日本在线播放| 精品免费一区二区三区| 中文字幕在线一区免费| 亚洲女同ⅹxx女同tv| 日本一区二区三区高清不卡| 亚洲美女免费视频| 久久精品免费观看| 国v精品久久久网| 欧美福利视频| 国产亚洲精品久久久久婷婷瑜伽| 亚洲一区3d动漫同人无遮挡| 欧美日韩国产在线观看| 久久先锋影音av| 亚洲精品国产第一综合99久久| 婷婷国产v国产偷v亚洲高清| 国产乱码精品一区二区三区av| 99久久亚洲一区二区三区青草| 亚洲毛片网站| 欧美日韩一区视频| 26uuu亚洲综合色欧美| 亚洲码国产岛国毛片在线| 男女男精品视频| 成人午夜在线免费| 亚洲黑丝一区二区| 欧美日韩亚洲综合一区二区三区| 日韩欧美国产一区二区在线播放 | 91麻豆免费看| 亚洲欧美久久久久一区二区三区| 欧美精选一区二区| 国产欧美日韩在线| 天天综合网 天天综合色| 粉嫩av一区二区三区在线播放| 亚洲看片网站| 欧洲生活片亚洲生活在线观看| 国产亚洲精品7777| 奇米四色…亚洲| 欧美成人免费在线| 91国在线观看| 亚洲欧洲成人精品av97| 精品亚洲国产成人av制服丝袜| 亚洲午夜在线| 日韩欧美在线综合网| 午夜欧美2019年伦理| 99久久久免费精品国产一区二区| 色狠狠桃花综合| 中文字幕一区二区三区在线播放| 国产乱码精品一品二品| 香蕉久久夜色精品国产| 久久一区二区三区四区| 亚洲成人免费在线| 欧美~级网站不卡| 欧美性猛片xxxx免费看久爱| 亚洲欧美日韩在线| 成人免费视频播放| 欧美日韩高清影院| 午夜欧美在线一二页| 亚洲激情成人| 国产亚洲欧美日韩在线一区| 精品一区二区在线视频| 亚洲一区二区三区涩| 国产亚洲1区2区3区| 国产福利一区二区三区| 久久午夜激情| 亚洲精品欧美综合四区| 国产成人精品三级| 欧美日韩精品福利| 日本免费新一区视频| 国产日韩三区| 亚洲卡通动漫在线| 亚洲国产一区二区三区a毛片| 国产精品丝袜在线| 欧美一区二区在线| 久久精品男人天堂av| 日韩一区二区在线观看视频| 国产精品试看| 亚洲性色视频| 91丨porny丨蝌蚪视频| 国产激情视频一区二区在线观看| 亚洲欧美日本日韩| 制服丝袜中文字幕亚洲| 蜜臀av性久久久久蜜臀av麻豆 | 欧美国产禁国产网站cc| 成人精品视频一区二区三区| 欧美精品日韩一本| 国产精品一区二区久久不卡| 51久久夜色精品国产麻豆| 狠狠网亚洲精品| 7777精品伊人久久久大香线蕉| 另类中文字幕网| 欧美日韩dvd在线观看| 国产呦精品一区二区三区网站| 欧美人狂配大交3d怪物一区| 国产精品18久久久久久久久| 欧美va在线播放| 91在线观看美女| 亚洲视频每日更新| 国产精品久久| 日韩精品亚洲专区| 7777女厕盗摄久久久| 91免费小视频| 亚洲三级电影网站| 在线亚洲免费视频| 国产伦精一区二区三区| 久久久精品中文字幕麻豆发布| 国产在线欧美| 一片黄亚洲嫩模| 欧美曰成人黄网| 国产一区二区三区的电影| 黄色成人在线网站| 91亚洲国产成人精品一区二区三 | 国产人伦精品一区二区| 国产精品av久久久久久麻豆网| 亚洲午夜一区二区| 欧美人妖巨大在线| 欧美日韩精品免费观看| 一区二区免费在线播放| 91精品国产综合久久久蜜臀粉嫩 | 久久国产精品亚洲va麻豆| 免费看黄色91| 精品粉嫩aⅴ一区二区三区四区| jvid福利写真一区二区三区| 一区二区国产视频| 日韩视频免费观看高清完整版 | 亚洲毛片av在线| 欧美亚洲国产一区二区三区va | 亚洲经典视频在线观看| 三级欧美在线一区| 欧美一三区三区四区免费在线看 | 日韩欧美亚洲另类制服综合在线| 狠狠爱www人成狠狠爱综合网 | 欧美精品九九| 亚洲a一区二区| 久久综合精品国产一区二区三区| 中文一区在线| 国产永久精品大片wwwapp| 欧美国产激情二区三区 | 裸体在线国模精品偷拍| 久久久不卡网国产精品一区| 久久久久国产精品一区二区| 欧美精品啪啪| 成年人国产精品| 国产麻豆一精品一av一免费 | 亚洲精品欧美精品| 国产成人a级片|