springboot读取jar中resource下的文件
一、一般的读取resource下的static中的图片方法
方法一:读取非jar中文件
String resourcePath1 = "/item/img/"; try { ClassPathResource resource = new ClassPathResource("static" + resourcePath); File file = resource.getFile(); logger.info(file.toString()); if(file != null && file.isDirectory()){ File[] files = file.listFiles(); if(files != null && files.length >0){ for (File f:files) { logger.info(f.getName()); } } } } catch (Exception e) { e.printStackTrace(); logger.error("读取异常",e.getStackTrace()); }
方法二、读取非jar中文件,或者jar中指定文件名路径的文件 比如 resourcePath= /item/img/aaa.txt,这种以流的方式读取具体文件可以,但是读取目录不行
String resourcePath = "/item/img/"; try { ClassPathResource resource = new ClassPathResource("static" + resourcePath); InputStream inputStream = resource.getInputStream(); logger.info("=====================开始========================"); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line; while((line = bufferedReader.readLine()) != null){ logger.info(line); } logger.info("=======================结束======================"); } catch (Exception e) { e.printStackTrace(); logger.error("读取异常",e.getStackTrace()); }
首先,这俩种方法在idea中运行时没有问题,可以读取到文件;而且第二种方法在jar中也可以读取指定的文件,地址必须是具体到文件名,读取目录还是不行
但是在jar中读取一个目录然后去遍历目录中的文件就不可以,war中好像可以,本人没有测,然后找到下面这个方法
二、读取jar中的static中某个目录下的图片
try { Resource[] resources = new PathMatchingResourcePatternResolver().getResources(ResourceUtils.CLASSPATH_URL_PREFIX + "static"+resourcePath+"*.png"); // 遍历文件内容 logger.info("=====================开始========================"); for(Resource resource : resources) { String filename = resource.getFilename(); logger.info("================"+filename+"================"); } logger.info("=======================结束======================"); } catch (IOException e) { e.printStackTrace(); logger.error("读取异常",e.getStackTrace()); }
这个方法完美读取到了jar中文件,以下是参考的内容
public static void main(String[] args) throws IOException { // TODO 加载当前项目classpath下META-INF/folder及其子文件夹中的所有文件 Resource[] resources = new PathMatchingResourcePatternResolver().getResources(ResourceUtils.CLASSPATH_URL_PREFIX + "META-INF/folder/**/*.txt"); // TODO 加载当前项目classpath下META-INF/folder及其子文件夹中的所有以.txt结尾的文件 Resource[] resources2 = new PathMatchingResourcePatternResolver().getResources(ResourceUtils.CLASSPATH_URL_PREFIX + "META-INF/folder/**/*.txt"); // TODO 加载当前项目及所有jar中classpath下的所有META-INF/spring.factories文件(springboot自动装配的主要功能) Resource[] resources3 = new PathMatchingResourcePatternResolver().getResources(ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "META-INF/spring.factories"); // 遍历文件内容 for(Resource resource : resources) { StringBuffer script = new StringBuffer(); try(InputStreamReader isr = new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8); BufferedReader bufferReader = new BufferedReader(isr)) { String tempString; while ((tempString = bufferReader.readLine()) != null) { script.append(tempString).append("\n"); } } catch (IOException e) { e.printStackTrace(); } System.out.println("script:" + script.toString()); } }
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.1.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> <version>2.1.0.RELEASE</version> </dependency>
maven有的话就不用再次引入了