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(()) }Run
Implementations
返回对内部缓冲数据的引用。
与 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
返回内部缓冲区的内容,如果内部缓冲区为空,则使用内部 reader 中的更多数据填充内部缓冲区。 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 中寻找以字节为单位的偏移量。
用于 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