Springboot项目上线后无法使用File类获取当前文件路径

1.问题描述

在本地开发中使用如下代码来获取所需要的文件全限定名,其中最关键的作用点是使用File类

        String packagePath = packageName.replace(".", "/");   //替换为目录
        URL url = ClassLoader.getSystemResource("");
        File[] files = new File(url.getPath() + packagePath)    
                .listFiles(file -> file.getName().endsWith(".class"));
        List<String> result = new ArrayList<>();
        for(File file : files){
            // 输出类名称
            String fileName = file.getName();
            fileName = fileName.substring(0,fileName.lastIndexOf("."));
            //全限定类名
            String allName = packageName+"."+fileName;
            result.add(allName);
        }

但是打成jar包后访问路径格式就会变成jar:file:/xxxxxx这样的类型导致了使用File获取路径资源是为null。

2.问题解决

直接上代码:

        String packagePath = packageName.replace(".", "/");   //替换为目录
        URL url = ClassLoader.getSystemResource("");
        List<String> result = new ArrayList<>();
        try {
            Resource[] resources = new PathMatchingResourcePatternResolver().
                    getResources(ResourceUtils.CLASSPATH_URL_PREFIX + packagePath+"/*.*");
            // 循环images文件夹下的所有文件
            for(Resource fileResource : resources) {
                //输出文件名称
                String fileName = fileResource.getFilename();
                fileName = fileName.substring(0,fileName.lastIndexOf("."));
                String allName = packageName+"."+fileName;
                System.out.println(allName);
                result.add(allName);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

3.解决详述

主要使用PathMatchingResourcePatternResolver类来获取资源通过追溯源码可以看到底层是使用的这三种方式对单一类加载进行重写,最后使用ResourceUtils工具类将文件路径类型换成classpath:就可以实现对指定目录文件名遍历,上线后就避免了jar路径获取问题

cl = Thread.currentThread().getContextClassLoader();
cl = ClassUtils.class.getClassLoader();
cl = ClassLoader.getSystemClassLoader();
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值