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

