SpringBoot中讀取jar包中的resources目錄下的文件的三種方式
讀取 resources 目錄下的文件路徑時(shí),需要注意一點(diǎn):在本地開發(fā)時(shí),我們是能夠通過(guò)代碼獲取到這個(gè)文件的絕對(duì)路徑的(如:在 c 盤下或者 d 盤下的);但部署后,項(xiàng)目是通過(guò)打成 jar 包運(yùn)行的,里面的文件是沒(méi)有實(shí)際路徑的(只有相對(duì)于項(xiàng)目名的相對(duì)路徑)。
因?yàn)樽詈罂隙ㄊ谴虬渴鸬?,所以掌握針?duì)后者的這種方式來(lái)讀取文件是很有必要的。
代碼圖如下:
方式一:(重要)
通過(guò) T.class.getClassLoader().getResourceAsStream()
方法。如:我要讀取 config
文件夾下的 test.properties
文件:
這是一個(gè)公共方法,用來(lái)讀取文件中的內(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"); } }
即使是一個(gè) jar 包,也依舊能讀取到。
此方法默認(rèn)是從 classpath 路徑(即:src 或 resources 路徑下)下查找文件的,所以,路徑前不需要加 “/”。
方式二:(重要)
通過(guò) 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"); }
方法默認(rèn)也是從 classpath 路徑(即:src 或 resources 路徑下)下查找文件的,但它的路徑前為什么需要加 “/” 呢?
這個(gè)是跟要讀取的文件與當(dāng)前.class 文件的位置有關(guān)。
看看編譯后的文件路徑:
當(dāng)前文件 ResourceUtil.class 與要加載的文件 test.properties 的位置如上:
很顯然 test.properties
和 ResourceUtil.class
不在同一個(gè)文件夾下。
那讀取的時(shí)候是要帶上相對(duì)路徑的,那么,這會(huì)有兩種情況:
- 相對(duì)于當(dāng)前類 ResourceUtil,路徑前是不需要加 “/”
- 相對(duì)于項(xiàng)目名(即:編譯后的 classes 文件夾),路徑前是需要加 “/”
舉例:
- 如果 test.properties 和 ResourceUtil 在同一個(gè)文件夾下,那么:this.getClass().getResourceAsStream(“test.properties”)
- 如果 test.properties 和 ResourceUtil 不在同一個(gè)文件夾下,那么:this.getClass().getResourceAsStream(“/config/test.properties”)
如果測(cè)試,不要在源文件下添加配置文件,因?yàn)榫幾g后,在相應(yīng)的路徑下看不見(jiàn)此配置文件??梢允褂?Test.java 代替。
即使是一個(gè) jar 包,也依舊能讀取到。
方式三:(重要)
通過(guò) 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 前加不加 “/” 無(wú)所謂。
即使是一個(gè) jar 包,也依舊能讀取到。
到此這篇關(guān)于SpringBoot中讀取jar包中的resources目錄下的文件的三種方式的文章就介紹到這了,更多相關(guān)SpringBoot讀取resources文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot運(yùn)行jar生成的日志到指定文件進(jìn)行管理方式
- springboot項(xiàng)目(jar包)指定配置文件啟動(dòng)圖文教程
- springboot的jar包如何啟用外部配置文件
- springboot實(shí)現(xiàn)jar運(yùn)行復(fù)制resources文件到指定的目錄(思路詳解)
- springboot項(xiàng)目中引入本地依賴jar包并打包到lib文件夾中
- SpringBoot中jar啟動(dòng)下如何讀取文件路徑
- springboot打成jar后無(wú)法讀取根路徑和文件的解決
- SpringBoot 添加本地 jar 文件的操作步驟
- Spring Boot Jar 文件能直接運(yùn)行的操作方法
相關(guān)文章
Java之BigDecimal實(shí)現(xiàn)詳解
這篇文章主要介紹了Java之BigDecimal實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Springboot把外部依賴包納入Spring容器管理的兩種方式
這篇文章主要給大家介紹了Springboot把外部依賴包納入Spring容器管理的兩種方式,Spring.factories和org.springframework.boot.autoconfigure.AutoConfiguration.imports,有感興趣的小伙伴可以參考閱讀本文2023-07-07Java語(yǔ)言Consistent Hash算法學(xué)習(xí)筆記(代碼示例)
這篇文章主要介紹了Java語(yǔ)言Consistent Hash算法學(xué)習(xí)筆記(代碼示例),分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02Mybatis-Plus使用saveOrUpdate及問(wèn)題解決方法
本文主要介紹了Mybatis-Plus使用saveOrUpdate及問(wèn)題解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01一文詳解Java過(guò)濾器攔截器實(shí)例逐步掌握
這篇文章主要為大家介紹了Java過(guò)濾器攔截器實(shí)例詳解逐步掌握,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04springboot集成opencv實(shí)現(xiàn)人臉識(shí)別功能的詳細(xì)步驟
大家都知道OpenCV是一個(gè)基于BSD許可(開源)發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺(jué)和機(jī)器學(xué)習(xí)軟件庫(kù),可以運(yùn)行在Linux、Windows、Android和Mac OS操作系統(tǒng)上今天通過(guò)本文給大家分享springboot集成opencv實(shí)現(xiàn)人臉識(shí)別,感興趣的朋友一起看看吧2021-06-06Java調(diào)用SQL腳本執(zhí)行常用的方法示例
這篇文章主要給大家介紹了關(guān)于Java調(diào)用SQL腳本執(zhí)行常用的方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04MybatisPlus將自定義的sql列表查詢返回改為分頁(yè)查詢
本文主要介紹了MybatisPlus將自定義的sql列表查詢返回改為分頁(yè)查詢,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-04-04java教程之對(duì)象序列化使用基礎(chǔ)示例詳解
所謂對(duì)象序列化就是將對(duì)象的狀態(tài)轉(zhuǎn)換成字節(jié)流,以后可以通過(guò)這些值再生成相同狀態(tài)的對(duì)象,下面詳細(xì)介紹一下java對(duì)象的序列化使用方法2014-01-01