前言

欢迎关注dotnet研习社,今天我们讨论“Stream 流处理”。

在日常的后端开发、桌面应用甚至工业通信编程中,流(Stream)是处理输入输出(I/O)的核心机制。尤其在处理大量数据或者频繁读写时,如何优化读写性能、减少资源浪费,显得尤为关键。

本文,我们将深入剖析 C# 中两个重要的流类:BufferedStream 和 MemoryStream,结合实战场景,帮助我们写出更高效、更健壮的代码。

一、什么是 MemoryStream?

探索dotnet中的BufferedStream与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);}}
}

探索dotnet中的BufferedStream与MemoryStream:用法与实战场景详解_数据_02


二、什么是 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("文件写入完成!");}
}

探索dotnet中的BufferedStream与MemoryStream:用法与实战场景详解_FileStream_03


三、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("数据写入完成。");}
}

探索dotnet中的BufferedStream与MemoryStream:用法与实战场景详解_System_04


七、总结

类名

使用场景

关键优势

MemoryStream

内存中处理数据、缓存、序列化

快速、无 I/O 瓶颈

BufferedStream

对文件、网络流读写进行性能优化

降低系统调用,提高吞吐量

选择正确的流类型,是高性能 .NET 编程的基础。如果我们处理的是临时数据、缓存结构体、构建中间数据格式,MemoryStream 是利器;而当我们要操作大文件、网络读写、频繁的 I/O 操作时,BufferedStream 能大幅优化性能。