C#流模型详细分析(C#流模型深入解析与实战应用)

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

C#流模型详细分析 - C#流模型深入解析与实战应用

一、引言

在C#中,流(Stream)是一个抽象的概念,用于即数据的流动。流模型为数据的读写提供了统一的接口,让我们能够以统一的对策处理不同的数据源,如文件、网络、内存等。本文将详细介绍C#流模型的概念、原理以及实战应用,帮助读者深入领会并掌握流的使用。

二、C#流模型概述

在.NET Framework中,流模型核心依赖性于System.IO命名空间下的Stream类及其派生类。Stream类是一个抽象基类,提供了读写数据的基本方法,如Read、Write和Flush等。Stream类的派生类包括FileStream、MemoryStream、NetworkStream等,分别用于处理文件、内存和网络的流操作。

三、Stream类核心方法

下面我们来分析一下Stream类中的核心方法。

1. Read方法

Read方法用于从流中读取数据。它有三个参数:buffer(字节数组),offset(数组中的起始位置),count(要读取的字节数)。该方法返回实际读取的字节数。

public abstract int Read(byte[] buffer, int offset, int count);

2. Write方法

Write方法用于向流中写入数据。它也有三个参数:buffer(字节数组),offset(数组中的起始位置),count(要写入的字节数)。

public abstract void Write(byte[] buffer, int offset, int count);

3. Flush方法

Flush方法用于将缓冲区中的数据写入到基础数据源中,并清空缓冲区。

public abstract void Flush();

四、Stream派生类实战应用

接下来,我们将通过几个实例来了解不同Stream派生类的实际应用。

1. FileStream

FileStream类用于处理文件流操作。以下是一个明了的示例,演示怎样使用FileStream类读取和写入文件。

using System;

using System.IO;

class Program

{

static void Main()

{

string filePath = @"C:\example.txt";

// 创建文件流,以读写模式打开文件

using (FileStream fileStream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite))

{

// 写入数据

byte[] data = new byte[] { 0, 1, 2, 3, 4, 5 };

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

// 定位到文件开头

fileStream.Seek(0, SeekOrigin.Begin);

// 读取数据

byte[] readData = new byte[6];

int bytesRead = fileStream.Read(readData, 0, readData.Length);

// 输出读取的数据

Console.WriteLine("Read data:");

foreach (byte b in readData)

{

Console.WriteLine(b);

}

}

}

}

2. MemoryStream

MemoryStream类用于处理内存流操作。以下是一个示例,演示怎样使用MemoryStream类在内存中读写数据。

using System;

using System.IO;

class Program

{

static void Main()

{

// 创建内存流

using (MemoryStream memoryStream = new MemoryStream())

{

// 写入数据

byte[] data = new byte[] { 0, 1, 2, 3, 4, 5 };

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

// 定位到内存流开头

memoryStream.Seek(0, SeekOrigin.Begin);

// 读取数据

byte[] readData = memoryStream.ToArray();

// 输出读取的数据

Console.WriteLine("Read data:");

foreach (byte b in readData)

{

Console.WriteLine(b);

}

}

}

}

3. NetworkStream

NetworkStream类用于处理网络流操作。以下是一个示例,演示怎样使用NetworkStream类在网络中发送和接收数据。

using System;

using System.Net;

using System.Net.Sockets;

using System.Text;

class Program

{

static void Main()

{

// 创建TCP客户端

using (TcpClient client = new TcpClient())

{

// 连接到服务器

client.Connect(new IPEndPoint(IPAddress.Loopback, 12345));

// 获取网络流

using (NetworkStream networkStream = client.GetStream())

{

// 发送数据

string message = "Hello, World!";

byte[] data = Encoding.UTF8.GetBytes(message);

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

// 接收数据

byte[] buffer = new byte[1024];

int bytesRead = networkStream.Read(buffer, 0, buffer.Length);

string receivedMessage = Encoding.UTF8.GetString(buffer, 0, bytesRead);

// 输出接收的数据

Console.WriteLine("Received message: " + receivedMessage);

}

}

}

}

五、流的高级应用

除了基本的读写操作,C#流模型还赞成许多高级应用,如数据压缩、加密、序列化等。以下是一些高级应用的简要介绍。

1. 数据压缩

在.NET中,可以使用System.IO.Compression命名空间下的GZipStream和DeflateStream类来实现数据压缩。以下是一个使用GZipStream压缩数据的示例。

using System;

using System.IO;

using System.IO.Compression;

class Program

{

static void Main()

{

string inputFilePath = @"C:\input.txt";

string outputFilePath = @"C:\output.gz";

// 读取原始数据

byte[] originalData = File.ReadAllBytes(inputFilePath);

// 创建压缩流

using (FileStream fileStream = File.Create(outputFilePath))

using (GZipStream gzipStream = new GZipStream(fileStream, CompressionMode.Compress))

{

// 将原始数据写入压缩流

gzipStream.Write(originalData, 0, originalData.Length);

}

}

}

2. 数据加密

在.NET中,可以使用System.Security.Cryptography命名空间下的AesManaged类来实现数据加密。以下是一个使用AES加密数据的示例。

using System;

using System.IO;

using System.Security.Cryptography;

class Program

{

static void Main()

{

string inputFilePath = @"C:\input.txt";

string outputFilePath = @"C:\output.enc";

// 读取原始数据

byte[] originalData = File.ReadAllBytes(inputFilePath);

// 创建AES加密器

using (Aes aesAlg = Aes.Create())

{

aesAlg.Key = Encoding.UTF8.GetBytes("your-256-bit-key");

aesAlg.IV = new byte[16]; // 初始化向量

// 创建加密流

using (FileStream fileStream = File.Create(outputFilePath))

using (CryptoStream cryptoStream = new CryptoStream(fileStream, aesAlg.CreateEncryptor(), CryptoStreamMode.Write))

{

// 将原始数据写入加密流

cryptoStream.Write(originalData, 0, originalData.Length);

}

}

}

}

六、总结

C#流模型是.NET Framework中处理数据读写的重要机制。通过领会流的概念、原理以及不同Stream派生类的应用,我们可以更加灵活地处理各种数据源。在实际开发中,掌握流的高级应用,如数据压缩和加密,将使我们的程序更加健壮安宁安。


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

文章标签: 后端开发


热门