JDK提供的访问资源的类(File等)不能很好满足各种某些资源的访问需求。比如缺少从类路径和Web容器的上下文中获取资源的资源操作类。Spring的Resource接口提供了更好用的资源访问能力。Spring使用Resource访问各种资源文件,配置文件资源,国际化属性资源等。
Resource.java
package org.springframework.core.io;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URL;
import org.springframework.core.io.InputStreamSource;
public interface Resource extends InputStreamSource {
boolean exists();//资源是否存在
boolean isReadable();
boolean isOpen();//资源是否打开
URL getURL() throws IOException;//如果底层资源可以表示成URL,则返回对应的URL对象
URI getURI() throws IOException;
File getFile() throws IOException;//如果底层资源是一个文件,则返回对应的File对象
long contentLength() throws IOException;
long lastModified() throws IOException;
Resource createRelative(String var1) throws IOException;
String getFilename();
String getDescription();
}
Resource 继承了 InputStreamSource
InputStreamSource .java
package org.springframework.core.io;
import java.io.IOException;
import java.io.InputStream;
public interface InputStreamSource {
InputStream getInputStream() throws IOException;//返回资源对应的输入流
}
介绍几个最常用的Resource实现类:
- WritableResource:可写资源接口。两个实现类PathResource和FileSystemResource
- ClassPathResource:用于加载类路径下的资源
- FileSystemResource:用于加载文件系统资源,如:D:/conf/test.xml
- UrlResource:访问任何可以通过URL表示的资源,包括文件系统资源、HTTP资源、FTP资源
- PathResource:可以访问任何通过URL、Path、系统文件路径表示的资源
资源访问Demo – FileSourceExample .java
package springResources;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.PathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.WritableResource;
import java.io.*;
/**
* Created by Mistra-WR on 2018/3/18/018.
*/
public class FileSourceExample {
public static void main(String [] args){
try {
String filePath = "D:/Working/Spring/src/main/resources/conf/resourceFileTest.txt";
//使用系统文件路径方式加载文件
WritableResource res1 = new PathResource(filePath);
//使用类路径方式加载文件
Resource res2 = new ClassPathResource("conf/resourceFileTest.txt");
EncodedResource encRes = new EncodedResource(res2,"UTF-8");//可以对资源进行特定编码
File file1 = res1.getFile();//获得File对象
File file2 = encRes.getResource().getFile();//获得File对象
OutputStream stream1 = res1.getOutputStream();//获取文件输出流
stream1.write("我是小王瑞".getBytes());
stream1.close();
//使用Resource接口读资源文件
InputStream ins1 = res1.getInputStream();//获取文件输入流
InputStream ins2 = res2.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int i;
while ((i = ins1.read())!=-1){
baos.write(i);
}
System.out.println(baos.toString());
System.out.println("res1:" + res1.getFilename());//获得文件名
System.out.println("res2:" + res2.getFilename());
}catch (IOException e){
e.printStackTrace();
}
}
}
资源类型的地址前缀:
- classpath:classpath:com/smart/beans.xml 从类路径中加载资源
- file:file:/conf/com/smart/beans.xml UrlResource从文件系统目录中装载资源,可采用绝对或相对路径
- http://:http://www.smart.com/resource/beans.xml UrlResource从Web服务器中装载资源
- ftp://:ftp://www/smartcom/resource/beans.xml UrlResource从FTP服务器中装载资源
- 没有前缀 根据ApplicationContext进行判断采用对应类型的Resource
“classpath:”和”classpath*:”的区别
主要在于多个模块打包的应用时的区别。具体参考:Spring加载resource时classpath*:与classpath:的区别
Ant风格的资源地址匹配符
- ?:匹配文件名中的一个字符
- *:匹配文件名中的任意字符
- ** :匹配多层路径
资源加载Demo – PatternResolverTest .java
package springResources;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.testng.annotations.Test;
/**
* Created by Mistra-WR on 2018/3/20/020.
*/
public class PatternResolverTest {
@Test
public void getResources() throws Throwable{
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource resource[] = resolver.getResources("classpath*:com/smart/**/*.xml");
for (Resource resource1:resource){
System.out.println(resource1.getDescription());
}
}
}
PathMatchingResourcePatternResolver将扫描虽有类路径下及JAR包中对应com.smart类包下的路径,读取所有以.xml为后缀的文件资源。