解決SpringBoot ClassPathResource的大坑(FileNotFoundException)
FileNotFoundException
SpringBoot 項目將項目打包成jar包,使用ClassPathResource時使用的是絕對路徑,直接調(diào)用getFile()方法會報
FileNotFoundException
直接上代碼:
通過賦值文件為臨時文件的方式解決
val resource = ClassPathResource("my.keystore")
val temp = Files.createTempFile("my.keystore", "tmp")
Files.copy(resource.inputStream, temp, StandardCopyOption.REPLACE_EXISTING)
this.getClass().getClassLoader().getResourceAsStream("apiclient_cert.p12");
web項目下讀取classpath下的文件心得
使用SpringBoot遇到的大坑
在讀取springBoot+gradle構(gòu)建的項目時,如果使用傳統(tǒng)的FileInputStream讀取文件流或者ResourceUtils工具類的方式,都會失敗,下面解釋原因:
一、讀取文件的三種方式:
1. ResourceUtils工具類
import org.springframework.util.ResourceUtils;
//使用:
File file= ResourceUtils.getFile("classpath:test.txt");
2. FileInputStream文件流的方式讀取

(該方式為按行讀取,若不是按行處理,需要像圖中將每行數(shù)據(jù)存在一個buffer中,然后轉(zhuǎn)成String處理)
3. ClassPathResource獲取文件流的方式
ClassPathResource classPathResource = new ClassPathResource("test.txt");
獲取文件:classPathResource .getFile();
獲取文件流:classPathResource .getInputStream();
二、不同web容器讀取文件的區(qū)別
有兩種常見的web容器:
1. 第一種是普通的web項目,特點是jar/war壓縮包會隨著容器的啟動解壓縮成一個文件夾,當(dāng)項目訪問的時候,實際是訪問文件夾,而非jar或者war包。
該種方式下,用獲取路徑的方法:
this.getClass().getResource("/")+fileName
或者獲取流的方法:
this.getClass().getResourceAsStream(failName);
都可以成功。
2. 第二種是內(nèi)嵌web容器,Spring boot就是內(nèi)嵌web容器,其特點是只有一個jar文件,在容器啟動后不會解壓縮,項目實際訪問的就是jar/war包
該種方式最容易遇坑?。∽畲蟮目泳褪?,
this.getClass().getResource("/")+fileName
在本地windows下能完美找到路徑,可是在linux測試服務(wù)器下就失敗,所以讀取jar中的文件只能用流讀取,不能用file,即只能用方式三讀取。
所以,用spring boot搭建的工程,只能用
classPathResource .getInputStream();
獲取文件流
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java通過word模板實現(xiàn)創(chuàng)建word文檔報告
這篇文章主要為大家詳細(xì)介紹了Java如何通過word模板實現(xiàn)創(chuàng)建word文檔報告的教程,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下2022-09-09
springboot jdbctemplate如何實現(xiàn)多數(shù)據(jù)源
這篇文章主要介紹了springboot jdbctemplate如何實現(xiàn)多數(shù)據(jù)源問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
SpringMVC集成Web與MVC執(zhí)行流程和數(shù)據(jù)響應(yīng)及交互相關(guān)介紹全面總結(jié)
Spring MVC 是 Spring 提供的一個基于 MVC 設(shè)計模式的輕量級 Web 開發(fā)框架,本質(zhì)上相當(dāng)于 Servlet,Spring MVC 角色劃分清晰,分工明細(xì),這篇文章主要介紹了SpringMVC集成Web與MVC執(zhí)行流程和數(shù)據(jù)響應(yīng)及交互2022-10-10
springboot整合prometheus實現(xiàn)資源監(jiān)控的詳細(xì)步驟
Spring Boot與Prometheus的整合可以實現(xiàn)對Spring Boot應(yīng)用的實時監(jiān)控,有助于更好地維護應(yīng)用的性能,本文給大家介紹springboot整合prometheus實現(xiàn)資源監(jiān)控的詳細(xì)步驟,感興趣的朋友跟隨小編一起看看吧2024-11-11
在java中如何將inputStream對象轉(zhuǎn)換為File對象(不生成本地文件)
這篇文章主要介紹了在java中如何將inputStream對象轉(zhuǎn)換為File對象(不生成本地文件),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03
jdk8使用stream實現(xiàn)兩個list集合合并成一個(對象屬性的合并)
本文主要介紹了jdk8使用stream實現(xiàn)兩個list集合合并成一個(對象屬性的合并),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01
MyBatis傳入集合 list 數(shù)組 map參數(shù)的寫法
這篇文章主要介紹了MyBatis傳入集合 list 數(shù)組 map參數(shù)的寫法的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-06-06
Spring?Boot實現(xiàn)web.xml功能示例詳解
這篇文章主要介紹了Spring?Boot實現(xiàn)web.xml功能,通過本文介紹我們了解到,在Spring Boot應(yīng)用中,我們可以通過注解和編程兩種方式實現(xiàn)web.xml的功能,包括如何創(chuàng)建及注冊Servlet、Filter以及Listener等,需要的朋友可以參考下2023-09-09

