Spring少量封装了JDK的资源访问API使其更加灵活和方便,开发者不必关心和自己去实现自己的资源访问工具类,而是直接使用。体系结构如下图:
代码:
package chapter2_3;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.InputStreamResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.io.UrlResource;
public class TestResource {
private static final String url = "https://www.baidu.com/img/baidu_jgylogo3.gif";
private static ApplicationContext mContext;
public static void main(String args[]) throws IOException {
// Resource resource = new FileSystemResource(new File("C:\\Users\\John\\eclipse-workspace\\spring\\src\\chapter2_3\\config.xml"));
// org.springframework.beans.factory.BeanFactory factory = new XmlBeanFactory(resource);
// MyContextHolder holder = (MyContextHolder)factory.getBean("myContextHolder");
ApplicationContext context = new FileSystemXmlApplicationContext("C:\\Users\\John\\eclipse-workspace\\spring\\src\\chapter2_3\\config.xml");
mContext = context;
testSource();
testResourceLoader();
testApplicationContext();
}
/**
* Resource接口中的主要方法
* @throws IOException
*/
public static void testSource() throws IOException {
Resource resource = new UrlResource(url);
//判断资源是否存在
System.out.println("资源是否存在:" + resource.exists());
//判断资源是否可读
System.out.println("资源是否可读:" + resource.isReadable());
//判断资源是否已经打开,除了InputStreamSource其它的实现类对象都是返回false
System.out.println("资源的输入流是否已经打开:" + resource.isOpen());
//获取资源的长度,单位为字节
System.out.println("资源的长度:" + resource.contentLength());
//获取资源的额URL,该资源必须要能解析成URL否则将抛出异常ByteArraySource实现类对象不能解析成URL/URI
System.out.println("该资源的URL:" + resource.getURL());
//获取该资源的URI
System.out.println("该资源的URI:" + resource.getURI());
//获取资源的最后修改时间
System.out.println("该资源的最后修改时间:" + resource.lastModified());
//获取资源对应的文件对象,该资源必须存在于本地文件系统中否则将跑出异常
//System.out.println("该资源对应的文件对象:" + resource.getFile());
//获取资源对应的文件名
System.out.println("该资源对应的文件名:" + resource.getFilename());
//获取资源的描述信息,一般返回URI路径
System.out.println("该资源的描述信息:" + resource.getDescription());
//获取资源对应的输入流对象,每次调用都产生一个新的对象,
//InputStreamResource实现类对象只能调用一次该方法,见下图代码
System.out.println("获取资源对应的输入流对象:" + resource.getInputStream());
}
/**使用InputStreamResource获取输入流封装的资源。针对于输入流的Resource,
* 其getInputStream()方法只能被调用一次。**/
public void testInputStream() throws Exception {
InputStream is = new FileInputStream("D\\test.txt");
InputStreamResource resource = new InputStreamResource(is);
//对于InputStreamResource而言,其getInputStream()方法只能调用一次,继续调用将抛出异常。
InputStream is2 = resource.getInputStream(); //返回的就是构件时的那个InputStream
System.out.println(is2);
is.close();//必须手动关闭
}
/**
* Spring封装了一个ResourceLoader可以根据给出的路径返回不同的Resource接口实现对象
* 如果你没有可识别的前缀将返回ClassPathResource实现类对象
* DefaultResourceLoader是ResourceLoader的一个默认实现类
*/
public static void testResourceLoader() {
ResourceLoader sourceLoader = new DefaultResourceLoader();
Resource resource = sourceLoader.getResource(url);
System.out.println("该资源是UrlResource的一个对象:" + (resource instanceof UrlResource));
}
/**
* ApplicationContext类实现了ResourceLoader
* 可以通过调用ApplicationContext对象的getResource(String name)获取对应的Resource对象
*/
public static void testApplicationContext() {
//通过应用的上下文对象获取资源对象
Resource resource = mContext.getResource(url);
System.out.println("资源是否存在:" + resource.exists());
}
}