解決SpringBoot ClassPathResource的大坑(FileNotFoundException)
FileNotFoundException
SpringBoot 項(xiàng)目將項(xiàng)目打包成jar包,使用ClassPathResource時(shí)使用的是絕對(duì)路徑,直接調(diào)用getFile()方法會(huì)報(bào)
FileNotFoundException
直接上代碼:
通過(guò)賦值文件為臨時(shí)文件的方式解決
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項(xiàng)目下讀取classpath下的文件心得
使用SpringBoot遇到的大坑
在讀取springBoot+gradle構(gòu)建的項(xiàng)目時(shí),如果使用傳統(tǒng)的FileInputStream讀取文件流或者ResourceUtils工具類(lèi)的方式,都會(huì)失敗,下面解釋原因:
一、讀取文件的三種方式:
1. ResourceUtils工具類(lèi)
import org.springframework.util.ResourceUtils;
//使用:
File file= ResourceUtils.getFile("classpath:test.txt");
2. FileInputStream文件流的方式讀取

(該方式為按行讀取,若不是按行處理,需要像圖中將每行數(shù)據(jù)存在一個(gè)buffer中,然后轉(zhuǎn)成String處理)
3. ClassPathResource獲取文件流的方式
ClassPathResource classPathResource = new ClassPathResource("test.txt");
獲取文件:classPathResource .getFile();
獲取文件流:classPathResource .getInputStream();
二、不同web容器讀取文件的區(qū)別
有兩種常見(jiàn)的web容器:
1. 第一種是普通的web項(xiàng)目,特點(diǎn)是jar/war壓縮包會(huì)隨著容器的啟動(dòng)解壓縮成一個(gè)文件夾,當(dāng)項(xiàng)目訪(fǎng)問(wèn)的時(shí)候,實(shí)際是訪(fǎng)問(wèn)文件夾,而非jar或者war包。
該種方式下,用獲取路徑的方法:
this.getClass().getResource("/")+fileName
或者獲取流的方法:
this.getClass().getResourceAsStream(failName);
都可以成功。
2. 第二種是內(nèi)嵌web容器,Spring boot就是內(nèi)嵌web容器,其特點(diǎn)是只有一個(gè)jar文件,在容器啟動(dòng)后不會(huì)解壓縮,項(xiàng)目實(shí)際訪(fǎng)問(wèn)的就是jar/war包
該種方式最容易遇坑!!最大的坑就是,
this.getClass().getResource("/")+fileName
在本地windows下能完美找到路徑,可是在linux測(cè)試服務(wù)器下就失敗,所以讀取jar中的文件只能用流讀取,不能用file,即只能用方式三讀取。
所以,用spring boot搭建的工程,只能用
classPathResource .getInputStream();
獲取文件流
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java使用TCP實(shí)現(xiàn)在線(xiàn)聊天的示例代碼
這篇文章主要介紹了Java使用TCP實(shí)現(xiàn)在線(xiàn)聊天的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
基于JSON和java對(duì)象的互轉(zhuǎn)方法
下面小編就為大家?guī)?lái)一篇基于JSON和java對(duì)象的互轉(zhuǎn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
Spring Data JPA調(diào)用存儲(chǔ)過(guò)程實(shí)例代碼
本篇文章主要介紹了Spring Data JPA調(diào)用存儲(chǔ)過(guò)程實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04
關(guān)于MyBatis Plus中使用or和and問(wèn)題
這篇文章主要介紹了關(guān)于MyBatis Plus中使用or和and問(wèn)題,需要的朋友可以參考下2020-12-12

