Trait std::io::Seek 1.0.0[−][src]
pub trait Seek { fn seek(&mut self, pos: SeekFrom) -> Result<u64>; fn rewind(&mut self) -> Result<()> { ... } fn stream_len(&mut self) -> Result<u64> { ... } fn stream_position(&mut self) -> Result<u64> { ... } }
Expand description
Required methods
Provided methods
返回到流的开头。
这是一个方便的方法,相当于 seek(SeekFrom::Start(0))
。
Errors
返回可能会失败,例如因为它可能涉及刷新缓冲区。
Example
use std::io::{Read, Seek, Write}; use std::fs::OpenOptions; let mut f = OpenOptions::new() .write(true) .read(true) .create(true) .open("foo.txt").unwrap(); let hello = "Hello!\n"; write!(f, "{}", hello).unwrap(); f.rewind().unwrap(); let mut buf = String::new(); f.read_to_string(&mut buf).unwrap(); assert_eq!(&buf, hello);Run
fn stream_len(&mut self) -> Result<u64>
[src]
fn stream_len(&mut self) -> Result<u64>
[src]返回此流的长度 (以字节为单位)。
此方法最多使用三个查找操作来实现。如果此方法成功返回,则搜索位置不变 (即,调用此方法之前的位置与之后的位置相同)。 但是,如果此方法返回错误,则未指定搜索位置。
如果您需要获取 多个 流的长度,并且以后不再关心查找位置,则可以通过简单地调用 seek(SeekFrom::End(0))
并使用其返回值 (它也是流的长度) 来减少查找操作的次数。
请注意,流的长度可以随时间变化 (例如,将数据附加到文件时)。因此,多次调用此方法不一定每次都返回相同的长度。
Example
#![feature(seek_stream_len)] use std::{ io::{self, Seek}, fs::File, }; fn main() -> io::Result<()> { let mut f = File::open("foo.txt")?; let len = f.stream_len()?; println!("The file is currently {} bytes long", len); Ok(()) }Run
从流的开头返回当前搜索位置。
这等效于 self.seek(SeekFrom::Current(0))
。
Example
use std::{ io::{self, BufRead, BufReader, Seek}, fs::File, }; fn main() -> io::Result<()> { let mut f = BufReader::new(File::open("foo.txt")?); let before = f.stream_position()?; f.read_line(&mut String::new())?; let after = f.stream_position()?; println!("The first line was {} bytes long", after - before); Ok(()) }Run
Implementors
在基础 reader 中寻找以字节为单位的偏移量。
用于 SeekFrom::Current
(_)
的搜索位置是 BufReader<R>
没有内部缓冲区时基础 reader 所在的位置。
搜寻总是会丢弃内部缓冲区,即使寻找位置本来会落在内部缓冲区内。
这保证了在寻道之后立即调用 BufReader::into_inner()
会在相同位置产生基础 reader。
要查找而不丢弃内部缓冲区,请使用 BufReader::seek_relative
。
有关更多详细信息,请参见 std::io::Seek
。
Note: 在使用 SeekFrom::Current
(n)
进行搜索的 edge 情况下,n
减去内部缓冲区长度使 i64
溢出,将执行两次搜索,而不是一次。
如果第二个搜索返回 Err
,则底层的 reader 将保留在与 SeekFrom::Current
(0)
一起调用 seek
时的位置。
从流的开头返回当前搜索位置。
返回的值等效于 self.seek(SeekFrom::Current(0))
,但不刷新内部缓冲区。
由于进行了这种优化,该函数不能保证在此之后立即调用 .into_inner()
将在同一位置产生基础 reader。
如果需要该保证,请改用 BufReader::seek
。
Panics
如果内部 reader 的位置小于缓冲数据量,则此函数将为 panic。
如果内部 reader 的 Seek::stream_position
实现不正确,或者由于直接在基础 reader 上调用 Seek::seek
而导致位置不同步,则可能发生这种情况。
Example
use std::{ io::{self, BufRead, BufReader, Seek}, fs::File, }; fn main() -> io::Result<()> { let mut f = BufReader::new(File::open("foo.txt")?); let before = f.stream_position()?; f.read_line(&mut String::new())?; let after = f.stream_position()?; println!("The first line was {} bytes long", after - before); Ok(()) }Run