java讀取當前路徑下的文件,springboot讀取linux文件_SpringBoot 讀取文件代碼模版

 2023-12-06 阅读 29 评论 0

摘要:引言Alice上線后,學生導入模版文件下載失敗。未打包是沒問題的,打完包后就發生了錯誤。開始逐步定位問題。原方法java讀取當前路徑下的文件。File file = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX + "static/導入學生模板.xlsx&#

引言

Alice上線后,學生導入模版文件下載失敗。

未打包是沒問題的,打完包后就發生了錯誤。開始逐步定位問題。

原方法

java讀取當前路徑下的文件。File file = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX + "static/導入學生模板.xlsx");

InputStream inputStream = new FileInputStream(file);

Workbook workbook = new XSSFWorkbook(inputStream);

經測試,問題出在ResourceUtils.getFile這個方法上。

ResourceUtils.CLASSPATH_URL_PREFIX + "static/導入學生模板.xlsx"

springboot獲得相對路徑,字符串拼接后就是classpath:static/導入學生模板.xlsx,沒打包時,該方法能正常獲取到該Excel文件。

ResourceUtils.getFile是獲取磁盤上的文件,而打完包之后,resources目錄了下的所有資源都被打進了jar包,所以不存在相應的Excel文件,獲取的時候就報錯了。找不到文件。

測試

將打好的jar包解壓,主要的東西都在BOOT-INF里。META-INF里面有pom.xml,應該是存儲項目信息的。org目錄內是springframework的一些class字節碼。

BOOT-INF內就是本項目的核心代碼與第三方庫。

dockerfile詳解、classes目錄下就是本項目的核心代碼,我們的Excel就在這里面。

lib目錄下是項目中引用的第三方jar包,里面有我們常用的slf4j,spring-boot等jar包。

所以,Spring Boot的項目一般都較大,有一部分原因是把許多第三方包都打包進去了。

解決方案

@Autowired一個ResourceLoader,然后調用getResource方法,加載資源。

docker執行容器內的shell、想想也不難理解,SpringBoot啟動時讀取application.yml配置,Spring的源碼中就是使用ResourceLoader實現的。

只不過源碼中直接用的上下文對象,一個上下文對象不只是一個IOC容器,還是一個資源加載器。(上下文其實有很多的功能,可以點開Spring源碼看一看,很有意思。)

ResourcePatternResolver派生自ResourceLoader接口。

代碼模版,以后讀取文件就這樣寫,啥毛病沒有:

Resource resource = this.resourceLoader.getResource(ResourceUtils.CLASSPATH_URL_PREFIX + "static/導入學生模板.xlsx");

docker讀取外部文件,總結

千淘萬漉雖辛苦,吹盡狂沙始到金。

——劉禹錫《浪淘沙詞九首·其九》

一路走來,一路總結。最后留下的,是小本本中記錄的代碼模版與最佳實踐。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/188992.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息