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

您的位置:首頁技術文章
文章詳情頁

Java Gradle項目中的資源正確獲取方式

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

引言

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

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

兩個getResource方法

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

Java Gradle項目中的資源正確獲取方式

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

所有的資源都會存儲在resources文件夾內部. 當程序運行時獲取的資源就是這個resources文件夾下的資源.

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

先看 ClassLoader 中的 getResource 方法. 只需要獲取類加載器對象即可(獲取方式不再贅述). 先看這個方法的API文檔相關的描述:

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. 傳遞的參數有一個重要的注意事項, 就是傳遞的參數不能夠以/ 開始, 這也是我為什么稱呼這個參數為資源的相路徑. 舉個例子

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

運行上述代碼返回的結果是:

Java Gradle項目中的資源正確獲取方式

參考simpleresource的項目結構, 正確獲取 com.mainres 下的文件的正確做法是:

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

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

結果為:

Java Gradle項目中的資源正確獲取方式

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

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

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

Java Gradle項目中的資源正確獲取方式

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

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

String name = '';

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

Java Gradle項目中的資源正確獲取方式

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

再看 Class 中的 getResurce 方法

由于這個方法傳遞參數是否是以 / 開頭會產生不同的結果, 且使用這個方法也比較容易和 ClassLoader 中的 getResource 方法搞混淆, 所以本文多次強調傳遞的參數是否以 / 開始.

首先看傳遞參數為 '' 和 / 的兩種情況得到的結果:

使用空字符串:

String name = '';

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

運行結果:

Java Gradle項目中的資源正確獲取方式

使用 /

String name = '/';

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

運行結果為:

Java Gradle項目中的資源正確獲取方式

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

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

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

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

運行結果:

Java Gradle項目中的資源正確獲取方式

所以綜上所述, 一個簡單的防止兩個方法傳遞參數搞混淆的記憶方式就是使用 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); }

本質上講它也是調用ClassLoader 中的getResource 方法. 其中resolveName 這個方法對傳遞的參數做了轉換.

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

當傳遞的參數帶有/ 時候, resolveName 會將/ 去除后的字符串返回, 最后調用ClassLoader 中的 getResource 方法.

