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有的话就不用再次引入了

posted @ 2021-10-12 09:34  一心二念  阅读(4473)  评论(0编辑  收藏  举报