文章内容来自本人学习《精通Spring 4.x 企业应用开发实战》一书的笔记整理,部分内容摘抄原文。
1、资源抽象接口
JDK所提供的访问资源的类(如 java.net.URL、File等)并不能很好地满足各种底层资源的访问需求,比如缺少从类路径或Web容器的上下文中获取资源的操作类。因此,Spring设计了一个Resource接口,它为应用提供了更强大的底层资源访问能力。
Resource接口主要方法
boolean exist():资源是否存在。
boolean isOpen():资源是否打开。
URL getURL():如果底层资源可以表示成URL,则返回对应的URL对象。
File getFile():如果底层资源对应一个文件,则返回对应的File对象。
InputStream getInputStream():返回资源对应的输入流。
Resource接口及实现类关系
WritableResource:可写资源接口,有三个实现类:FileSystemResource、PathResource、FileUrlResouce。
ByteArrayResouce:二进制数组表示的资源,可在内存中通过程序构造。
ClassPathResource:类路径下的资源。
FileSystemResouce:文件系统资源,如 D:/conf/bean.xml。
InputStreamResource:以输入流返回表示的资源。
ServletContextResource:为访问Web容器上下文中的资源而设计的类,负责以相对于Web应用根目录的路径加载资源。支持以流和URL的方式访问,在WAR解包情况下,也可以通过File方式访问,还可以直接从JAR包中访问资源。
UrlResource:URL封闭了java.net.URL,它使用户能够访问任何可以通过URL表示的资源,如文件系统的资源、HTTP资源、FTP资源等。
PathResource:4.0提供的新类,封装java.net.URL、java.nio.file.Path、文件系统资源,能够访问任何可以通过URL、Path、系统文件路径表示的资源。如文件系统资源、HTTP资源、FTP资源等。
测试DEMO
package com.hqq.spring.resource;
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.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* Spring资源访问测试DEMO
* Created by HUANGQIQIN on 2018/9/12.
*/
public class TestSpringResource {
public static void main(String[] args) throws IOException {
String filePath = "F:/ideawork/hqqstudy/springstudy/src/main/resources/text.txt";
// 使用系统文件路径方式加载文件
WritableResource writableResource = new PathResource(filePath);
//使用WritableResource接口写资源
OutputStream outputStream = writableResource.getOutputStream();
outputStream.write("Hello World".getBytes("UTF-8"));
outputStream.close();
//使用类路径方式加载文件
Resource classPathResource = new ClassPathResource("text.txt");
// 如果资源文件采用特殊编码,可以使用以下方式设置编码格式
// EncodedResource encodedResource = new EncodedResource(classPathResource, "UTF-8");
// InputStream inputStream = encodedResource.getInputStream();
InputStream inputStream = classPathResource.getInputStream();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
int len = -1;
while ((len = inputStream.read()) != -1){
byteArrayOutputStream.write(len);
}
System.out.println(byteArrayOutputStream.toString());
}
}