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

pub struct Cursor<T> { /* fields omitted */ }
Expand description

Cursor 包装内存中的缓冲区,并为其提供 Seek 实现。

Cursors 与内存缓冲区一起使用,任何实现 AsRef<[u8]>,以允许它们实现 Read 或者 Write,从而允许这些缓冲区在您可能使用进行实际 I/O 的读取器或写入器的任何地方使用。

标准库在通常用作缓冲区的各种类型上实现了一些 I/O traits,例如 Cursor<Vec<u8>> and Cursor<&[u8]>

Examples

我们可能想在生产代码中将字节写入 File,但在测试中使用内存缓冲区。我们可以做到这一点 Cursor:

use std::io::prelude::*;
use std::io::{self, SeekFrom};
use std::fs::File;

// 我们编写的库函数
fn write_ten_bytes_at_end<W: Write + Seek>(writer: &mut W) -> io::Result<()> {
    writer.seek(SeekFrom::End(-10))?;

    for i in 0..10 {
        writer.write(&[i])?;
    }

    // 一切顺利
    Ok(())
}

// 这是一些使用此库函数的代码。
// 我们可能想在此处使用 BufReader 来提高效率,但让我们继续关注此示例。
let mut file = File::create("foo.txt")?;

write_ten_bytes_at_end(&mut file)?;

