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