当前位置: 首页 > news >正文

.Net中的流处理类总结 Stream/FileStream/MemoryStream/NetworkStream/StreamReader

目录

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。

 

相关文章:

  • 04-深入解析 Spring 事务管理原理及源码
  • YOLOv5配置训练以及华为昇腾910B推理
  • JavaScript数组Array的使用:添加、删除、排序、遍历、互转
  • 【python中级】使用 distutils 和wheel生成whl 轮子文件
  • 蓝桥杯 切割
  • 深入探究Spring MVC
  • C++学习day4
  • 基于大数据分析的门户信息推荐系统
  • 《STL 六大组件之容器篇:简单了解 list》
  • 国家天文台携手阿里云,发布国际首个太阳大模型“金乌”
  • 用Python实现TCP代理
  • Java数据类型与数据库类型映射技术文档
  • 基础框架系列分享:一个通用的Excel报表生成管理框架
  • MQTT 服务器(emqx)搭建及使用(一)
  • [图论]拓扑排序
  • 【JavaEE】MyBatis - Plus
  • deepseek v3-0324 化学键线式Canvas编辑器设计
  • 线程池自顶向下
  • 关于 @Autowired 和 @Value 使用 private 字段的警告问题分析与解决方案
  • # C++初阶——内存管理
  • 拟定一个物流网站的建设方案/画质优化app下载
  • 南通做网站优化哪家好/中文网站排名
  • 国产地图软件哪个好用/苏州seo网站公司
  • 网站建设过程规划和准备阶段/怎样推广网站
  • 外贸手表网站模板/东莞做网站哪家公司好
  • 外贸独立站是什么意思/东莞seo建站优化工具