AbstractExternalResource
abstract class AbstractExternalResource @JvmOverloads constructor(displayName: String? = null, cleanup: AbstractExternalResource.ResourceCleanCallback? = null) : ExternalResource
Content copied to clipboard
一个实现了基本方法的外部资源
实现
AbstractExternalResource 实现了大部分必要的方法, 只有 ExternalResource.inputStream, ExternalResource.size 还未实现
其中 ExternalResource.inputStream 要求每次读取的内容都是一致的
Example:
class MyCustomExternalResource: AbstractExternalResource() {
override fun inputStream0(): InputStream = FileInputStream("/test.txt")
override val size: Long get() = File("/test.txt").length()
}
Content copied to clipboard
资源释放
如同 mirai 内置的 ExternalResource 实现一样, AbstractExternalResource 也会被注册进入资源泄露监视器 (即意味着 AbstractExternalResource 也要求手动关闭)
为了确保逻辑正确性, AbstractExternalResource 不允许覆盖其 close 方法, 必须在构造 AbstractExternalResource 的时候给定一个 ResourceCleanCallback 以进行资源释放
对于 ResourceCleanCallback, 有以下要求
没有对 AbstractExternalResource 的访问 (即没有 AbstractExternalResource 的任何引用)
Example:
class MyRes(
cleanup: ResourceCleanCallback,
val delegate: Closable,
): AbstractExternalResource(cleanup) {
}
// 错误, 该写法会导致 Resource 永远也不会被自动释放
lateinit var myRes: MyRes
val cleanup = ResourceCleanCallback {
myRes.delegate.close()
}
myRes = MyRes(cleanup, fetchDelegate())
// 正确
val delegate: Closable
val cleanup = ResourceCleanCallback {
delegate.close()
}
val myRes = MyRes(cleanup, delegate)
Content copied to clipboard
Since
2.9
See also
Constructors
Link copied to clipboard
fun AbstractExternalResource(cleanup: AbstractExternalResource.ResourceCleanCallback? = null)
Content copied to clipboard
Link copied to clipboard
fun AbstractExternalResource(displayName: String? = null, cleanup: AbstractExternalResource.ResourceCleanCallback? = null)
Content copied to clipboard
Types
Functions
Link copied to clipboard
Link copied to clipboard
打开 Input. 在返回的 Input 被 Input.close 前无法再次打开流. 注意: 此 API 不稳定, 请使用 inputStream 代替.
Link copied to clipboard
打开 InputStream. 在返回的 InputStream 被 关闭 前无法再次打开流.
Link copied to clipboard
创建一个在 使用一次 后就会自动 close 的 ExternalResource.