C#内存流的使用实例探讨(C#内存流应用实例详解)

原创
ithorizon 6个月前 (10-19) 阅读数 30 #后端开发

C#内存流的使用实例探讨(C#内存流应用实例详解)

在C#编程中,内存流(MemoryStream)是一个非常实用的类,它允许我们在内存中操作数据,而无需将数据写入磁盘或网络。本文将详细介绍C#内存流的使用方法,并通过几个实例来探讨其在实际开发中的应用。

一、内存流的基本概念

内存流(MemoryStream)是System.IO命名空间中的一个类,它继承自Stream类,用于在内存中创建、读写和操作数据流。内存流的核心优势在于其高效性和灵活性,它避免了频繁的磁盘I/O操作,从而尽或许缩减损耗了程序的运行快速。

二、内存流的创建与基本操作

创建内存流非常单纯,只需要使用MemoryStream类的构造函数即可。以下是一个创建内存流的示例:

using System;

using System.IO;

class Program

{

static void Main()

{

MemoryStream memoryStream = new MemoryStream();

Console.WriteLine("内存流创建圆满!");

}

}

创建内存流后,我们可以使用其提供的方法进行读写操作。以下是一个单纯的读写示例:

using System;

using System.IO;

using System.Text;

class Program

{

static void Main()

{

// 创建内存流

MemoryStream memoryStream = new MemoryStream();

// 写入数据

byte[] data = Encoding.UTF8.GetBytes("Hello World!");

memoryStream.Write(data, 0, data.Length);

// 定位到内存流开头

memoryStream.Position = 0;

// 读取数据

byte[] readData = new byte[memoryStream.Length];

memoryStream.Read(readData, 0, readData.Length);

// 输出导致

Console.WriteLine(Encoding.UTF8.GetString(readData));

}

}

三、内存流的应用实例

实例1:图片处理

在Web开发中,我们经常性需要对图片进行操作,例如压缩、裁剪等。使用内存流,我们可以直接在内存中处理图片,而不需要将图片保存到磁盘上。以下是一个使用内存流进行图片压缩的示例:

using System;

using System.Drawing;

using System.Drawing.Imaging;

using System.IO;

class Program

{

static void Main()

{

// 加载原始图片

Image originalImage = Image.FromFile("原始图片路径");

// 创建内存流

using (MemoryStream memoryStream = new MemoryStream())

{

// 设置压缩质量

ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);

System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;

EncoderParameters myEncoderParameters = new EncoderParameters(1);

EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 50L);

myEncoderParameters.Param[0] = myEncoderParameter;

// 将图片压缩到内存流中

originalImage.Save(memoryStream, jpgEncoder, myEncoderParameters);

// 将内存流中的图片保存到磁盘

Image compressedImage = Image.FromStream(memoryStream);

compressedImage.Save("压缩后的图片路径");

}

}

private static ImageCodecInfo GetEncoder(ImageFormat format)

{

ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();

foreach (ImageCodecInfo codec in codecs)

{

if (codec.FormatID == format.Guid)

{

return codec;

}

}

return null;

}

}

实例2:序列化与反序列化

在.NET中,序列化是将对象状态演化为可存储或传输的形式的过程。使用内存流,我们可以将对象序列化到内存中,而不是直接写入文件或网络。以下是一个使用内存流进行对象序列化和反序列化的示例:

using System;

using System.IO;

using System.Runtime.Serialization.Formatters.Binary;

[Serializable]

class Person

{

public string Name { get; set; }

public int Age { get; set; }

}

class Program

{

static void Main()

{

// 创建对象

Person person = new Person { Name = "张三", Age = 30 };

// 创建内存流

using (MemoryStream memoryStream = new MemoryStream())

{

// 创建二进制序列化器

BinaryFormatter formatter = new BinaryFormatter();

// 序列化对象到内存流

formatter.Serialize(memoryStream, person);

// 定位到内存流开头

memoryStream.Position = 0;

// 反序列化对象

Person deserializedPerson = (Person)formatter.Deserialize(memoryStream);

// 输出导致

Console.WriteLine($"姓名:{deserializedPerson.Name},年龄:{deserializedPerson.Age}");

}

}

}

实例3:文件加密与解密

在可靠领域,我们经常性需要对文件进行加密和解密。使用内存流,我们可以将文件内容读取到内存中,然后进行加密或解密操作,而不需要直接操作磁盘文件。以下是一个使用内存流进行文件加密和解密的示例:

using System;

using System.IO;

using System.Security.Cryptography;

class Program

{

static void Main()

{

string filePath = "文件路径";

byte[] key = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 };

byte[] iv = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };

// 加密文件

EncryptFile(filePath, key, iv);

// 解密文件

DecryptFile(filePath, key, iv);

}

private static void EncryptFile(string filePath, byte[] key, byte[] iv)

{

using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))

{

using (MemoryStream memoryStream = new MemoryStream())

{

using (Aes aes = Aes.Create())

{

aes.Key = key;

aes.IV = iv;

using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateEncryptor(), CryptoStreamMode.Write))

{

fileStream.CopyTo(cryptoStream);

}

byte[] encryptedData = memoryStream.ToArray();

File.WriteAllBytes(filePath + ".enc", encryptedData);

}

}

}

}

private static void DecryptFile(string filePath, byte[] key, byte[] iv)

{

string encryptedFilePath = filePath + ".enc";

using (FileStream fileStream = new FileStream(encryptedFilePath, FileMode.Open, FileAccess.Read))

{

using (MemoryStream memoryStream = new MemoryStream())

{

using (Aes aes = Aes.Create())

{

aes.Key = key;

aes.IV = iv;

using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateDecryptor(), CryptoStreamMode.Write))

{

fileStream.CopyTo(cryptoStream);

}

byte[] decryptedData = memoryStream.ToArray();

File.WriteAllBytes(filePath + ".dec", decryptedData);

}

}

}

}

}

四、总结

本文详细介绍了C#内存流的基本概念、创建与基本操作,并通过三个实际应用实例,展示了内存流在图片处理、序列化与反序列化以及文件加密与解密方面的应用。掌握内存流的使用,可以让我们在开发过程中更加灵活地处理数据,尽或许缩减损耗程序的运行快速。


本文由IT视界版权所有,禁止未经同意的情况下转发

文章标签: 后端开发


热门