SpringBoot中讀取jar包中的resources目錄下的文件的三種方式
讀取 resources 目錄下的文件路徑時,需要注意一點:在本地開發(fā)時,我們是能夠通過代碼獲取到這個文件的絕對路徑的(如:在 c 盤下或者 d 盤下的);但部署后,項目是通過打成 jar 包運行的,里面的文件是沒有實際路徑的(只有相對于項目名的相對路徑)。
因為最后肯定是打包部署的,所以掌握針對后者的這種方式來讀取文件是很有必要的。
代碼圖如下:

方式一:(重要)
通過 T.class.getClassLoader().getResourceAsStream() 方法。如:我要讀取 config 文件夾下的 test.properties 文件:
這是一個公共方法,用來讀取文件中的內(nèi)容的方法,下面就不再重復(fù)了:
public static void printFileContent(Object obj) throws IOException {
if (null == obj) {
throw new RuntimeException("參數(shù)為空");
}
BufferedReader reader = null;
// 如果是文件路徑
if (obj instanceof String) {
reader = new BufferedReader(new FileReader(new File((String) obj)));
// 如果是文件輸入流
} else if (obj instanceof InputStream) {
reader = new BufferedReader(new InputStreamReader((InputStream) obj));
}
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
}讀取方法:
public class ResourceUtil {
public void getResource(String fileName) throws IOException{
InputStream in = this.getClass().getClassLoader().getResourceAsStream(fileName);
printFileContent(in);
}
public static void main(String[] args) throws IOException {
new ResourceUtil().getResource("config/test.properties");
}
}即使是一個 jar 包,也依舊能讀取到。
此方法默認是從 classpath 路徑(即:src 或 resources 路徑下)下查找文件的,所以,路徑前不需要加 “/”。
方式二:(重要)
通過 T.class..getResourceAsStream() 方法。
public void getResource2(String fileName) throws IOException{
InputStream in = this.getClass().getResourceAsStream("/" + fileName);
printFileContent(in);
}
public static void main(String[] args) throws IOException {
new ResourceUtil().getResource2("config/test.properties");
}方法默認也是從 classpath 路徑(即:src 或 resources 路徑下)下查找文件的,但它的路徑前為什么需要加 “/” 呢?
這個是跟要讀取的文件與當前.class 文件的位置有關(guān)。
看看編譯后的文件路徑:

當前文件 ResourceUtil.class 與要加載的文件 test.properties 的位置如上:
很顯然 test.properties 和 ResourceUtil.class 不在同一個文件夾下。
那讀取的時候是要帶上相對路徑的,那么,這會有兩種情況:
- 相對于當前類 ResourceUtil,路徑前是不需要加 “/”
- 相對于項目名(即:編譯后的 classes 文件夾),路徑前是需要加 “/”
舉例:
- 如果 test.properties 和 ResourceUtil 在同一個文件夾下,那么:this.getClass().getResourceAsStream(“test.properties”)
- 如果 test.properties 和 ResourceUtil 不在同一個文件夾下,那么:this.getClass().getResourceAsStream(“/config/test.properties”)
如果測試,不要在源文件下添加配置文件,因為編譯后,在相應(yīng)的路徑下看不見此配置文件??梢允褂?Test.java 代替。
即使是一個 jar 包,也依舊能讀取到。
方式三:(重要)
通過 ClassPathResource 方法:
public void getResource3(String fileName) throws IOException{
ClassPathResource classPathResource = new ClassPathResource(fileName);
printFileContent(classPathResource.getInputStream());
}
public static void main(String[] args) throws IOException {
new ResourceUtil().getResource3("config/test.properties");
}path 前加不加 “/” 無所謂。
即使是一個 jar 包,也依舊能讀取到。
到此這篇關(guān)于SpringBoot中讀取jar包中的resources目錄下的文件的三種方式的文章就介紹到這了,更多相關(guān)SpringBoot讀取resources文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot把外部依賴包納入Spring容器管理的兩種方式
這篇文章主要給大家介紹了Springboot把外部依賴包納入Spring容器管理的兩種方式,Spring.factories和org.springframework.boot.autoconfigure.AutoConfiguration.imports,有感興趣的小伙伴可以參考閱讀本文2023-07-07
Java語言Consistent Hash算法學(xué)習筆記(代碼示例)
這篇文章主要介紹了Java語言Consistent Hash算法學(xué)習筆記(代碼示例),分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-02-02
Mybatis-Plus使用saveOrUpdate及問題解決方法
本文主要介紹了Mybatis-Plus使用saveOrUpdate及問題解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2023-01-01
springboot集成opencv實現(xiàn)人臉識別功能的詳細步驟
大家都知道OpenCV是一個基于BSD許可(開源)發(fā)行的跨平臺計算機視覺和機器學(xué)習軟件庫,可以運行在Linux、Windows、Android和Mac OS操作系統(tǒng)上今天通過本文給大家分享springboot集成opencv實現(xiàn)人臉識別,感興趣的朋友一起看看吧2021-06-06
Java調(diào)用SQL腳本執(zhí)行常用的方法示例
這篇文章主要給大家介紹了關(guān)于Java調(diào)用SQL腳本執(zhí)行常用的方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧。2018-04-04
MybatisPlus將自定義的sql列表查詢返回改為分頁查詢
本文主要介紹了MybatisPlus將自定義的sql列表查詢返回改為分頁查詢,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2024-04-04

