qubit-io

Small stream I/O trait utilities for Rust

Rust CI Coverage Crates.io Rust License

面向 Rust 的小型 stream I/O trait 与扩展工具库。

概述

Qubit IO 专注于基于 std::io 的 stream 和字节 I/O。它不尝试成为文件系统抽象层,而是为读、写、seek、buffer、编码、解码、限制、tee、计数和比较字节流的代码提供可复用构件。

适合使用本 crate 的场景包括:

详细用法、示例和 API 选择建议请参见中文用户手册。API 参考文档可在 docs.rs 查看。

如果需要本地文件系统相关能力,请参考qubit-local-fs

安装

[dependencies]
qubit-io = "0.2"

快速示例

use std::io::Cursor;

use qubit_io::{
    ReadExt,
    Streams,
    WriteSeekExt,
};

let mut input = Cursor::new(b"hello".to_vec());
let mut output = Vec::new();

Streams::copy(&mut input, &mut output)?;
assert_eq!(b"hello", output.as_slice());

let mut cursor = Cursor::new(vec![0; 8]);
cursor.write_all_at_preserving_position(2, b"rs")?;

let data = Cursor::new(b"bounded".to_vec()).read_to_end_limited(16)?;
assert_eq!(b"bounded", data.as_slice());

# Ok::<(), std::io::Error>(())

主要能力

Object-Safe I/O 组合 Trait

qubit-io 提供可作为 trait object 使用的具名组合 trait:

Trait组合能力典型用途
ReadSeekRead + Seek可读取的随机访问输入
BufReadSeekBufRead + Seek带缓冲的随机访问输入
ReadWriteRead + Write双向 stream 或可变 buffer
WriteSeekWrite + Seek可写入的随机访问输出
ReadWriteSeekRead + Write + Seek完整可变的随机访问 I/O 对象

当 API 希望接收 &mut dyn ReadSeek,而不是写成 R: Read + Seek 泛型约束时,这些 trait 会更方便。

Extension Trait

extension trait 让常见底层 I/O 模式保持接近标准库,同时减少重复样板代码:

Extension trait示例
ReadExtread_exact_or_eofdiscard_exact_or_eofcopy_toread_to_end_limitedread_to_string_limited
BufReadExtread_until_limitedread_line_limiteddiscard_until_limited
SeekExtstream_size
ReadSeekExtpeek_exact_or_eofread_exact_or_eof_at
WriteSeekExtwrite_all_at_preserving_position
BinaryReadExt / BinaryWriteExtfixed-width 整数和浮点标量编解码
Leb128ReadExt / Leb128WriteExtunsigned / signed LEB128 整数编解码
ZigZagReadExt / ZigZagWriteExtZigZag 映射有符号整数编解码
StringReadExt / StringWriteExtlength-prefixed UTF-8 字符串

Streams 命名空间

Streams 包含 stream 层 associated function:

方法用途
copy委托给 std::io::copy
copy_at_most最多复制指定字节数
copy_to_end_limited只有在大小限制内到达 EOF 才完成复制
content_eq比较两个 readable stream 的字节内容是否相同
compare_content对两个 readable stream 做字典序比较

Wrapper

wrapper 类型把 stream 行为放进类型语义,而不是一次性函数调用:

Wrapper用途
CountingReaderCountingWriter统计成功读写的字节数
LimitReaderLimitWriter限制读取或写入的字节预算
TeeReaderTeeWriter把数据复制到 branch writer
ChecksumReaderChecksumWriter读写时更新调用方提供的 checksum 状态
PositionGuarddrop 时恢复 seek 位置,除非主动 dismiss

Codec Wrapper

偏好 reader/writer object 调用风格的用户可以使用 root-level codec wrapper:

Wrapper用途
BinaryReaderBinaryWriterfixed-width 标量编解码
Leb128ReaderLeb128WriterLEB128 编解码
ZigZagReaderZigZagWriter基于 unsigned LEB128 payload 的 ZigZag 编解码

Prelude

qubit_io::prelude 重导出 method-providing extension trait 和 object-safe 组合 trait。它有意不重导出 wrapper 类型或具体命名空间。

use qubit_io::prelude::*;

Crate 边界

qubit-io 只保留 stream 和字节 I/O 能力,不暴露本地路径 helper、临时文件、目录复制、目录清理或 atomic file write。如果需要本地文件系统相关能力,请参考qubit-local-fs

运行时依赖

本 crate 运行时只依赖 Rust 标准库。

测试与代码覆盖率

本项目为 stream trait、extension method、codec helper 和 wrapper 类型保持测试覆盖。

运行测试

# 运行所有测试
cargo test

# 运行覆盖率报告
./coverage.sh

# 生成文本格式报告
./coverage.sh text

# 运行 CI 检查(格式化、clippy、测试、覆盖率、audit)
./ci-check.sh

许可证

Copyright (c) 2026. Haixing Hu.

根据 Apache 许可证 2.0 版("许可证")授权; 除非遵守许可证,否则您不得使用此文件。 您可以在以下位置获取许可证副本:

http://www.apache.org/licenses/LICENSE-2.0

除非适用法律要求或书面同意,否则根据许可证分发的软件 按"原样"分发,不附带任何明示或暗示的担保或条件。 有关许可证下的特定语言管理权限和限制,请参阅许可证。

完整的许可证文本请参阅 LICENSE

贡献

欢迎贡献。请随时提交 Pull Request。

开发指南

作者

Haixing Hu

相关项目

---

仓库地址:https://github.com/qubit-ltd/rs-io