Spring中的ResourcePatternResolver使用

首先看源码我们知道ResourcePatternResolver是一个接口!

 该接口用于解析带有*等通配符路径的资源文件,是ResourceLoader接口的拓展接口。

PathMatchingResourcePatternResolver是此接口的独立实现,其常常用于应用上下文之外如ResourceArrayPropertyEditor中
 

与此前的Resource接口不同的是:Resource它不支持通配符方式的文件读取,所以要将读取的配置文件名称全部写出来才可以。

public interface ResourcePatternResolver extends ResourceLoader {

    /**
     * 在所有根目录下搜索文件的伪URL的前缀
     * 与ResourceLoader中classpath不同的地方在于,此前缀会在所有的JAR包的根目录下搜索指定文件。
     */
    String CLASSPATH_ALL_URL_PREFIX = "classpath*:";

    /**
     * 返回指定路径下所有的资源对象。
     * 返回的对象集合应该有Set的语义,也就是说,对于同一个资源,只应该返回一个资源对象
     */
    Resource[] getResources(String locationPattern) throws IOException;

}

=============================分割线======================================= 

需求:需要读取类路径下面某个文件夹中的多个文件,如下图(应该定义为

classpath:sql/crm/*.sql)

public abstract class AbstractJFinalActiveRecordPluginLoader implements JFinalActiveRecordPluginLoader {
    /**
     * 加载SQL模板到ActiveRecordPlugin
     * 
     * @param arp
     */
    protected void getSqlTemplates(ActiveRecordPlugin arp, String sqlTemplatePath) {
        ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
        List<Resource> resources = new ArrayList<>();
        if (sqlTemplatePath != null) {
            try {
                Resource[] sqlTemplates = resourceResolver.getResources(sqlTemplatePath);
                resources.addAll(Arrays.asList(sqlTemplates));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        resources.forEach(resource -> {
            StringBuilder content = null;
            try {
                content = getContentByStream(resource.getInputStream());
                arp.addSqlTemplate(new StringSource(content, true));
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    }

    private StringBuilder getContentByStream(InputStream inputStream) {
        StringBuilder stringBuilder = new StringBuilder();
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
            String line;
            while ((line = br.readLine()) != null) {
                stringBuilder.append(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return stringBuilder;
    }

}

其中的

getSqlTemplates(ActiveRecordPlugin arp, String sqlTemplatePath)

方法sqlTemplatePath参数就是我们上面提到的指定的路径(classpath:sql/crm/*.sql)

 通过下面这行代码

Resource[] sqlTemplates = resourceResolver.getResources(sqlTemplatePath);

就可以将classpath:sql/crm/下的几个文件: ***.sql读取到,再通过

getContentByStream(InputStream inputStream)

方法将文件中的所有内容读取到。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值