1.介绍
不幸的是Java的标准的java.net.URL类和针对不同的URL前缀的标准处理器都不够充分去访问所有的低级资源。例如,美誉标准化的URL实现可能用于去范围需要从classpath中或者相对于一个SerletContext获取的资源。尽管可以可以针对特殊的URL前缀注册新的处理器,但是一般来讲这回很复杂而且URL接口仍然缺乏一些想要的功能更,比如一个去检查指向支援的存在的方法。
2.资源(Resource)接口
Spring的资源接口意味着更强的通过抽象的方式来访问立即的资源:
public interface Resource extends InputStreamSource {
boolean exists();
boolean isOpen();
URL getURL() throws IOException;
File getFile() throws IOException;
Resource createRelative(String relativePath) throws IOException;
String getFilename();
String getDescription();
}
public interface InputStreamSource {
InputStream getInputStream() throws IOException;
}
Resource接口中一些最重要的方法是:
- getInputStream():锁定和打开资源,返回一个InputStream获取资源。这个期望每次的调用都返回一个刷新的InputStream。但是调用者有职责去关闭着个流。
- exists():返回一个Boolean,标识这些资源是否存在
- isOpen():返回布尔值,标识是否这个资源是否是一个打开的流。如果是true,InputStream不能多次的读取它,而且必须是只能读一次而且然后关闭它避免资源泄露。对于所有的一般的资源实现InputStreamResource来说将是false。
- getDescription():返回这个资源的描述,在处理资源的时候用于错误输出。通常是完全的文件名或者一个实际的URL。
其他的方法允许你获取的表示资源的实际的URL或者文件对象。(如果向下的实现是兼容的而且支持这个功能)
Resource的抽象在Spring 自身中是使用的很多,当一个资源被需要到时候,在很多的方法签名中它会作为一个参数类型传入。在一些Spring APIs的其他方法中,会使用一个未加修饰的简单的形式的String用于创建Resource,或者是通过在String路径中特殊前缀,运行调用者去指明一个明确已经被创建和使用的的资源实现。
尽管Resource接口被Spring 和通过Spring被大量的使用,但是在你的代码中通过它自己把它当做一个通用的工具类来使用是很有用的,为了访问资源,甚至是当你的代码不知道或者不关心Spring的其他部分。尽管这个将你的代码和Spring耦合在一块,但是它只是耦合到了很小的一部分工具类中,而且它可以作为URL的有效替代,而且还可以和其他你想使用的库当成是等价的。