JDK提供的访问资源的类不能很好的满足各种底层的资源访问需求,因此Spring 设计了一个Resource 接口,它为应用提供了更强的底层访问能力。
一、Resource 接口的主要方法
① boolean exists(); 用来判断资源是否存在
② boolean isOpen() ; 用来判断资源是否打开
③ URL getURL() ;如果底层资源可以表示成 URL ,那么该方法可以返回一个 URL对象。
④ File getFile() ;如果底层资源对应着一个文件 ,那么该方法可以返回一个 File对象。
⑤ String getFilename(); 返回底层资源对应的文件名。
⑥ InputStream getInputStream() ;返回底层资源对应输入流。
二、 Resource 接口的具体实现类
下图是 Resource 接口的部分实现类 中的继承和实现关系
① WritableResource 可写资源接口,FileSystemResource PathResource 都是它的实现类。
② ByteArrayResource 可以对二进制数组资源进行访问,二进制数组资源可以在内存中通过程序构造。
③ ClassPathResource 类路径下的资源,资源以相对于类路径的方式表示
④ FileSystemResource 文件系统资源,资源以文件系统路径的方式表示。
⑤ InputStreamResource 已输入流返回表示的资源。
⑥ ServletContextResource 为访问Web 容器上下文中的资源而设计的类。负责以相对于Web 应用根目录的路径加载资源,它支持以流和URL的方式访问,在war 包解压的情况下,还可以通过File 方式访问。
⑦ UrlResource 使用户可以访问任何可以通过URL表示的资源,如 file 、http 、ftp
⑧ PathResource spring 4.0 提供的读取资源文件的新类。
String filePath = "D:/Program/CodesTest/spring_study/springIoC/src/main/resources/conf/file1.txt";
// 使用系统文件路径来加载文件
WritableResource res1 = new PathResource(filePath);
// 使用类路径来加载文件
Resource res2 = new ClassPathResource("conf/file1.txt");
// 使用 WritableResource 接口来写入资源文件
OutputStream stream1 = res1.getOutputStream();
stream1.write("你好欢迎".getBytes());
stream1.write("沙扬娜拉\n哈哈哈".getBytes());
// 使用resource 接口来读取资源
InputStream stream2 = res1.getInputStream();
InputStream stream3 = res2.getInputStream();
// 获取文件名
System.out.println("res1:"+res1.getFilename());
三、 Spring 支持的资源类型地址前缀
① classpath: 从类路径加载资源,classpath: 和 classpath:/ 是等价的,都是相对于类的根路径,资源文件可以在 标准文件系统 中,亦可以在 jar 或者 Zip 的类包中。
② file : 使用URLResource 从系统目录中加载字眼,可以是绝对路径也可是相对路径。
③ http:// : 使用URLResource 从Web 服务器中装载资源
④ ftp:// 使用URLResource 从Ftp 服务器中装载资源
⑤ 没有前缀 根据application 的具体情况来加载。
⑥classpath* : 如果多个jar包存在相同的报名,classpath 只会在第一个加载包中查找,其余的不查找,而 classpath* : 则会找全部的包。
四、Spring 支持的几种Ant 风格的通配符
① ? 匹配路径中一个字符
② * 匹配路径中任意字符
③ ** 匹配多层路径
五、资源加载器
资源加载接口及其实现类
ResourceLoader 接口仅有一个 getResource方法。可以根据一个资源地址加载文件资源。不过资源地址仅支持带
资源类型前缀的表达式,不支持ant风格的资源路径表达式。ResourcePatternResolver 扩展了 ResourceLoader 接口,定义了一个新的接口方法, getResources ,该方法支持带资源类型前缀的表达式及支持ant风格的资源路径表达式,PathMatchingResourcePatternResolver 是spring 提供的标准实现类。
@Test
public void getResources() throws IOException {
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resolver.getResources("classpath*:com/spring/**");
for (Resource resource : resources) {
System.out.println(resource.getDescription());
}
}