web專案讀取classpath下面檔案

人生路莫慌張發表於2017-08-30

注意:本文用到spring的工具類和,commons-io工具類

首先分兩大類按web容器分類

1、

是普通的web專案,像用Tomcat容器,特點是壓縮包隨著容器的啟動會解壓縮成一個資料夾,專案訪問的時候,實際是去訪問資料夾,而不是jar或者war包

這種的無論你是用

獲取路徑的方法this.getClass().getResource("/")+fileName,

獲取流的方法this.getClass().getResourceAsStream(failName);

大多數專案都是這種


然而,有方便的工具類

import org.springframework.util.ResourceUtils;

File file= ResourceUtils.getFile("classpath:test.txt");

或者

ClassPathResource classPathResource = new ClassPathResource("test.txt");

獲取檔案:classPathResource .getFile();

獲取檔案流:classPathResource .getInputStream();


2、

是內嵌web容器,其特點是隻有一個jar檔案,在容器啟動後不會解壓縮,專案實際訪問時jar包或者war包

這種最容易遇坑,最大的坑就是,用第一種方式讀取,在eclipse,本地除錯,完美執行,到Linux環境下,就掛了,你這個大罵靠,什麼玩意,莫慌莫慌,你來到了我的部落格,就會讓你長知識的


首先用獲取路徑的方法this.getClass().getResource("/")+fileName,

獲取流的方法this.getClass().getResourceAsStream(failName);


在本地執行時,絕壁能找到,你列印出來路徑,沒錯,是我們們eclipse的工作目錄,專案目錄,但是在target目錄下。


現在給你分析為什麼去到線上,就掛了,很簡單,線上內嵌的工程,我們只會放一個jar檔案上去,我理解是jar裡面的路徑是獲取不到的,jar是封閉性東西吧,不像資料夾,總不能c:/home/xx.jar/file.txt,這種路徑我寫出來你是不是心裡激起一點小浪花,別浪,穩點。所以說到這我已經吧上帝的真理告訴你了,不要告訴別人,這是個祕密,我總結一點,讀取jar裡面的檔案,我們只能用流去讀取,不能用file,檔案肯定要牽扯路徑,jar那個路徑剛剛我已經拼出來了


jar裡面檔案讀取方式:

ClassPathResource classPathResource = new ClassPathResource("test.txt");

獲取檔案流:classPathResource .getInputStream();



相關文章