pub trait AsyncSeek {
// Required methods
fn start_seek(self: Pin<&mut Self>, position: SeekFrom) -> Result<()>;
fn poll_complete(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
) -> Poll<Result<u64>>;
}展开描述
异步定位字节。
此 trait 类似于 std::io::Seek trait,但与异步任务系统集成。
特别地,start_seek 方法与 Seek::seek 不同,它不会阻塞调用线程。
用于处理 AsyncSeek 值的工具方法由 AsyncSeekExt 提供。
必需方法§
Sourcefn start_seek(self: Pin<&mut Self>, position: SeekFrom) -> Result<()>
fn start_seek(self: Pin<&mut Self>, position: SeekFrom) -> Result<()>
尝试按字节偏移量在流中定位。
允许定位到超出流末尾的位置,但具体行为由实现定义。
如果此函数成功返回,那么任务已被提交。
要了解何时完成,请调用 poll_complete。
§Errors
如果有另一个定位正在进行,此函数可能返回 io::ErrorKind::Other。
为避免这种情况,建议在任何 start_seek 调用之前先调用 poll_complete,
以确保所有挂起的定位都已完成。
Sourcefn poll_complete(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
) -> Poll<Result<u64>>
fn poll_complete( self: Pin<&mut Self>, cx: &mut Context<'_>, ) -> Poll<Result<u64>>
等待定位操作完成。
如果定位操作成功完成,此方法将返回从流开头算起的新位置。
该位置稍后可与 SeekFrom::Start 一起使用。
此方法返回的位置仅在 start_seek 之后立即有效。
如果在调用 start_seek 之后通过读取或写入等方式更改了位置,
那么返回的位置是否考虑该位置变化是未指定的。
类似地,如果从未调用过 start_seek,
那么 poll_complete 是否返回实际位置或其它占位值(如 0)也是未指定的。
§Errors
定位到负偏移量被视为错误。
外部类型的实现§
实现者§
impl AsyncSeek for File
impl AsyncSeek for Empty
impl<R: AsyncRead + AsyncSeek> AsyncSeek for BufReader<R>
在底层读取器中按字节偏移量定位。
使用 SeekFrom::Current(_) 进行定位时,所用的位置是假设 BufReader 没有内部缓冲区时底层读取器应处的位置。
定位操作始终会丢弃内部缓冲区,即使定位的位置本应落在该缓冲区内。
这保证在定位之后立即调用 .into_inner() 得到的底层读取器与定位时所处的位置一致。
更多详情请参阅 AsyncSeek。
注意:在边界情况下,当你使用 SeekFrom::Current(n) 进行定位时,如果 n 减去内部缓冲区长度会溢出 i64,则会执行两次定位而不是一次。
如果第二次定位返回 Err,则底层读取器将停留在与使用 SeekFrom::Current(0) 调用 seek 相同的位置上。
impl<RW: AsyncRead + AsyncWrite + AsyncSeek> AsyncSeek for BufStream<RW>
在底层流中按字节偏移量定位。
使用 SeekFrom::Current(_) 进行定位时,所用的位置是假设 BufStream 没有内部缓冲区时底层流应处的位置。
定位操作始终会丢弃内部缓冲区,即使定位的位置本应落在该缓冲区内。
这保证在定位之后立即调用 .into_inner() 得到的底层读取器与定位时所处的位置一致。
更多详情请参阅 AsyncSeek。
注意:在边界情况下,当你使用 SeekFrom::Current(n) 进行定位时,如果 n 减去内部缓冲区长度会溢出 i64,则会执行两次定位而不是一次。
如果第二次定位返回 Err,则底层读取器将停留在与使用 SeekFrom::Current(0) 调用 seek 相同的位置上。
impl<W: AsyncWrite + AsyncSeek> AsyncSeek for BufWriter<W>
在底层写入器中按字节偏移量定位。
定位前始终会先写出内部缓冲区的内容。