1. 程式人生 > 其它 >淺談web專案讀取classpath路徑下面的檔案

淺談web專案讀取classpath路徑下面的檔案

本文主要研究的是web專案下讀取classpath路徑下的檔案的問題,具體如下:
首先分兩大類,按web容器分類:
第一種是普通的web專案,像用Tomcat容器,特點是壓縮包隨著容器的啟動會解壓縮成一個資料夾,專案訪問的時候,實際是去訪問資料夾,而不是jar或者war包,這種的無論你是使用

//獲取路徑
this.getClass().getResource("/") + fileName
//Spring ResourceUtils
import org.springframework.util.ResourceUtils;
File file= ResourceUtils.getFile("classpath:resource/test.txt");

或者

Resource res = new ClassPathResource("template/test.txt");
//獲取檔案:
classPathResource.getFile();
//獲取檔案流:
classPathResource.getInputStream();

第二種是內嵌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("template/test.txt") //獲取檔案流 classPathResource.getInputStream();

實際讀取路徑如下

sun.net.www.protocol.jar.JarURLConnection:jar:file:/opt/temp/subsystem/test-app/test.jar!/template/test.txt

總結
以上就是本文關於淺談web專案讀取classpath路徑下面的檔案的全部內容。