Struct std::io::BufReader1.0.0[][src]

pub struct BufReader<R> { /* fields omitted */ }
Expand description

BufReader<R> 结构体将缓冲添加到任何 reader。

直接使用 Read 实例可能会非常低效。 例如,对 TcpStreamread 的每次调用都会导致系统调用。 BufReader<R> 对基础 Read 进行大批量的不频繁读取,并维护结果的内存缓冲区。

BufReader<R> 可以提高使 重复 读取对同一文件或网络套接字的调用的程序的速度。

一次读取非常多的内容,或者仅读取一次或几次,则无济于事。 从诸如 Vec<u8> 之类的内存中读取数据时,它也没有任何优势。

BufReader<R> 被丢弃时,其缓冲区的内容将被丢弃。 在同一流上创建 BufReader<R> 的多个实例可能会导致数据丢失。 将 BufReader<R>BufReader::into_inner 展开包装后,从基础 reader 进行读取也会导致数据丢失。

Examples

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

fn main() -> std::io::Result<()> {
    let f = File::open("log.txt")?;
    let mut reader = BufReader::new(f);

    let mut line = String::new();
    let len = reader.read_line(&mut line)?;
    println!("First line is {} bytes long", len);
    Ok(())
}
Run

Implementations

创建一个具有默认缓冲区容量的新 BufReader<R>。 当前默认值为 8 KB,但可能会在 future 中进行更改。

Examples

use std::io::BufReader;
use std::fs::File;

fn main() -> std::io::Result<()> {
    let f = File::open("log.txt")?;
    let reader = BufReader::new(f);
    Ok(())
}
Run

用指定的缓冲区容量创建一个新的 BufReader<R>

Examples

创建一个具有十个字节容量的缓冲区:

use std::io::BufReader;
use std::fs::File;

fn main() -> std::io::Result<()> {
    let f = File::open("log.txt")?;
    let reader = BufReader::with_capacity(10, f);
    Ok(())
}
Run

获取对基础 reader 的引用。

不建议直接从基础 reader 中读取。

Examples

use std::io::BufReader;
use std::fs::File;

fn main() -> std::io::Result<()> {
    let f1 = File::open("log.txt")?;
    let reader = BufReader::new(f1);

    let f2 = reader.get_ref();
    Ok(())
}
Run

获取基础 reader 的可变引用。

不建议直接从基础 reader 中读取。

Examples

use std::io::BufReader;
use std::fs::File;

fn main() -> std::io::Result<()> {
    let f1 = File::open("log.txt")?;
    let mut reader = BufReader::new(f1);

    let f2 = reader.get_mut();
    Ok(())
}
Run

返回对内部缓冲数据的引用。

fill_buf 不同,如果缓冲区为空,它将不会尝试填充缓冲区。

Examples

use std::io::{BufReader, BufRead};
use std::fs::File;

fn main() -> std::io::Result<()> {
    let f = File::open("log.txt")?;
    let mut reader = BufReader::new(f);
    assert!(reader.buffer().is_empty());

    if reader.fill_buf()?.len() > 0 {
        assert!(!reader.buffer().is_empty());
    }
    Ok(())
}
Run

返回内部缓冲区可以一次保存的字节数。

Examples

use std::io::{BufReader, BufRead};
use std::fs::File;

fn main() -> std::io::Result<()> {
    let f = File::open("log.txt")?;
    let mut reader = BufReader::new(f);

    let capacity = reader.capacity();
    let buffer = reader.fill_buf()?;
    assert!(buffer.len() <= capacity);
    Ok(())
}
Run

解包此 BufReader<R>,返回基础 reader。

请注意,内部缓冲区中的所有剩余数据都会丢失。 因此,对基础 reader 的后续读取可能会导致数据丢失。

Examples

use std::io::BufReader;
use std::fs::File;

fn main() -> std::io::Result<()> {
    let f1 = File::open("log.txt")?;
    let reader = BufReader::new(f1);

    let f2 = reader.into_inner();
    Ok(())
}
Run

相对于当前位置寻找。 如果新位置位于缓冲区内,则不会刷新缓冲区,从而实现更有效的查找。 此方法不返回基础 reader 的位置,因此,如果需要,调用者必须自己跟踪此信息。

Trait Implementations

返回内部缓冲区的内容,如果内部缓冲区为空,则使用内部 reader 中的更多数据填充内部缓冲区。 Read more

告诉此缓冲区 amt 字节已从缓冲区中消耗掉,因此在调用 read 时不再应返回它们。 Read more

🔬 This is a nightly-only experimental API. (buf_read_has_data_left #86423)

recently added

检查底层 Read 是否有任何数据可供读取。 Read more

将所有字节读入 buf,直到到达定界符 byte 或 EOF。 Read more

读取所有字节,直到到达换行符 (0xA 字节),然后将它们附加到提供的缓冲区中。 Read more

返回对该字节 byte 上的 reader 拆分内容的迭代器。 Read more

返回此 reader 的各行上的迭代器。 Read more

使用给定的格式化程序格式化该值。 Read more

从该源中提取一些字节到指定的缓冲区中,返回读取的字节数。 Read more

读取填充 buf 所需的确切字节数。 Read more

read 相似,不同之处在于它读入缓冲区的一部分。 Read more

🔬 This is a nightly-only experimental API. (can_vector #69941)

确定此 Read 是否具有有效的 read_vectored 实现。 Read more

🔬 This is a nightly-only experimental API. (read_initializer #42788)

确定该 Reader 是否可以与未初始化内存的缓冲区一起使用。 Read more

读取所有字节,直到此源中的 EOF 为止,然后将它们放入 bufRead more

读取所有字节,直到该源中的 EOF 为止,然后将它们附加到 bufRead more

为此 Read 实例创建 “by reference” 适配器。 Read more

将此 Read 实例的字节数转换为 IteratorRead more

创建一个适配器,它将将此流与另一个流链接。 Read more

创建一个适配器,该适配器最多可以从中读取 limit 字节。 Read more

在基础 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

返回到流的开头。 Read more

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

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

Auto Trait Implementations

Blanket Implementations

获取 selfTypeIdRead more

从拥有的值中一成不变地借用。 Read more

从拥有的值中借用。 Read more

执行转换。

执行转换。

发生转换错误时返回的类型。

执行转换。

发生转换错误时返回的类型。

执行转换。