首先看源码我们知道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)
方法将文件中的所有内容读取到。