前言
欢迎关注dotnet研习社,今天我们讨论“Stream 流处理”。
在日常的后端开发、桌面应用甚至工业通信编程中,流(Stream)是处理输入输出(I/O)的核心机制。尤其在处理大量数据或者频繁读写时,如何优化读写性能、减少资源浪费,显得尤为关键。
本文,我们将深入剖析 C# 中两个重要的流类:BufferedStream
和 MemoryStream
,结合实战场景,帮助我们写出更高效、更健壮的代码。
一、什么是 MemoryStream?
MemoryStream
是一种以内存为基础的数据流,它的读写操作完全基于内存,不涉及磁盘或网络资源,速度极快,适用于:
- • 需要对数据进行中间缓冲处理
- • 临时构造文件、图片、序列化数据
- • 数据压缩/加密过程中的中间流
示例:将字符串写入 MemoryStream 并读取
using System;
using System.IO;
using System.Text;class Program
{static void Main(){var text = "Hello, MemoryStream!";var bytes = Encoding.UTF8.GetBytes(text);using (var ms = new MemoryStream()){ms.Write(bytes, 0, bytes.Length);ms.Position = 0;var reader = new StreamReader(ms);var result = reader.ReadToEnd();Console.WriteLine(result);}}
}
二、什么是 BufferedStream?
BufferedStream
是对其他流的“缓冲包装器”,为读写操作增加缓冲区,从而减少对底层设备(如硬盘)的访问次数。它适用于:
- • 文件读写场景,特别是大文件
- • 网络传输中,对
NetworkStream
进行包装 - • 提高频繁小块读写的性能
示例:用 BufferedStream 包装 FileStream 提高写入效率
using System;
using System.IO;class Program
{static void Main(){string filePath = "large_output.bin";using (var fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))using (var bs = new BufferedStream(fs, bufferSize: 8192)) // 8 KB 缓冲区{for (int i = 0; i < 10000; i++){byte[] data = BitConverter.GetBytes(i);bs.Write(data, 0, data.Length);}}Console.WriteLine("文件写入完成!");}
}
三、MemoryStream 和 BufferedStream 的区别
特性 | MemoryStream | BufferedStream |
底层介质 | 内存 | 任意 Stream(通常是 FileStream、NetworkStream) |
是否可独立使用 | ✅ 是 | ❌ 依赖底层流 |
适用场景 | 临时缓存、数据转换 | 文件、网络、高频 I/O |
性能特点 | 快速,但受限于内存大小 | 延迟写入/读取,减少设备访问 |
四、MemoryStream 高级用法:与图片、压缩等场景结合
示例:将图片压缩为字节数组
using System.Drawing;
using System.Drawing.Imaging;Image image = Image.FromFile("1.jpg");
using (var ms = new MemoryStream())
{image.Save(ms, ImageFormat.Png);byte[] imgBytes = ms.ToArray(); // 用于存数据库、传输
}
五、BufferedStream 的最佳实践与注意事项
- • 搭配 FileStream 使用:可以显著提高大文件读写效率;
- • 避免重复包装:不要对已缓冲的流再包装,如
StreamReader
内部已缓冲; - • 显式刷新:调用
.Flush()
确保数据写入底层流; - • 设置合理的缓冲大小:默认是 4096 字节,可以根据应用优化。
六、从 MemoryStream 生成文件并使用 BufferedStream 写入磁盘
using System;
using System.IO;
using System.Text;class Program
{static void Main(){// 用 MemoryStream 构建数据byte[] buffer;using (var ms = new MemoryStream()){var writer = new StreamWriter(ms, Encoding.UTF8);for (int i = 0; i < 1000; i++)writer.WriteLine($"行 {i}");writer.Flush();buffer = ms.ToArray(); // 获取写入后的字节}// 用 BufferedStream 写入磁盘using (var fs = new FileStream("output.txt", FileMode.Create))using (var bs = new BufferedStream(fs)){bs.Write(buffer, 0, buffer.Length);}Console.WriteLine("数据写入完成。");}
}
七、总结
类名 | 使用场景 | 关键优势 |
| 内存中处理数据、缓存、序列化 | 快速、无 I/O 瓶颈 |
| 对文件、网络流读写进行性能优化 | 降低系统调用,提高吞吐量 |
选择正确的流类型,是高性能 .NET 编程的基础。如果我们处理的是临时数据、缓存结构体、构建中间数据格式,MemoryStream
是利器;而当我们要操作大文件、网络读写、频繁的 I/O 操作时,BufferedStream
能大幅优化性能。