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

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

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

Cursor 与内存缓冲区一起使用,任何实现 AsRef<[u8]> 的东西都允许它们实现 Read 或者 Write,从而允许在实际使用 I/O 的 reader 或 writer 的任何地方使用这些缓冲区。

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

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)

recently added

检查底层 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

返回类型的 “default value”。 Read more

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

此方法测试 !=

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

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

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

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

读取填充 buf 所需的确切字节数。 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

在流中寻找以字节为单位的偏移量。 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)

recently added

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

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

执行转换。

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

执行转换。