目录
1. Stream 类
2. MemoryStream 类
3. FileStream 类
4. StreamReader 和 StreamWriter 类
5. NetworkStream 类
6. CryptoStream 类
总结
流(Stream)是处理数据输入和输出的核心抽象。流表示一个字节序列的读取或写入操作,它是一种通用的方式来处理各种数据源和目标,例如内存、文件、网络等。.NET 提供了多种流类来满足不同的需求,以下是常见的流处理类及其用法:
1. Stream 类
- 概述:Stream 是所有流类的基类,它是一个抽象类,定义了流的基本操作,如读取、写入、定位等。
- 常用方法:
- Read(byte[] buffer, int offset, int count):从流中读取字节到缓冲区。
- Write(byte[] buffer, int offset, int count):将字节从缓冲区写入流。
- Seek(long offset, SeekOrigin origin):设置流中的当前位置。
- Flush():清除缓冲区并确保所有数据写入底层设备。
- Close():关闭流并释放资源。
- 注意:Stream 是抽象类,不能直接实例化,需要使用其派生类。
2. MemoryStream 类
- 概述:MemoryStream 表示存储在内存中的流。它允许将数据以字节数组的形式存储,并提供对这些数据的快速访问。
- 典型用途:
- 在内存中临时存储数据。
- 将对象序列化为字节数组或将字节数组反序列化为对象。
- 与其他流类结合使用,作为中间缓存。
- 示例代码:
using System;
using System.IO;class Program
{static void Main(){byte[] data = { 72, 101, 108, 108, 111 }; // "Hello" 的 ASCII 字节using (MemoryStream ms = new MemoryStream()){ms.Write(data, 0, data.Length); // 写入数据ms.Position = 0; // 重置位置以便读取byte[] buffer = new byte[ms.Length];ms.Read(buffer, 0, buffer.Length); // 读取数据Console.WriteLine(System.Text.Encoding.UTF8.GetString(buffer)); // 输出: Hello}}
}
3. FileStream 类
- 概述:FileStream 用于对文件进行读写操作。它允许将数据直接与磁盘上的文件交互。
- 典型用途:
- 读取和写入文件内容。
- 处理大文件时分块读取或写入。
- 示例代码:
using System;
using System.IO;class Program
{static void Main(){string filePath = "example.txt";using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write)){byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello, FileStream!");fs.Write(data, 0, data.Length); // 写入数据到文件}using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)){byte[] buffer = new byte[fs.Length];fs.Read(buffer, 0, buffer.Length); // 从文件读取数据Console.WriteLine(System.Text.Encoding.UTF8.GetString(buffer)); // 输出: Hello, FileStream!}}
}
4. StreamReader 和 StreamWriter 类
- 概述:StreamReader 和 StreamWriter 是基于字符的流类,专门用于处理文本数据。
- StreamReader:从流中读取字符数据。
- StreamWriter:将字符数据写入流。
- 典型用途:
- 读取或写入文本文件。
- 处理编码问题(如 UTF-8、ASCII 等)。
- 示例代码:
using System;
using System.IO;class Program
{static void Main(){string filePath = "example.txt";// 写入文本using (StreamWriter writer = new StreamWriter(filePath)){writer.WriteLine("Hello, StreamReader/StreamWriter!");}// 读取文本using (StreamReader reader = new StreamReader(filePath)){string content = reader.ReadToEnd();Console.WriteLine(content); // 输出: Hello, StreamReader/StreamWriter!}}
}
5. NetworkStream 类
- 概述:NetworkStream 用于通过网络套接字(Socket)进行数据传输。它是 System.Net.Sockets 命名空间的一部分。
- 典型用途:
- 实现客户端和服务器之间的数据通信。
- 处理 TCP/IP 协议的数据流。
- 示例代码(服务器端):
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;class Program
{static void Main(){TcpListener listener = new TcpListener(IPAddress.Any, 12345);listener.Start();Console.WriteLine("Waiting for connection...");using (TcpClient client = listener.AcceptTcpClient())using (NetworkStream stream = client.GetStream()){byte[] buffer = new byte[1024];int bytesRead = stream.Read(buffer, 0, buffer.Length);string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);Console.WriteLine("Received: " + message);byte[] response = Encoding.UTF8.GetBytes("Message received!");stream.Write(response, 0, response.Length);}listener.Stop();}
}
6. CryptoStream 类
- 概述:CryptoStream 用于加密或解密数据流。它结合了流操作和加密算法。
- 典型用途:
- 对敏感数据进行加密后存储或传输。
- 解密加密的数据流。
- 依赖库:System.Security.Cryptography。
- 示例代码(简单加密):
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;class Program
{static void Main(){using (Aes aes = Aes.Create()){byte[] key = aes.Key;byte[] iv = aes.IV;string original = "Secret Message";byte[] encrypted;using (MemoryStream msEncrypt = new MemoryStream()){using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, aes.CreateEncryptor(key, iv), CryptoStreamMode.Write))using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)){swEncrypt.Write(original);}encrypted = msEncrypt.ToArray();}Console.WriteLine("Encrypted: " + Convert.ToBase64String(encrypted));}}
}
总结
.NET 中的流处理类提供了灵活且强大的工具来处理各种数据源和目标。根据具体需求选择合适的流类,可以显著提高开发效率和程序性能。以下是一些选择建议:
- 如果需要处理内存中的数据,使用 MemoryStream。
- 如果需要读写文件,使用 FileStream。
- 如果需要处理文本数据,使用 StreamReader 和 StreamWriter。
- 如果需要网络通信,使用 NetworkStream。
- 如果需要加密或解密数据,使用 CryptoStream。