首先分兩大類按web容器分類linux
一種是普通的web項目,像用Tomcat容器,特色是壓縮包隨着容器的啓動會解壓縮成一個文件夾,項目訪問的時候,實際是去訪問文件夾,而不是jar或者war包。web
這種的不管你是用獲取路徑的方法this.getClass().getResource("/")+fileNamespring
獲取流的方法this.getClass().getResourceAsStream(failName);eclipse
import org.springframework.util.ResourceUtils;this
File file= ResourceUtils.getFile("classpath:test.txt");spa
或者.net
ClassPathResource classPathResource = new ClassPathResource("test.txt");調試
獲取文件:classPathResource .getFile();blog
獲取文件流:classPathResource .getInputStream();ip
第二種是內嵌web容器,其特色是隻有一個jar文件,在容器啓動後不會解壓縮,項目實際訪問時jar包或者war包
這種最容易遇坑,最大的坑就是,用第一種方式讀取,在eclipse,本地調試,完美運行,到linux環境下,就不行.
首先用獲取路徑的方法this.getClass().getResource("/")+fileName,獲取流的方法this.getClass().getResourceAsStream(failName);
在本地運行時,絕壁能找到,你打印出來路徑,沒錯,是我們eclipse的工做目錄,項目目錄,可是在target目錄下。
如今給你分析爲何去到線上,就GG了,很簡單,線上內嵌的工程,咱們只會放一個jar文件上去,我理解是jar裏面的路徑是獲取不到的,jar是封閉性東西吧,不像文件夾,總不能c:/home/xx.jar/file.txt
讀取jar裏面的文件,咱們只能用流去讀取,不能用file,文件確定要牽扯路徑,jar那個路徑剛剛我已經拼出來了
jar裏面文件讀取方式:
ClassPathResource classPathResource = new ClassPathResource("test.txt");
獲取文件流:classPathResource .getInputStream();