缓冲式流复制Buffered stream copy
通过有限大小的缓冲反复读取和写出,复制任意长度的数据流。
- 核心约束
- 只消费实际读到的字节,并正确处理短写、结束与错误。
- 适用问题
- 文件传输、网络正文转发、流式处理与 I/O 适配。
- 边界与取舍
- I/O 延迟、系统调用与可选快路径改变实际成本;缓冲复制不等同零拷贝。
常见操作#
n 为复制字节数,B 为缓冲区字节数;针对普通 read/write 复制循环。
| 操作 | 时间成本 | 条件与说明 |
|---|---|---|
| 复制全部数据 | 字节处理 | 每个字节经过读写路径;实际耗时含设备、系统调用和阻塞。 |
| 批量读写 | 理想满块时约 轮 | 短读 / 短写、错误和非阻塞接口可能增加轮次,不能保证每次都填满 B。 |
| 能力特化 | 由 ReaderFrom / WriterTo 等路径决定 | 可能使用零拷贝系统调用等优化;提供缓冲区不保证它一定被使用。 |
时间与空间#
- 时间成本
- 普通路径 ,阻塞等待与特化路径另计
- 空间成本
- 用户缓冲区
EOF、部分成功和错误传播是正确性的一部分。使用固定缓冲区可避免把整个输入载入内存。
工程中的应用#
1 个案例 · 附源码Go 的 HTTP 正文传输复用 io.CopyBuffer;复制器以 Reader/Writer 为基础,并探测可选的专用传输能力。
附源码片段 · 通信与流量
基础原理参考资料
Go · io.CopyBuffer缓冲区复用、WriterTo / ReaderFrom 分派以及返回语义。
Go 1.23 · copyBuffer implementation通用复制循环、短写检查和接口能力分派。