笔记(二)

一、MemoryStream 核心概念

MemoryStream 是 .NET 中 System.IO 命名空间下的一个类,简单来说:
它是在内存中操作字节数据的流(而非操作文件、网络等外部资源);
可以把它理解为 “内存中的字节缓冲区”,支持读取、写入、定位(Seek)等流的通用操作;
相比文件流(FileStream),它无需访问磁盘,操作速度极快,但数据仅存在于内存中,程序退出 / 内存释放后就会丢失。
基本用法示例

运行
using System;
using System.IO;

public static void MemoryStreamBasicDemo()
{
    // 1. 创建字节数组
    byte[] data = new byte[] { 0x48, 0x65, 0x6C, 0x6C, 0x6F }; // "Hello" 的ASCII码
    // 2. 从字节数组创建MemoryStream
    using (MemoryStream ms = new MemoryStream(data))
    {
        // 3. 读取流中的数据
        byte[] buffer = new byte[ms.Length];
        ms.Read(buffer, 0, buffer.Length);
        // 4. 转换为字符串输出
        string result = System.Text.Encoding.ASCII.GetString(buffer);
        Console.WriteLine(result); // 输出:Hello
    }
    // 5. 也可以写入数据到MemoryStream
    using (MemoryStream writeMs = new MemoryStream())
    {
        byte[] writeData = System.Text.Encoding.ASCII.GetBytes(" World");
        writeMs.Write(writeData, 0, writeData.Length);
        // 重置流的位置到起始处,才能读取刚写入的数据
        writeMs.Position = 0;
        byte[] readBuffer = new byte[writeMs.Length];
        writeMs.Read(readBuffer, 0, readBuffer.Length);
        Console.WriteLine(System.Text.Encoding.ASCII.GetString(readBuffer)); // 输出: World
    }
}

三、MemoryStream 的常见使用场景

内存中处理二进制数据:比如解析网络传输的字节包、临时处理图片 / 文件的字节数据;
避免频繁磁盘 IO:如果需要多次读写少量数据,先用 MemoryStream 缓存,最后一次性写入磁盘;
与其他流互转:比如把 FileStream 读取的数据导入 MemoryStream 加速处理。

四、关键注意事项

内存限制:MemoryStream 存储的数据全部在内存中,处理超大字节数组(如几百 MB/GB)会导致内存溢出,此时应改用文件流;
Dispose 时机:只有当没有其他对象依赖该流时,才能调用 Dispose() 或用 using;
Position 属性:读取 / 写入流前,务必确认 Position(当前读写位置)是否正确,否则会读 / 写错误位置的数据。

总结

MemoryStream 是内存中的字节缓冲区,操作快但数据仅存于内存,核心用于二进制数据的内存级处理;
你的代码中不能用 using 包裹,是因为 Image.FromStream 会引用流的内存,using 提前释放流会导致 Bitmap 失效;
解决办法是复制 Bitmap 数据(new Bitmap(Image)),让 Bitmap 脱离流依赖,再安全释放流。

posted @ 2026-01-31 16:40  huihui不会写代码  阅读(0)  评论(0)    收藏  举报