type
status
date
slug
summary
tags
category
icon
password
标签
需求场景
有时候我们需要在项目中使用一些静态资源文件,比如在导出Excel表格数据时需要读取Excel模板,在导出时先读取Excel模板再把内容填充进去。
Excel模板文件
template.xls
放在/src/resources/excel-templat/
目录下。简单普通的方式
使用
Spring
的ResourceUtils
类实现:public static FileInputStream getExcelTemplates() throws FileNotFoundException { return new FileInputStream(ResourceUtils.getFile("classpath:excel-templates/template.xls")); }
此种方式在开发环境直接用
spring-boot:run
方式完美运行。但在打成Jar包以
java -jar
方式或者是War包时运行时会报FileNotFoundException
异常。原因
网上查了发现
ResourceUtils
是以文件目录的形式来获取文件的,但jar包是一个单独的文件而非文件夹,绝对不可能通file:/e:/.../**.jar/excel-template/template.xls
这种形式的文件URL来定位template.xls。所以即使是相对路径,也无法定位到jar文件内的资源文件。解决
对于Jar包的资源文件不能以文件的形式来读取,只能以流的方式读取。
public static InputStream getExcelTemplates() throws IOException { PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver(); Resource[] resources = patternResolver.getResources("excel-template/template.xls"); if (resources != null && resources.length > 0) { return resources[0].getInputStream(); } else { logger.error("file: excel-template/template.xls not found." ); return null; } }