關(guān)于web項(xiàng)目讀取classpath下面文件的心得分享
web項(xiàng)目讀取classpath下面文件的心得
閱讀之前須知:本文用到spring的工具類和,commons-io工具類
首先分兩大類按web容器分類
一種是普通的web項(xiàng)目,像用Tomcat容器,特點(diǎn)是壓縮包隨著容器的啟動(dòng)會(huì)解壓縮成一個(gè)文件夾,項(xiàng)目訪問的時(shí)候,實(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)是只有一個(gè)jar文件,在容器啟動(dòng)后不會(huì)解壓縮,項(xiàng)目實(shí)際訪問時(shí)jar包或者war包
這種最容易遇坑,最大的坑就是,用第一種方式讀取,在eclipse,本地調(diào)試,完美運(yùn)行,到linux環(huán)境下,就GG,
首先用獲取路徑的方法this.getClass().getResource("/")+fileName,獲取流的方法this.getClass().getResourceAsStream(failName);在本地運(yùn)行時(shí),絕壁能找到,你打印出來路徑,沒錯(cuò),是咱們eclipse的工作目錄,項(xiàng)目目錄,但是在target目錄下。
現(xiàn)在給你分析為什么去到線上,就GG了,很簡(jiǎn)單,線上內(nèi)嵌的工程,我們只會(huì)放一個(gè)jar文件上去,我理解是jar里面的路徑是獲取不到的,jar是封閉性東西吧,不像文件夾,總不能c:/home/xx.jar/file.txt,這種路徑我寫出來你是不是心里激起一點(diǎn)小浪花,別浪,穩(wěn)點(diǎn)。
所以說到這我已經(jīng)吧上帝的真理告訴你了,不要告訴別人哦,這是個(gè)秘密,好,大哥我總結(jié)一點(diǎn),讀取jar里面的文件,我們只能用流去讀取,不能用file,文件肯定要牽扯路徑,jar那個(gè)路徑剛剛我已經(jīng)拼出來了
jar里面文件讀取方式:
ClassPathResource classPathResource = new ClassPathResource("test.txt");- 獲取文件流:classPathResource .getInputStream();
web項(xiàng)目下讀取classpath下文件--使用springboot遇到的大坑
在讀取springBoot+gradle構(gòu)建的項(xiàng)目時(shí),如果使用傳統(tǒng)的FileInputStream讀取文件流或者ResourceUtils工具類的方式,都會(huì)失敗,下面解釋原因:
讀取文件的三種方式
1. ResourceUtils工具類
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ū)別
有兩種常見的web容器:
1. 第一種是普通的web項(xiàng)目,特點(diǎn)是jar/war壓縮包會(huì)隨著容器的啟動(dòng)解壓縮成一個(gè)文件夾,當(dāng)項(xiàng)目訪問的時(shí)候,實(shí)際是訪問文件夾,而非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í)際訪問的就是jar/war包
該種方式最容易遇坑!!最大的坑就是,this.getClass().getResource("/")+fileName在本地windows下能完美找到路徑,可是在linux測(cè)試服務(wù)器下就失敗,所以讀取jar中的文件只能用流讀取,不能用file,即只能用方式三讀取。
所以,用spring boot搭建的工程,只能用
classPathResource .getInputStream();獲取文件流。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Boot集成Swagger接口分類與各元素排序問題
這篇文章主要介紹了Spring Boot集成Swagger接口分類與各元素排序問題,首先我們需要對(duì)Swagger中的接口也就是以Controller 層作為第一級(jí)梯度進(jìn)行組織的,Controller在我們實(shí)際開發(fā)中,與其他具體接口之間是存在一對(duì)多的關(guān)系,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-10-10
java中你的項(xiàng)目應(yīng)該如何正確分層
這篇文章主要介紹了java中你的項(xiàng)目應(yīng)該如何正確分層,業(yè)務(wù)分層對(duì)于代碼規(guī)范是比較重要,決定著以后的代碼是否可復(fù)用,感興趣的可以了解一下2021-04-04
servlet之session簡(jiǎn)介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了servlet之session簡(jiǎn)介,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07
詳解Java在redis中進(jìn)行對(duì)象的緩存
這篇文章主要介紹了Java在redis中進(jìn)行對(duì)象的緩存,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
Spring Boot與MyBatis配置與操作實(shí)戰(zhàn)指南
本文介紹了如何在SpringBoot項(xiàng)目中配置和使用MyBatis,包括環(huán)境準(zhǔn)備、數(shù)據(jù)源配置、MyBatis配置、數(shù)據(jù)操作、事務(wù)管理以及高級(jí)配置如緩存和插件的使用,通過這些步驟,可以實(shí)現(xiàn)高效的數(shù)據(jù)驅(qū)動(dòng)應(yīng)用程序開發(fā),感興趣的朋友跟隨小編一起看看吧2026-01-01

