Spring --Resource接口详解

1.概述


       在日常程序开发中,处理外部资源是很繁琐的事情,我们可能需要处理URL资源、File资源资源、ClassPath相关资源、服务器相关资源(JBoss AS 5.x上的VFS资源)等等很多资源。因此处理这些资源需要使用不同的接口,这就增加了我们系统的复杂性;而且处理这些资源步骤都是类似的(打开资源、读取资源、关闭资源),因此如果能抽象出一个统一的接口来对这些底层资源进行统一访问,是不是很方便,而且使我们系统更加简洁,都是对不同的底层资源使用同一个接口进行访问。

       Spring 提供一个Resource接口来统一这些底层资源一致的访问,而且提供了一些便利的接口,从而能提供我们的生产力。

2.Resource接口


Spring的Resource接口代表底层外部资源,提供了对底层外部资源的一致性访问接口。

public interface InputStreamSource {
InputStream getInputStream() throws IOException;
}
public interface Resource extends InputStreamSource {
	boolean exists();
	boolean isReadable();
	boolean isOpen();
	URL getURL() throws IOException;
	URI getURI() throws IOException;
	File getFile() throws IOException;
	long contentLength() throws IOException;
	long lastModified() throws IOException;
	Resource createRelative(String relativePath) throws IOException;
	String getFilename();
	String getDescription();
}
1)InputStreamSource接口解析:
   getInputStream:每次调用都将返回一个新鲜的资源对应的java.io. InputStream字节流,调用者在使用完毕后必须关闭该资源。
2)Resource接口继承InputStreamSource接口,并提供一些便利方法:
   exists:返回当前Resource代表的底层资源是否存在,true表示存在。
   isReadable:返回当前Resource代表的底层资源是否可读,true表示可读。
   isOpen:返回当前Resource代表的底层资源是否已经打开,如果返回true,则只能被读取一次然后关闭以避免内存泄漏;常见的Resource实现一般返回false。
   getURL:如果当前Resource代表的底层资源能由java.util.URL代表,则返回该URL,否则抛出IOException。 
   getURI:如果当前Resource代表的底层资源能由java.util.URI代表,则返回该URI,否则抛出IOException。 
   getFile:如果当前Resource代表的底层资源能由java.io.File代表,则返回该File,否则抛出IOException。
   contentLength:返回当前Resource代表的底层文件资源的长度,一般是值代表的文件资源的长度。
   lastModified:返回当前Resource代表的底层资源的最后修改时间。
   createRelative:用于创建相对于当前Resource代表的底层资源的资源,比如当前Resource代表文件资源“d:/test/”则createRelative(“test.txt”)将返回表文件资源“d:/test/test.txt”Resource资源。
   getFilename:返回当前Resource代表的底层文件资源的文件路径,比如File资源“file://d:/test.txt”将返回“d:/test.txt”,而URL资源http://www.javass.cn将返回“”,因为只返回文件路径。
   getDescription:返回当前Resource代表的底层资源的描述符,通常就是资源的全路径(实际文件名或实际URL地址)

 Resource接口提供了足够的抽象,足够满足我们日常使用。而且提供了很多内置Resource实现:ByteArrayResource、InputStreamResource 、FileSystemResource 、UrlResource 、ClassPathResource、ServletContextResource、VfsResource等。

3 内置Resource实现


3.1 ByteArrayResource

       ByteArrayResource代表byte[]数组资源,对于“getInputStream”操作将返回一个ByteArrayInputStream。

public class ByteArrayResourceDemo {
	
	@Test
	public void test()  {
		 ByteArrayResource arrayResource = new ByteArrayResource("byteArray".getBytes());
		if( arrayResource.exists()) {
			dumpStream(arrayResource);
		}
	}

	private void dumpStream(Resource arrayResource) {
		InputStream in = null;
		try {
			in = arrayResource.getInputStream();
			byte[] bytes = new byte[10];
			//读取
			in.read(bytes);
			System.out.println(new String(bytes));
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				//关闭资源
				in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

 

3.2  InputStreamResource

       InputStreamResource代表java.io.InputStream字节流,对于“getInputStream ”操作将直接返回该字节流,因此只能读取一次该字节流,即“isOpen”永远返回true。

@Test
public void testInputStreamResource() {
   ByteArrayInputStream bis = new ByteArrayInputStream("Hello World!".getBytes());
   Resource resource = new InputStreamResource(bis);
    if(resource.exists()) {
       dumpStream(resource);
    }  
}

3.3 ClassPathResource

	@Test
	public void test()   {
		ClassPathResource pathResource = new ClassPathResource("jdbc.properties");
		if( pathResource.exists()) {
			dumpStream(pathResource);
		}
		try {
			System.out.println("path:"+pathResource.getFile().getAbsolutePath());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

3.4  UrlResource

UrlResource代表URL资源,用于简化URL资源访问。“isOpen”永远返回false,表示可多次读取资源。

UrlResource一般支持如下资源访问:

  1. http通过标准的http协议访问web资源,如new UrlResource(“http://地址”);
  2. ftp通过ftp协议访问资源,如new UrlResource(“ftp://地址”);
  3. file通过file协议访问本地文件系统资源,如new UrlResource(“file:d:/test.txt”);

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值