關(guān)于web項(xiàng)目讀取classpath下面文件的心得分享
web項(xiàng)目讀取classpath下面文件的心得
閱讀之前須知:本文用到spring的工具類和,commons-io工具類
首先分兩大類按web容器分類
一種是普通的web項(xiàng)目,像用Tomcat容器,特點(diǎn)是壓縮包隨著容器的啟動會解壓縮成一個文件夾,項(xiàng)目訪問的時候,實(shí)際是去訪問文件夾,而不是jar或者war包
這種的無論你是用獲取路徑的方法this.getClass().getResource("/")+fileName,獲取流的方法this.getClass().getResourceAsStream(failName);,屢試不爽,都行,這種沒什么可注意的,大多數(shù)項(xiàng)目都是這種
上方便的工具類吧
import org.springframework.util.ResourceUtils; File file= ResourceUtils.getFile("classpath:test.txt");
或者
ClassPathResource classPathResource = new ClassPathResource("test.txt");
- 獲取文件:classPathResource .getFile();
- 獲取文件流:classPathResource .getInputStream();
第二種是內(nèi)嵌web容器,其特點(diǎn)是只有一個jar文件,在容器啟動后不會解壓縮,項(xiàng)目實(shí)際訪問時jar包或者war包
這種最容易遇坑,最大的坑就是,用第一種方式讀取,在eclipse,本地調(diào)試,完美運(yùn)行,到linux環(huán)境下,就GG,
首先用獲取路徑的方法this.getClass().getResource("/")+fileName,獲取流的方法this.getClass().getResourceAsStream(failName);在本地運(yùn)行時,絕壁能找到,你打印出來路徑,沒錯,是咱們eclipse的工作目錄,項(xiàng)目目錄,但是在target目錄下。
現(xiàn)在給你分析為什么去到線上,就GG了,很簡單,線上內(nèi)嵌的工程,我們只會放一個jar文件上去,我理解是jar里面的路徑是獲取不到的,jar是封閉性東西吧,不像文件夾,總不能c:/home/xx.jar/file.txt,這種路徑我寫出來你是不是心里激起一點(diǎn)小浪花,別浪,穩(wěn)點(diǎn)。
所以說到這我已經(jīng)吧上帝的真理告訴你了,不要告訴別人哦,這是個秘密,好,大哥我總結(jié)一點(diǎn),讀取jar里面的文件,我們只能用流去讀取,不能用file,文件肯定要牽扯路徑,jar那個路徑剛剛我已經(jīng)拼出來了
jar里面文件讀取方式:
ClassPathResource classPathResource = new ClassPathResource("test.txt");
- 獲取文件流:classPathResource .getInputStream();
web項(xiàng)目下讀取classpath下文件--使用springboot遇到的大坑
在讀取springBoot+gradle構(gòu)建的項(xiàng)目時,如果使用傳統(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項(xiàng)目,特點(diǎn)是jar/war壓縮包會隨著容器的啟動解壓縮成一個文件夾,當(dāng)項(xiàng)目訪問的時候,實(shí)際是訪問文件夾,而非jar或者war包。
該種方式下,用獲取路徑的方法:this.getClass().getResource("/")+fileName或者獲取流的方法:this.getClass().getResourceAsStream(failName);都可以成功。
2. 第二種是內(nèi)嵌web容器,Spring boot就是內(nèi)嵌web容器,其特點(diǎn)是只有一個jar文件,在容器啟動后不會解壓縮,項(xiàng)目實(shí)際訪問的就是jar/war包
該種方式最容易遇坑?。∽畲蟮目泳褪?,this.getClass().getResource("/")+fileName在本地windows下能完美找到路徑,可是在linux測試服務(wù)器下就失敗,所以讀取jar中的文件只能用流讀取,不能用file,即只能用方式三讀取。
所以,用spring boot搭建的工程,只能用
classPathResource .getInputStream();獲取文件流。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
mybatis的mapper特殊字符轉(zhuǎn)移及動態(tài)SQL條件查詢小結(jié)
mybatis mapper文件中條件查詢符,如>=,<,之類是不能直接寫的會報錯的需要轉(zhuǎn)移一下,本文給大家介紹了常見的條件查詢操作,對mybatis的mapper特殊字符及動態(tài)SQL條件查詢相關(guān)知識感興趣的朋友一起看看吧2021-09-09java使用MulticastSocket實(shí)現(xiàn)組播
這篇文章主要為大家詳細(xì)介紹了java使用MulticastSocket實(shí)現(xiàn)組播,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01@RequestParam 接收參數(shù)的值為null的處理方式
這篇文章主要介紹了@RequestParam 接收參數(shù)的值為null的處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11