温故而知新之C#中的Stream篇("C# Stream深度解析:温故知新,掌握数据流处理精髓")

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

C# Stream深度解析:温故知新,掌握数据流处理精髓

一、引言

在C#编程中,Stream类是一个非常重要的概念,它为数据的读写提供了统一的接口。无论是文件、网络还是内存中的数据,都可以通过Stream类来进行操作。本文将深入探讨C#中的Stream类,帮助大家温故知新,掌握数据流处理的精髓。

二、Stream类概述

Stream类是.NET Framework中的一个抽象基类,它定义了一系列用于数据读写的方法和属性。Stream类的重点作用是提供一种机制,允许数据可以按顺序读取或写入。Stream类有以下几种常用的派生类:

  • FileStream:用于文件的读写。
  • MemoryStream:用于内存中的数据读写。
  • NetworkStream:用于网络数据的读写。

三、Stream类的核心方法

以下是Stream类中的一些核心方法:

3.1 Read方法

Read方法用于从Stream中读取数据。它的原型如下:

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

其中,buffer是用于存储读取数据的字节数组,offset是数组的起始位置,count是要读取的字节数。返回值即实际读取的字节数。

3.2 Write方法

Write方法用于向Stream中写入数据。它的原型如下:

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

其中,buffer是包含要写入数据的字节数组,offset是数组的起始位置,count是要写入的字节数。

3.3 Seek方法

Seek方法用于移动Stream的当前位置。它的原型如下:

public abstract long Seek(long offset, SeekOrigin origin);

其中,offset是移动的偏移量,origin是移动的起始位置(可以是SeekOrigin.Begin、SeekOrigin.Current或SeekOrigin.End)。

3.4 Flush方法

Flush方法用于将缓冲区中的数据写入到目标存储介质。它的原型如下:

public abstract void Flush();

四、Stream类的使用场景

以下是Stream类在一些典型场景下的应用:

4.1 文件操作

使用FileStream类进行文件的读写操作。

// 创建文件流

FileStream fileStream = new FileStream("example.txt", FileMode.OpenOrCreate);

// 写入数据

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

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

// 定位到文件开头

fileStream.Seek(0, SeekOrigin.Begin);

// 读取数据

byte[] buffer = new byte[1024];

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

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

// 关闭文件流

fileStream.Close();

4.2 内存操作

使用MemoryStream类进行内存数据的读写操作。

// 创建内存流

MemoryStream memoryStream = new MemoryStream();

// 写入数据

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

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

// 定位到内存流开头

memoryStream.Seek(0, SeekOrigin.Begin);

// 读取数据

byte[] buffer = new byte[1024];

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

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

// 关闭内存流

memoryStream.Close();

4.3 网络操作

使用NetworkStream类进行网络数据的读写操作。

// 创建网络流

TcpClient client = new TcpClient("127.0.0.1", 12345);

NetworkStream networkStream = client.GetStream();

// 写入数据

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

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

// 读取数据

byte[] buffer = new byte[1024];

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

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

// 关闭网络流

networkStream.Close();

client.Close();

五、Stream类的进阶应用

除了基本的读写操作外,Stream类还有一些进阶应用,如下:

5.1 数据压缩和解压缩

使用GZipStream类进行数据的压缩和解压缩。

// 创建压缩流

FileStream fileStream = new FileStream("example.txt", FileMode.OpenOrCreate);

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

// 写入数据

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

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

// 关闭压缩流

gzipStream.Close();

fileStream.Close();

// 创建解压缩流

fileStream = new FileStream("example.txt.gz", FileMode.Open);

gzipStream = new GZipStream(fileStream, CompressionMode.Decompress);

// 读取数据

buffer = new byte[1024];

bytesRead = gzipStream.Read(buffer, 0, buffer.Length);

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

// 关闭解压缩流

gzipStream.Close();

fileStream.Close();

5.2 数据加密和解密

使用CryptoStream类进行数据的加密和解密。

// 创建加密流

FileStream fileStream = new FileStream("example.txt", FileMode.OpenOrCreate);

Aes aes = Aes.Create();

ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);

CryptoStream cryptoStream = new CryptoStream(fileStream, encryptor, CryptoStreamMode.Write);

// 写入数据

data = Encoding.UTF8.GetBytes("Hello, World!");

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

// 关闭加密流

cryptoStream.Close();

fileStream.Close();

// 创建解密流

fileStream = new FileStream("example.txt", FileMode.Open);

ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);

cryptoStream = new CryptoStream(fileStream, decryptor, CryptoStreamMode.Read);

// 读取数据

buffer = new byte[1024];

bytesRead = cryptoStream.Read(buffer, 0, buffer.Length);

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

// 关闭解密流

cryptoStream.Close();

fileStream.Close();

六、总结

Stream类在C#编程中扮演着非常重要的角色,它为数据的读写提供了统一的接口。通过掌握Stream类及其派生类的使用,我们可以轻松地实现文件、内存和网络中的数据操作。期待本文能够帮助大家温故知新,更好地懂得和运用Stream类。


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

文章标签: 后端开发


热门