Struct std::io::BufReader 1.0.0[−][src]
pub struct BufReader<R> { /* fields omitted */ }Expand description
BufReader<R> 结构体将缓冲添加到任何 reader。
直接使用 Read 实例可能会非常低效。
例如,对 TcpStream 上 read 的每次调用都会导致系统调用。
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(())
}RunImplementations
返回对内部缓冲数据的引用。
与 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相对于当前位置寻找。 如果新位置位于缓冲区内,则不会刷新缓冲区,从而实现更有效的查找。 此方法不返回底层 reader 的位置,因此如果需要,调用者必须自己跟踪此信息。
Trait Implementations
与 read 相似,不同之处在于它读入缓冲区的一部分。 Read more
读取所有字节,直到此源中的 EOF 为止,然后将它们放入 buf。 Read more
读取这个源中的所有字节,直到 EOF 为止,然后将它们追加到 buf。 Read more
为这个 Read 实例创建一个 “by reference” 适配器。 Read more
创建一个适配器,将这个流与另一个链接起来。 Read more
在底层 reader 中查找偏移量 (以字节为单位)。
用于使用 SeekFrom::Current(_) 查找的位置是底层 reader 所在的位置,如果 BufReader<R> 没有内部缓冲区。
查找总是会丢弃内部缓冲区,即使查找位置本来会落在内部缓冲区内。
这保证了在查找之后立即调用 BufReader::into_inner() 会在相同位置产生底层 reader。
要在不丢弃内部缓冲区的情况下进行查找,请使用 BufReader::seek_relative。
有关更多详细信息,请参见 std::io::Seek。
Note: 在 edge 情况下,您使用 SeekFrom::Current(n) 进行查找,其中 n 减去内部缓冲区长度会溢出 i64,将执行两次查找而不是一次查找。
如果第二个 seek 返回 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