Resource
概述
Java 标准的 java.net.URL
类是标准的用于表示资源的类型,这个类型可以处理一些特定协议的资源。但是在日常开发中,我们经常需要定义一些私有的协议去处理一些资源,这在 java.net.URL
中是比较难处理的,因此提出了 Resource 的概念。
Resource Interface
Resource
接口用于表示一些更低层级的资源。下面是 Resource 接口的定义:
kotlin
interface Resource {
/**
* 资源是否存在
*/
fun exists(): Boolean
/**
* 用于指定资源是否可以返回 InputStream
*/
fun readable(): Boolean
/**
* 获取 URI
*/
fun getURI(): URI
/**
* 获取资源长度
*
* 如果无法获取资源长度,将返回 -1,表示资源长度未知
*/
@Throws(IOException::class)
fun getContentLength(): Long
/**
* 获取资源(文件)名
*/
fun getName(): String?
/**
* 获取流
* 如果文件不存在时,将返回空
*/
@Throws(IOException::class)
fun getInputStream(): InputStream?
}
ResourceLoader Interface
ResourceLoader
接口用于获取资源。下面的 ResourceLoader 接口的定义:
kotlin
interface ResourceLoader {
/**
* 返回是否支持指定的协议
*/
fun support(protocol: String): Boolean
/**
* 返回是否支持指定的 URI
*/
fun support(uri: URI): Boolean = this.support(uri.scheme)
/**
* 返回指位置的资源。该资源必须是可重复使用的,允许重复调用 [Resource.getInputStream]。
* 本方法不合返回空的 Resource 对象,开发者可以通过 [Resource.isExists] 方法判断资源是否存在。
* 如果同一路径下存在多个同名资源,则返回第一个资源。
*
* @param location 资源路径,需要协议名
*/
fun getResource(location: URI): Resource
/**
* 返回指定路径的资源。该资源必须是可重复使用的,允许重复调用 [Resource.getInputStream]。
* 本方法不会返回空的 Resource 对象,开发者可以通过 [Resource.isExists] 方法判断资源是否存在。
*
* @param location 资源路径,需要协议名
*/
fun getResources(location: URI): List<Resource> {
val resource = this.getResource(location)
return if (resource.isExists()) {
listOf(resource)
} else {
emptyList()
}
}
/**
* 返回指定位置的资源。该资源必须是可重复使用的,允许重复调用 [Resource.getInputStream]。
* 本方法不会返回空的 Resource 对象,开发者可以通过 [Resource.isExists] 方法判断资源是否存在。
* 如果同一路径下存在多个同名资源,则返回第一个资源。
*
* @param location 资源路径,不需协议名,只需要路径名即可
*/
fun getResource(location: String): Resource
/**
* 返回指定路径的资源。该资源必须是可重复使用的,允许重复调用 [Resource.getInputStream]。
* 本方法不会返回空的 Resource 对象,开发者可以通过 [Resource.isExists] 方法判断资源是否存在。
*
* @param location 资源路径,不需协议名,只需要路径名即可
*/
fun getResources(location: String): List<Resource> {
val resource = this.getResource(location)
return if (resource.isExists()) {
listOf(resource)
} else {
emptyList()
}
}
}
Built-in ResourceLoader
- UrlResourceLoader: 返回 UrlResource,用于加载 http、https 协议的资源,表示网络资源
- ClassPathResourceLoader: 返回 ClassPathResource,用于加载 classpath 协议的资源,表示类路径资源
- FileSystemResourceLoader: 返回 FileSystemResource,用于加载 file 协议的资源,表示文件系统资源
- AssetResourceLoader: 返回 AssetResource,用于加载 asset 协议的资源,表示 Android 应用的 res 目录下的资源