解決SpringBoot ClassPathResource的大坑(FileNotFoundException)
FileNotFoundException
SpringBoot 項目將項目打包成jar包,使用ClassPathResource時使用的是絕對路徑,直接調用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構建的項目時,如果使用傳統的FileInputStream讀取文件流或者ResourceUtils工具類的方式,都會失敗,下面解釋原因:
一、讀取文件的三種方式:
1. ResourceUtils工具類
import org.springframework.util.ResourceUtils; //使用: File file= ResourceUtils.getFile("classpath:test.txt");
2. FileInputStream文件流的方式讀取
(該方式為按行讀取,若不是按行處理,需要像圖中將每行數據存在一個buffer中,然後轉成String處理)
3. ClassPathResource獲取文件流的方式
ClassPathResource classPathResource = new ClassPathResource("test.txt");
獲取文件:classPathResource .getFile();
獲取文件流:classPathResource .getInputStream();
二、不同web容器讀取文件的區別
有兩種常見的web容器:
1. 第一種是普通的web項目,特點是jar/war壓縮包會隨著容器的啟動解壓縮成一個文件夾,當項目訪問的時候,實際是訪問文件夾,而非jar或者war包。
該種方式下,用獲取路徑的方法:
this.getClass().getResource("/")+fileName
或者獲取流的方法:
this.getClass().getResourceAsStream(failName);
都可以成功。
2. 第二種是內嵌web容器,Spring boot就是內嵌web容器,其特點是隻有一個jar文件,在容器啟動後不會解壓縮,項目實際訪問的就是jar/war包
該種方式最容易遇坑!!最大的坑就是,
this.getClass().getResource("/")+fileName
在本地windows下能完美找到路徑,可是在linux測試服務器下就失敗,所以讀取jar中的文件隻能用流讀取,不能用file,即隻能用方式三讀取。
所以,用spring boot搭建的工程,隻能用
classPathResource .getInputStream();
獲取文件流
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- SpringBoot如何獲取src/main/resource路徑下的文件
- SpringBoot 如何讀取classpath下的文件
- SpringBoot讀取Resource下文件的4種方法
- springboot讀取文件,打成jar包後訪問不到的解決
- springboot讀取resources下文件的方式詳解