AbstractExternalResource
一个实现了基本方法的外部资源
实现
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()
}
资源释放
如同 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)
Since
2.9
See also
Constructors
Functions
打开 Input. 在返回的 Input 被 关闭 前无法再次打开流. 注意: 此 API 不稳定, 请使用 inputStream 代替.
打开 InputStream. 在返回的 InputStream 被 InputStream.close 前无法再次打开流.
上传文件并发送件消息. 如果要上传的文件格式是图片或者语音, 也会将它们作为文件上传而不会调整消息类型.
将图片作为单独的消息发送给指定联系人.
创建一个在 使用一次 后就会自动 close 的 ExternalResource.
上传图片并构造 Image. 这个函数可能需消耗一段时间.
Properties
文件格式,如 "png", "amr". 当无法自动识别格式时为 DEFAULT_FORMAT_NAME.
是否在 使用一次 后自动 close.
该 ExternalResource 的数据来源, 可能有以下的返回