小結

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

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

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

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美精品导航| 99热精品在线| 亚洲综合二区| 秋霞影院一区二区三区| 国产精品国产三级在线观看| 久久av在线| 欧美国产91| 欧美日韩视频免费看| 首页欧美精品中文字幕| 欧美日韩精品一区二区视频| 欧美国产日本| 国产欧美一区二区三区国产幕精品| 激情六月综合| 国产精品黄色| 欧美欧美黄在线二区| 综合国产视频| 亚洲开心激情| 四虎在线精品| 亚洲久久在线| 蜜桃av一区二区三区电影| 日韩不卡免费高清视频| 国产一区2区在线观看| 国产精品麻豆成人av电影艾秋 | 国产精品99一区二区三| 国产日本亚洲| 国产精品视频3p| 国产精品亚洲欧美日韩一区在线| 久久99久久人婷婷精品综合| 97精品一区二区| 欧美大黑bbbbbbbbb在线| 在线综合欧美| 日韩午夜视频在线| 麻豆中文一区二区| 视频二区不卡| 中文字幕日本一区二区| 国产精品草草| 99精品视频在线| 在线亚洲欧美| 91国内精品| 婷婷激情一区| 亚洲+小说+欧美+激情+另类| 免费一级欧美在线观看视频| 久久亚洲成人| 日本不卡一二三区黄网| 亚洲黄色免费av| 免费人成精品欧美精品| 精品三级在线| 久久国产精品久久w女人spa| 欧美黑人巨大videos精品| 桃色一区二区| 日本免费新一区视频| 日韩国产激情| 亚洲精品九九| 亚洲不卡系列| 国产日韩中文在线中文字幕| 91精品一区国产高清在线gif | 伊人久久国产| 亚洲精品少妇| 欧美片第1页| 日本电影久久久| 色婷婷久久久| 国产亚洲一区| 在线国产一区| 麻豆免费精品视频| 欧美1区免费| 国产精品对白久久久久粗| 蜜桃国内精品久久久久软件9| 欧美日韩网址| 国产精品试看| 亚洲美女久久精品| 91精品国产自产精品男人的天堂| 久久精品国产www456c0m| 国产精品成人国产| 亚洲综合国产| 日韩国产一区二区三区| 日韩欧乱色一区二区三区在线| 日韩精品麻豆| 国产欧美日韩| 在线一区二区三区视频| а√天堂8资源中文在线| 日本亚洲欧美天堂免费| 婷婷激情久久| 精品一区二区三区亚洲| 亚洲男人在线| 欧美jjzz| 中文在线а√在线8| 69堂精品视频在线播放| 亚洲少妇自拍| 日本精品不卡| 欧美激情福利| 97久久精品| 在线午夜精品| 国产麻豆久久| 精品一区二区三区中文字幕| 日韩中文字幕1| 欧美日韩国产探花| 在线观看精品| 麻豆视频在线看| 久久99免费视频| 国产一区 二区| 亚洲专区视频| 日韩精品一二区| 国产精品日韩久久久| 久久国产电影| 日韩欧美不卡| 国产 日韩 欧美 综合 一区| 国产精品亚洲欧美一级在线| 日本91福利区| 日本亚洲视频在线| 免费精品视频| 亚洲欧美久久久| 在线 亚洲欧美在线综合一区| 久久男女视频| 婷婷国产精品| 波多野结衣一区| 久久高清免费| 亚洲a一区二区三区| 国产中文在线播放| 亚洲伊人av| bbw在线视频| 亚洲伦乱视频| 成人羞羞在线观看网站| 美女网站视频一区| 精品亚洲美女网站| 热三久草你在线| 欧美久久天堂| 欧美13videosex性极品| 日韩精品欧美| 国产在线不卡| 国产精品婷婷| 亚洲精品乱码| 久久国产日韩欧美精品| 欧美日本一区| 久久精品国产精品亚洲毛片| 成人在线免费观看91| 国产激情在线播放| 色在线视频观看| 神马午夜久久| 99国产精品| 免播放器亚洲一区| 日韩精品免费视频一区二区三区| 国产探花一区在线观看| 美女尤物国产一区| 久久电影tv| 狠狠久久婷婷| 天堂久久一区| 老司机免费视频一区二区| 91欧美日韩| 亚洲午夜久久久久久尤物| 国产一区导航| 日本国产亚洲| 精品国产亚洲一区二区在线观看| yellow在线观看网址| 欧美日韩色图| 免费久久99精品国产自在现线| 亚洲一区av| 国产欧美综合一区二区三区| 精品久久久网| 亚洲福利免费| 色综合视频一区二区三区日韩 | 国产日韩在线观看视频| 麻豆国产精品777777在线| 国产网站在线| 亚洲一区二区三区免费在线观看| 日韩精品午夜视频| 国内精品伊人| 国产亚洲毛片| 国产精品久久久久久久久久妞妞 | 亚洲综合不卡| 国产精品免费99久久久| 日本在线精品| 亚洲精品激情| 成人一二三区| 久久最新视频| 国产一区二区三区亚洲综合| 尹人成人综合网| 国产精品任我爽爆在线播放| 久久伦理在线| 国产美女久久| 欧美在线亚洲| 久久久久黄色| 国产精品毛片在线| 精品一区二区三区免费看| 欧美特黄一区| 免费亚洲一区| 美日韩精品视频| 加勒比视频一区| 亚洲天堂av资源在线观看| 97精品一区二区| 日韩精品欧美精品| 久久精品中文| 国产欧美91| 好看的av在线不卡观看| 麻豆视频久久| 中文字幕日本一区二区| 国产在线|日韩| 国产精品流白浆在线观看| 亚洲一区二区三区免费在线观看 | 国产婷婷精品| 国产成人精品免费视|