SpringBoot項(xiàng)目中讀取resource目錄下的文件六種方法
一、先獲取絕對(duì)路徑再讀取文件(jar包里會(huì)獲取不到)
方法一:類加載器的getResource().getPath()獲取目錄路徑
/** * 方法一:使用類加載器的getResource().getPath()獲取全路徑再拼接文件名,最后根據(jù)文件路徑獲取文件流 * 備注:jar包不可用,因?yàn)閖ar包中沒(méi)有一個(gè)實(shí)際的路徑存放文件 * * @param fileName * @return * @throws FileNotFoundException */ public BufferedReader function1(String fileName) throws FileNotFoundException { // /Users/zunf/code/read-resource/target/classes/ String path = this.getClass().getClassLoader().getResource("").getPath(); // /Users/zunf/code/read-resource/target/classes/測(cè)試.txt String filePath = path + fileName; return new BufferedReader(new FileReader(filePath)); }
方法二:類加載器的getResource().getPath()獲取文件路徑
/** * 方法二:使用類加載器的getResource().getPath(),傳參直接獲取文件路徑,再根據(jù)文件路徑獲取文件流 * 備注:jar包不可用,因?yàn)閖ar包中沒(méi)有一個(gè)實(shí)際的路徑存放文件 * * @param fileName * @return * @throws IOException */ public BufferedReader function2(String fileName) throws IOException { // /Users/zunf/code/read-resource/target/classes/%e6%b5%8b%e8%af%95.txt String filePath = this.getClass().getClassLoader().getResource(fileName).getPath(); //可以看到上面讀取到路徑的中文被URLEncoder編碼了,所以需要先用URLDecoder解碼一下,恢復(fù)中文 filePath = URLDecoder.decode(filePath, "UTF-8"); return new BufferedReader(new FileReader(filePath)); }
二、直接獲取文件流(jar包可用)
方法三:ClassLoader對(duì)象的getResourceAsStream()
/** * 方法三:使用類加載器的getResourceAsStream(),直接獲取文件流 * 備注:jar包可用 * * @param fileName * @return * @throws IOException */ public BufferedReader function3(String fileName) throws IOException { //getResourceAsStream(fileName) 等價(jià)于getResource(fileName).openStream() InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(fileName); if (inputStream == null) { throw new FileNotFoundException(fileName); } return new BufferedReader(new InputStreamReader(inputStream)); }
方法四:Class對(duì)象的getResourceAsStream()
- ClassLoader 的getResource()是從類路徑的根路徑查找的,所以不加“/”也可以
- Class 的getResource()是從當(dāng)前類所在的包路徑查找資源,所以如果不加“/”表示去根路徑查找的話,是找不到的
/** * 方法四:使用Class對(duì)象的getResourceAsStream()獲取文件流 * 備注:jar包可用 * * @param fileName * @return * @throws IOException */ public BufferedReader function4(String fileName) throws IOException { //getResourceAsStream(fileName) 等價(jià)于getResource(fileName).openStream() InputStream inputStream = this.getClass().getResourceAsStream("/" + fileName); if (inputStream == null) { throw new FileNotFoundException(fileName); } return new BufferedReader(new InputStreamReader(inputStream)); }
三、使用封裝好的類(jar包可用)
源碼里還是方法三、方法四,只不過(guò)做了一些封裝,更方便開(kāi)發(fā)
方法五:Spring提供的ClassPathResource
/** * 方法五:使用Spring提供的ClassPathResource獲取 * 備注:jar包可用 * * @param fileName * @return * @throws IOException */ public BufferedReader function5(String fileName) throws IOException { ClassPathResource classPathResource = new ClassPathResource(fileName); InputStream inputStream = classPathResource.getInputStream(); return new BufferedReader(new InputStreamReader(inputStream)); }
方法六:Hutool提供的ResourceUtil
/** * 方法六:使用Hutool的ResourceUtil * 備注:jar包可用 * * @param fileName * @return * @throws IOException */ public BufferedReader function6(String fileName) throws IOException { List<URL> resources = ResourceUtil.getResources(fileName); URL resource = resources.get(0); return new BufferedReader(new InputStreamReader(resource.openStream())); }
四、測(cè)試jar包中是否可用的代碼
1)編寫接口
//Jar包啟動(dòng)時(shí)根據(jù)傳入的不同funcation值來(lái)選擇調(diào)用哪個(gè)方法測(cè)試 @Value("${function}") private int function; @GetMapping("/test") public String test() throws IOException { //需要在resource里讀取的文件 String fileName = "測(cè)試.txt"; //調(diào)用方法 System.out.println("調(diào)用function" + function); BufferedReader bufferedReader = null; switch (function) { case 1: bufferedReader = function1(fileName); break; case 2: bufferedReader = function2(fileName); break; case 3: bufferedReader = function3(fileName); break; case 4: bufferedReader = function4(fileName); break; case 5: bufferedReader = function5(fileName); break; case 6: bufferedReader = function6(fileName); break; default: } //讀取并輸出 StringBuilder sb = new StringBuilder(); String line = null; while ((line = bufferedReader.readLine()) != null) { sb.append(line).append("\n"); } System.out.println(sb); return sb.toString(); }
2)啟動(dòng)jar包指令
java -jar -Dfunction=6 read-resource-1.0-SNAPSHOT.jar
- 更改
-Dfunction=6
的值就能動(dòng)態(tài)切換方法了。
到此這篇關(guān)于SpringBoot項(xiàng)目中讀取resource目錄下的文件六種方法的文章就介紹到這了,更多相關(guān)SpringBoot讀取resource文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java轉(zhuǎn)樹(shù)形結(jié)構(gòu)工具類詳解
這篇文章主要為大家詳細(xì)介紹了java轉(zhuǎn)樹(shù)形結(jié)構(gòu)工具類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08深入學(xué)習(xí)java位運(yùn)算的基礎(chǔ)知識(shí)
位運(yùn)算是直接對(duì)整數(shù)在內(nèi)存中的二進(jìn)制位進(jìn)行操作嗎,位運(yùn)算即可以節(jié)約內(nèi)存,同時(shí)使程序速度更快效率更高。文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面我們來(lái)一起學(xué)習(xí)下吧2019-06-06java應(yīng)用開(kāi)發(fā)之JVM運(yùn)行時(shí)內(nèi)存分析
這篇文章主要介紹了java應(yīng)用開(kāi)發(fā)之JVM運(yùn)行時(shí)內(nèi)存,文中附含圖文示例內(nèi)容分析非常簡(jiǎn)要,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09ShardingSphere結(jié)合MySQL實(shí)現(xiàn)分庫(kù)分表的項(xiàng)目實(shí)踐
在實(shí)際開(kāi)發(fā)中,如果表的數(shù)據(jù)過(guò)大我們需要把一張表拆分成多張表,本文主要介紹了使用ShardingSphere實(shí)現(xiàn)MySQL分庫(kù)分表,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03Java實(shí)現(xiàn)特定范圍的完數(shù)輸出算法示例
這篇文章主要介紹了Java實(shí)現(xiàn)特定范圍的完數(shù)輸出算法,簡(jiǎn)單說(shuō)明了完數(shù)的概念、計(jì)算原理并結(jié)合實(shí)例形式分析了java針對(duì)給定范圍內(nèi)的完數(shù)輸出操作實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-12-12解決Java中socket使用getInputStream()阻塞問(wèn)題
這篇文章主要介紹了解決Java中socket使用getInputStream()阻塞問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12jackson 實(shí)現(xiàn)null轉(zhuǎn)0 以及0轉(zhuǎn)null的示例代碼
這篇文章主要介紹了jackson 實(shí)現(xiàn)null轉(zhuǎn)0 以及0轉(zhuǎn)null的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09構(gòu)建多模塊的Spring Boot項(xiàng)目步驟全紀(jì)錄
這篇文章主要給大家介紹了關(guān)于如何構(gòu)建多模塊的Spring Boot項(xiàng)目的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用SpringBoot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05