SpringBoot中讀取jar包中的resources目錄下的文件的三種方式
讀取 resources 目錄下的文件路徑時,需要注意一點:在本地開發(fā)時,我們是能夠通過代碼獲取到這個文件的絕對路徑的(如:在 c 盤下或者 d 盤下的);但部署后,項目是通過打成 jar 包運行的,里面的文件是沒有實際路徑的(只有相對于項目名的相對路徑)。
因為最后肯定是打包部署的,所以掌握針對后者的這種方式來讀取文件是很有必要的。
代碼圖如下:
方式一:(重要)
通過 T.class.getClassLoader().getResourceAsStream()
方法。如:我要讀取 config
文件夾下的 test.properties
文件:
這是一個公共方法,用來讀取文件中的內(nèi)容的方法,下面就不再重復了:
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 文件的位置有關。
看看編譯后的文件路徑:
當前文件 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”)
如果測試,不要在源文件下添加配置文件,因為編譯后,在相應的路徑下看不見此配置文件??梢允褂?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 包,也依舊能讀取到。
到此這篇關于SpringBoot中讀取jar包中的resources目錄下的文件的三種方式的文章就介紹到這了,更多相關SpringBoot讀取resources文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Springboot把外部依賴包納入Spring容器管理的兩種方式
這篇文章主要給大家介紹了Springboot把外部依賴包納入Spring容器管理的兩種方式,Spring.factories和org.springframework.boot.autoconfigure.AutoConfiguration.imports,有感興趣的小伙伴可以參考閱讀本文2023-07-07Java語言Consistent Hash算法學習筆記(代碼示例)
這篇文章主要介紹了Java語言Consistent Hash算法學習筆記(代碼示例),分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-02-02Mybatis-Plus使用saveOrUpdate及問題解決方法
本文主要介紹了Mybatis-Plus使用saveOrUpdate及問題解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-01-01springboot集成opencv實現(xiàn)人臉識別功能的詳細步驟
大家都知道OpenCV是一個基于BSD許可(開源)發(fā)行的跨平臺計算機視覺和機器學習軟件庫,可以運行在Linux、Windows、Android和Mac OS操作系統(tǒng)上今天通過本文給大家分享springboot集成opencv實現(xiàn)人臉識別,感興趣的朋友一起看看吧2021-06-06Java調(diào)用SQL腳本執(zhí)行常用的方法示例
這篇文章主要給大家介紹了關于Java調(diào)用SQL腳本執(zhí)行常用的方法的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-04-04MybatisPlus將自定義的sql列表查詢返回改為分頁查詢
本文主要介紹了MybatisPlus將自定義的sql列表查詢返回改為分頁查詢,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-04-04