1. 程式人生 > 實用技巧 >SpringBoot讀取Resource下檔案的幾種方式

SpringBoot讀取Resource下檔案的幾種方式

原文地址: https://www.jianshu.com/p/7d7e5e4e8ae3

最近在專案中涉及到Excle的匯入功能,通常是我們定義完模板供使用者下載,使用者按照模板填寫完後上傳;這裡待下載模板位置為resource/excelTemplate/test.xlsx,嘗試了四種讀取方式,並且測試了四種讀取方式分別的windows開發環境下(IDE中)讀取和生產環境(linux下jar包執行讀取)。

第一種:

ClassPathResource classPathResource = new ClassPathResource("excleTemplate/test.xlsx");
InputStream inputStream =classPathResource.getInputStream();

第二種:

InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("excleTemplate/test.xlsx");

第三種:

InputStream inputStream = this.getClass().getResourceAsStream("/excleTemplate/test.xlsx");

第四種:

File file = ResourceUtils.getFile("classpath:excleTemplate/test.xlsx");
InputStream inputStream = new FileInputStream(file);

經測試:
前三種方法在開發環境(IDE中)和生產環境(linux部署成jar包)都可以讀取到,第四種只有開發環境 時可以讀取到,生產環境讀取失敗。
推測主要原因是springboot內建tomcat,打包後是一個jar包,無法直接讀取jar包中的檔案,讀取只能通過類載入器讀取。
前三種都可以讀取到其實殊途同歸,直接檢視底層程式碼都是通過類載入器讀取檔案流,類載入器可以讀取jar包中的編譯後的class檔案,當然也是可以讀取jar包中的excle模板了。
用解壓軟體開啟jar包檢視結果如下:

其中cst檔案中是編譯後class檔案存放位置,excleTemplate是模板存放位置,類載入器讀取的是cst下class檔案,同樣可以讀取excleTemplate下的模板的檔案流了。
所以總結一下:假如檔案是在jar包中,讀取方式應當使用基於類載入器讀取檔案流的方式,比如前三種方法;使用基於java中File方式的讀取,在jar包情況下是讀取不到的,比方說第四種。

感覺對你有幫助,就點個贊吧……