Trait std::io::Seek1.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

Seek trait 提供了一个游标,可以在字节流中移动它。

流通常具有固定的大小,允许相对于端点或当前偏移量进行搜索。

Examples

File 的工具 Seek:

use std::io;
use std::io::prelude::*;
use std::fs::File;
use std::io::SeekFrom;

fn main() -> io::Result<()> {
    let mut f = File::open("foo.txt")?;

    // 从文件的开头将游标移动 42 个字节
    f.seek(SeekFrom::Start(42))?;
    Ok(())
}
Run

Required methods

在流中寻找以字节为单位的偏移量。

允许在流的末尾进行查找,但是行为由实现定义。

如果查找操作成功完成,则此方法从流的开头返回新位置。

该位置以后可以与 SeekFrom::Start 一起使用。

Errors

查找可能会失败,例如因为它可能涉及刷新缓冲区。

寻求负偏移被认为是错误。

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
🔬 This is a nightly-only experimental API. (seek_stream_len #59359)

返回此流的长度 (以字节为单位)。

此方法最多使用三个查找操作来实现。如果此方法成功返回,则搜索位置不变 (即,调用此方法之前的位置与之后的位置相同)。 但是,如果此方法返回错误,则未指定搜索位置。

如果您需要获取 多个 流的长度,并且以后不再关心查找位置,则可以通过简单地调用 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

🔬 This is a nightly-only experimental API. (seek_stream_len #59359)

在基础 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
🔬 This is a nightly-only experimental API. (seek_stream_len #59359)

在基础 writer 中寻找以字节为单位的偏移量。

寻找总是在寻找之前写出内部缓冲区。