// 现在让我们编写一个测试
#[test]
fn test_writes_bytes() {
    // 设置一个真实的文件要比内存中的缓冲区慢得多,让我们用游标代替
    use std::io::Cursor;
    let mut buff = Cursor::new(vec![0; 15]);

    write_ten_bytes_at_end(&mut buff).unwrap();

    assert_eq!(&buff.get_ref()[5..15], &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
}
Run

Implementations

创建一个新的游标来包装所提供的底层内存缓冲区。

即使底层缓冲区 (例如 Vec) 不为空,游标的初始位置也为 0。 因此,写入游标是从覆盖 Vec 内容开始的,而不是追加到它的上面。

Examples
use std::io::Cursor;

let buff = Cursor::new(Vec::new());
Run

消费这个游标,返回底层值。

Examples
use std::io::Cursor;

let buff = Cursor::new(Vec::new());

let vec = buff.into_inner();
Run

获取此游标中的底层值的引用。

Examples
use std::io::Cursor;

let buff = Cursor::new(Vec::new());

let reference = buff.get_ref();
Run

获取此游标中底层值的可变引用。

应注意避免修改底层值的内部 I/O 状态,因为它可能破坏此游标的位置。

Examples
use std::io::Cursor;

let mut buff = Cursor::new(Vec::new());

let reference = buff.get_mut();
Run

返回此游标的当前位置。

Examples
use std::io::Cursor;
use std::io::prelude::*;
use std::io::SeekFrom;

let mut buff = Cursor::new(vec![1, 2, 3, 4, 5]);

assert_eq!(buff.position(), 0);

buff.seek(SeekFrom::Current(2)).unwrap();
assert_eq!(buff.position(), 2);

buff.seek(SeekFrom::Current(-1)).unwrap();
assert_eq!(buff.position(), 1);
Run

设置此游标的位置。

Examples
use std::io::Cursor;

let mut buff = Cursor::new(vec![1, 2, 3, 4, 5]);

assert_eq!(buff.position(), 0);

buff.set_position(2);
assert_eq!(buff.position(), 2);

buff.set_position(4);
assert_eq!(buff.position(), 4);
Run
🔬 This is a nightly-only experimental API. (cursor_remaining #86369)

返回剩余的三个。

Examples
#![feature(cursor_remaining)]
use std::io::Cursor;

let mut buff = Cursor::new(vec![1, 2, 3, 4, 5]);

assert_eq!(buff.remaining_slice(), &[1, 2, 3, 4, 5]);

buff.set_position(2);
assert_eq!(buff.remaining_slice(), &[3, 4, 5]);

buff.set_position(4);
assert_eq!(buff.remaining_slice(), &[5]);

buff.set_position(6);
assert_eq!(buff.remaining_slice(), &[]);
Run
🔬 This is a nightly-only experimental API. (cursor_remaining #86369)

如果剩余的 3 为空,则返回 true

Examples
#![feature(cursor_remaining)]
use std::io::Cursor;

let mut buff = Cursor::new(vec![1, 2, 3, 4, 5]);

buff.set_position(2);
assert!(!buff.is_empty());

buff.set_position(5);
assert!(buff.is_empty());

buff.set_position(10);
assert!(buff.is_empty());
Run

Trait Implementations

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

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

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

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

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

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

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

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

返回值的副本。 Read more

source 执行复制分配。 Read more

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

返回类型的 “默认值”。 Read more

此方法测试 selfother 值是否相等,并由 == 使用。 Read more

此方法测试 !=

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

🔬 This is a nightly-only experimental API. (read_buf #78485)

从此源中提取一些字节到指定的缓冲区中。 Read more

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

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

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

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

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

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

🔬 This is a nightly-only experimental API. (read_buf #78485)

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

为这个 Read 实例创建一个 “by reference” 适配器。 Read more

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

创建一个适配器,将这个流与另一个链接起来。 Read more

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

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

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

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

从流的开头返回当前查找位置。 Read more

返回到流的开头。 Read more

在此 writer 中写入一个缓冲区,返回写入的字节数。 Read more

类似于 write,不同之处在于它是从缓冲区切片中写入数据的。 Read more

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

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

刷新此输出流,确保所有中间缓冲的内容均到达其目的地。 Read more

尝试将整个缓冲区写入此 writer。 Read more

🔬 This is a nightly-only experimental API. (write_all_vectored #70436)

尝试将多个缓冲区写入此 writer。 Read more

将格式化的字符串写入此 writer,返回遇到的任何错误。 Read more

为这个 Write 实例创建一个 “by reference” 适配器。 Read more

在此 writer 中写入一个缓冲区,返回写入的字节数。 Read more

类似于 write,不同之处在于它是从缓冲区切片中写入数据的。 Read more

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

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

刷新此输出流,确保所有中间缓冲的内容均到达其目的地。 Read more

尝试将整个缓冲区写入此 writer。 Read more

🔬 This is a nightly-only experimental API. (write_all_vectored #70436)

尝试将多个缓冲区写入此 writer。 Read more

将格式化的字符串写入此 writer,返回遇到的任何错误。 Read more

为这个 Write 实例创建一个 “by reference” 适配器。 Read more

在此 writer 中写入一个缓冲区,返回写入的字节数。 Read more

类似于 write,不同之处在于它是从缓冲区切片中写入数据的。 Read more

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

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

刷新此输出流,确保所有中间缓冲的内容均到达其目的地。 Read more

尝试将整个缓冲区写入此 writer。 Read more

🔬 This is a nightly-only experimental API. (write_all_vectored #70436)

尝试将多个缓冲区写入此 writer。 Read more

将格式化的字符串写入此 writer,返回遇到的任何错误。 Read more

为这个 Write 实例创建一个 “by reference” 适配器。 Read more

在此 writer 中写入一个缓冲区,返回写入的字节数。 Read more

类似于 write,不同之处在于它是从缓冲区切片中写入数据的。 Read more

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

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

刷新此输出流,确保所有中间缓冲的内容均到达其目的地。 Read more

尝试将整个缓冲区写入此 writer。 Read more

🔬 This is a nightly-only experimental API. (write_all_vectored #70436)

尝试将多个缓冲区写入此 writer。 Read more

将格式化的字符串写入此 writer,返回遇到的任何错误。 Read more

为这个 Write 实例创建一个 “by reference” 适配器。 Read more

Auto Trait Implementations

Blanket Implementations

获取 selfTypeIdRead more

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

从拥有的值中借用。 Read more

执行转换。

执行转换。

获得所有权后的结果类型。

从借用的数据创建拥有的数据,通常是通过克隆。 Read more

🔬 This is a nightly-only experimental API. (toowned_clone_into #41263)

使用借来的数据来替换拥有的数据,通常是通过克隆。 Read more

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

执行转换。

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

执行转换。