一、一般的讀取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有的話就不用再次引入了