【.NET Core】.NET中的流(Stream)

【.NET Core】.NET中的流(Stream)

文章目录

  • 【.NET Core】.NET中的流(Stream)
    • 一、流(Stream)
      • 1.1 FileStream类
      • 1.2 IsolatedStorageFileStream类
      • 1.3 MemoryStream类
      • 1.4 BufferedStream类
      • 1.5 NetworkStream类
        • NetworkStream使用步骤
        • NetworkStream示例
      • 1.6 pipeStream类
      • 1.7 CryptoStream类
        • CrytoStream的加密方法
        • CrytoStream的解密方法

一、流(Stream)

C#中文件和流I/O(输入/输出)是指在存储媒介中传入或传出数据。在.NET中,System.IO命名空间包含允许以异步方式和同步方式对数据流和文件进行读取和写入操作的类型。这些命名空间还包含对文件执行压缩和解压缩的类型,以及通过管道和串端口启用通信的类型。

抽象基类Steam支持读取和写入字节。所有表示流的类都继承基类Stream类。Stream类及其派生类提供数据源和存储库的常见视图,使程序员不必了解操作系统和基础设备的具体细节。
在这里插入图片描述

流(Stream)System.IO.Stream是一个抽象类,提供了将字节,提供了将字节(读,写等)传输到源的标准方法。就像包装器类一样传输字节。需要从特定源读取/写入字节的类必须实现Stream类。

根据Stream类图,以提供从特定源读取/写入字节的功能:

1.1 FileStream类

用于对文件进行读取和写入操作。

1.2 IsolatedStorageFileStream类

用于对独立存储中的文件进行读取或写入操作。IsolatedStroageFileStreaml是由FileStream扩展来。在使用完类型后,直接或间接释放类型。若要直接释放,请使用 try/cath块中调用其Dispose方法。若要间接释放类型,使用using

IsolatedStorageFile isoFile =IsolatedStorageFile.GetStore(IsolatedStorageScope.User |IsolatedStorageScope.Assembly |IsolatedStorageScope.Domain,null,null);
IsolatedStorageFileStream isoStream =new IsolatedStorageFileStream("substituteUsername",System.IO.FileMode.Open,System.IO.FileAccess.Read,System.IO.FileShare.Read);
try
{SafeFileHandle aFileHandle = isoStream.SafeFileHandle;Console.WriteLine("A pointer to a file handle has been obtained. "+ aFileHandle.ToString() + " "+ aFileHandle.GetHashCode());
}
catch (Exception e)
{Console.WriteLine("Expected exception");Console.WriteLine(e);
}

1.3 MemoryStream类

用于作为后备存储对内存进行读取和写入操作。MemoryStream是内存流,为系统内存提供读写操作,由于MemoryStream是通过无符号字节数组组成,可以说MenoryStream的性能比较出色,所以它担当起了一些其他进行数据交换时的中间工作,同时可降低应用程序中对临时缓冲区和临时文件的需要,其实MemoryStream的重要性不亚FileStream,很多场合我们必须使用它来提高性能。

/// <summary>
/// 数据类对象转成字节流
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
/// MemoryStream: 创建其支持存储区为内存的流。
///IFormatter : 提供将序列化对象格式化的功能。
public static byte[] ObjectToBytes(object obj)
{using (MemoryStream ms = new MemoryStream()){//以二进制格式将对象或整个连接对象图形序列化和反序列化。IFormatter formatter = new BinaryFormatter();//把字符串以二进制放进memStream中formatter.Serialize(ms, obj);//返回从其创建此流的无符号字节数组。 是会返回所有分配的字节,不管用没用到。//返回无符号字节数组 ,无符号字节数组 其实就是byte(0~255),有符号字节sbyte(-128~127)return ms.GetBuffer();}
}/// <summary>
/// 字节流转成数据类对象
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
public static object BytesToObject(byte[] bytes)
{using (MemoryStream ms = new MemoryStream(bytes)){ //以二进制格式将对象或整个连接对象图形序列化和反序列化。IFormatter formatter = new BinaryFormatter();//把字符串以二进制放进memStream中return formatter.Deserialize(ms);}
}

1.4 BufferedStream类

BufferedStream常用于对其他流的一个封装,它必须和其他流结合一起使用。MemoryStream将所有的内容都放入内存中,而BufferedStream不是。BufferedStream在基础流吸入内存中能够提高读取与写入速度。但是缓冲区设置的大小对性能也有影响,默认值是4096字节,并能够根据需要自动增长,并且很多属性都与基础流一致,缓冲数据能够减少对操作系统的调用次数,缓冲数据主要存储在缓冲区中,缓冲区是内存中的字节块。BufferedStream类提供从基础数据源或存储库读取字节以及将字节写入基础数据源或存储库的实现,在不需要缓冲区时可以防止缓冲区降级输入和输出速度。

缓冲类型下,会在后台自动下载定长的内容,读的时候是从缓冲区中拿东西。这种模式最大的特点是半阻塞式,大部分情况下能大幅度提高处理速度。

在程序逻辑速度大大慢于IO速度时,此方法效率明显。最好是在大文件的情况下,分块读,分块写。

示例:

private static void Buf(string oPath, string copyPath)
{Stream s1, s2;BufferedStream bs1, bs2;byte[] b = new byte[1024];int i;//分别以读、写方式打开两个文件s1 = File.OpenRead(oPath);s2 = File.OpenWrite(copyPath);//使用缓冲流bs1 = new BufferedStream(s1);bs2 = new BufferedStream(s2);i = bs1.Read(b,0,1024);//从文件1中读取,写入到文件2中while (i > 0){bs2.Write(b,0,i);i = bs1.Read(b,0,1024);}bs2.Flush();s1.Close();bs2.Close();}

1.5 NetworkStream类

NetworkStream类主要是提供用于网络访问的基础数据流,它主要是网络数据传输的载体,并提供同步,异步方法来访问网络数据流。虽然NetworkStream类有构造函数,但在实际情况中更多是通过TcpClient实例的GetStream方法来初始化NetworkStream实例。

NetworkStream使用步骤
  1. 在tcp连接中,Networkstream可以重复读取,重复写入,不用关掉连接。
  2. 关掉NetworkStream会自动关闭掉Tcp连接。
  3. NetworkStream不需要使用Flush方法,数据会自动发送。
  4. NetworkStream.read会阻塞线程直到有新的数据过来,所以,发送端不释放,接收端不能接收到数据。接收前先判断 DataAvailable 没有数据的不进行Read就能实时收到数据了。
  5. 如果发送端发送快,接收端接收慢,会造成数据堆叠,即接收端一次可能接收到发送端多次发送的数据流,可以在接收端返回确认接收完成后,再让发送端发送新数据。
NetworkStream示例
if(stream.DataAvailable)
{int receiveByteCount=0;//当前已接收数据量var headerByte = new byte[8];await stream.ReadAsync(headerByte,0,8);//数据前8位为真实文件长度long pictureByteLength = BitConverter.ToInt64(headerByte,0);//实际文件大小var buffer = new byte[1024];System.IO.MemoryStream ms = new System.IO.MemoryStream();int tempCount =0;do{tempCount = await stream.ReadAsync(buffer,0,buffer.Length);await ms.WriteAsync(buffer,0,tempCount);receiveByteCount+=tempCount;}while(recevieByteCount<pictureByteLength);//直到整个文件接收完成
}

1.6 pipeStream类

管道(pipeStream)是一种特殊的流,它可以用于在不同的线程之间传送数据。一个线程将数据输出到管道中,另一个线程从管道中读取需要的数据,实现不同线程之间的通信而无需通过临时文件。管道通信可以达到解耦的目的,产生数据的线程不需要直接调用处理数据的方法并等待返回结果,只需要将数据放入管道,接着继续执行自己的任务;而处理数据的线程直接从管道中拿出数据进行处理,不需要进行轮询来获取数据。
pipeStream使用步骤

  1. 创建 Pipe:创建一个缓冲区,用于读取和写入数据。
  2. 写入数据:使用 PipelineWriter 将数据写入缓冲区。
  3. 读取数据并处理:使用 PipelineReader 读取缓冲区中的数据,并进行处理。

pipeStream示例

public static async Task Main(string[] args)
{var data = new byte[] { 1, 2, 3, 4, 5 };// 创建缓冲区var pipe = new Pipe();// 写入数据到缓冲区await pipe.Writer.WriteAsync(data);// 读取数据并处理while (true){var result = await pipe.Reader.ReadAsync();var buffer = result.Buffer;try{if (buffer.IsEmpty && result.IsCompleted){break;}// 处理数据foreach (var segment in buffer){Console.WriteLine(segment.Span[0]);}}finally{// 将已处理的数据从缓冲区中删除pipe.Reader.AdvanceTo(buffer.End);}}
}

1.7 CryptoStream类

公共语言运行时使用面向流的设计进行加密。 此设计的核心是CryptoStream。 任何加密对象实现CryptoStream可以链接在一起实现的任何对象Stream,因此,一个对象的流式处理的输出可以将其填充到另一个对象的输入。 中间结果 (从第一个对象的输出) 不需要进行单独存储。
应始终显式关闭你CryptoStream对象完成后使用它通过调用Clear方法。 执行此操作刷新基础流并使所有剩余的数据块由处理CryptoStream对象。 但是,如果在调用之前,会发生异常Close方法,CryptoStream对象可能不会关闭。 若要确保Close始终调用方法,将置于调用Clear方法内的finally块try / catch语句。

CrytoStream的加密方法
public static string ToEncrypt(string encryptKey, string str)
{byte[] byte_key = Encoding.Unicode.GetBytes(encryptKey);    //将密钥字符串转换为字节序列byte[] byte_data = Encoding.Unicode.GetBytes(str);          //将字符串转换为字节序列     using var des = DES.Create();                               //创建加密流对象using var memory_stream = new MemoryStream();               //创建内存流对象using var crypto_stream = new CryptoStream(memory_stream, des.CreateEncryptor(byte_key, byte_key), CryptoStreamMode.Write); //创建加密流对象crypto_stream.Write(byte_data, 0, byte_data.Length);        //向加密流中写入字节序列crypto_stream.FlushFinalBlock();                            //将数据压入基础流crypto_stream.Close();                                      //关闭加密流memory_stream.Close();                                      //关闭内存流return Convert.ToBase64String(memory_stream.ToArray());     //从内存流中获取并返回加密后的字符串
}
CrytoStream的解密方法
public static string ToDecrypt(string encryptKey, string str)
{byte[] byte_key = Encoding.Unicode.GetBytes(encryptKey); //将密钥字符串转换为字节序列byte[] byte_data = Convert.FromBase64String(str); //将加密后的字符串转换为字节序列using var des = DES.Create();//创建加密流对象using var memory_stream = new MemoryStream(byte_data);//创建内存流对象并写入数据using var crypto_stream = new CryptoStream(memory_stream, des.CreateDecryptor(byte_key, byte_key), CryptoStreamMode.Read);  //创建加密流对象byte[] bt_temp = new byte[200];//创建字节序列对象MemoryStream memory_stream_temp = new();//创建内存流对象int i = 0;//创建记数器while ((i = crypto_stream.Read(bt_temp, 0, bt_temp.Length)) > 0)  //使用while循环得到解密数据{memory_stream_temp.Write(bt_temp, 0, i);//将解密后的数据放入内存流}crypto_stream.Close(); //关闭加密流memory_stream.Close(); //关闭内存流return Encoding.Unicode.GetString(memory_stream_temp.ToArray());    //方法返回解密后的字符串
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/718433.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌浏览器打开,图片糊了

现象&#xff08;问题&#xff09;&#xff1a;早上开机&#xff0c;打开谷歌浏览器发现里面的所有图片相关的都糊了&#xff0c;离谱&#xff01; 查阅一番资料后发现&#xff1a; 谷歌浏览器的硬件加速模式被打开了 解决&#xff1a; 打开谷歌浏览器->设置->系统->…

【C++从练气到飞升】01---C++入门

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书。 目录 推荐 前言 什么是C C的发展史 &#x1f4cb;命名空间 命名空间定义 命名空间使用 命名空间的嵌套 std命名空间的使用 &#…

编译 qsqlmysql.dll QMYSQL driver not loaded

Qt 连接MySQL数据库&#xff0c;没有匹配的qsqlmysql.dll, 需要我们跟进自己Mysql 以及QT版本自行编译的。异常如下图&#xff1a; 安装环境为 VS2019 Qt5.12.12&#xff08;msvc2017_64、以及源码&#xff09; 我的安装地址&#xff1a;D:\Qt\Qt5.12.12 Mysql 8.1.0 默认安…

2023年下半年教师资格证考试《教育知识与能力》(中学)题

3.李老师在初二选择了人数、性别比例、学习成绩、教材各方面情况相同的两个班进行教学&#xff0c;对其中一班采用讲授法&#xff0c;对另一个班采用自学辅导法&#xff0c;经过一个阶段的教学后进行测验&#xff0c;以比较两种方法教学效果&#xff0c;李老师采用的方法属于&a…

基于yolov5的飞机蒙皮缺陷检测系统,可进行图像目标检测,也可进行视屏和摄像检测(pytorch框架)【python源码+UI界面+功能源码详解】

功能演示&#xff1a; 基于yolov5的飞机蒙皮缺陷检测系统&#xff0c;系统既能够实现图像检测&#xff0c;也可以进行视屏和摄像实时检测_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov5的飞机蒙皮缺陷检测系统是在pytorch框架下实现的&#xff0c;这是一个完…

js【详解】自动类型转换

运算符 Symbol 数字 会报错 Cannot convert a Symbol value to a number Symbol 字符串 会报错 Cannot convert a Symbol value to a string 存在对象&#xff0c;数组&#xff0c;函数时 对象&#xff0c;数组&#xff0c;函数会先执行其 toString() 方法&#xff0c;…

用CSS实现一个扇形

用CSS实现扇形的思路和三角形基本一致&#xff0c;就是多了一个圆角的样式&#xff0c;实现一个90的扇形&#xff1a; div{border: 100px solid transparent;width: 0;heigt: 0;border-radius: 100px;border-top-color: red; }

【c++】list模拟实现

list的接口 #pragma once #include<iostream> #include<assert.h> using namespace std; namespace zjw {template<class T>struct listnode {listnode* <T>_next;listnode* <T>_prev;T _data;listnode(const T& x T()):_prev(nulllptr…

高维中介数据: 联合显着性(JS)检验法

摘要 中介分析在流行病学和临床试验中越来越受到关注。在现有的中介分析方法中&#xff0c;流行的联合显着性&#xff08;JS&#xff09;检验会产生过于保守的 I 类错误率&#xff0c;因此功效较低。但是&#xff0c;如果在使用 JS 测试高维中介假设时&#xff0c;可以准确控制…

人力资源(E-HR)应用架构的设计与实践

当谈到人力资源管理时&#xff0c;电子人力资源&#xff08;E-HR&#xff09;系统已经成为现代企业不可或缺的组成部分。E-HR系统的设计与实践对于提高组织的人力资源管理效率和员工体验至关重要。本文将探讨E-HR应用架构的设计与实践&#xff0c;以及如何借助信息技术优化人力…

怎么使用Pyecharts库对淘宝数据进行可视化展示

目录 一、准备工作 二、数据预处理 三、使用Pyecharts进行可视化展示 柱状图展示销量和评价数 散点图展示价格与销量关系 词云图展示商品标题关键词 四、总结与建议 在当今的大数据时代&#xff0c;数据可视化已经成为了一个非常重要的技能。Pyecharts是一个基于Python的…

C++ //练习 10.24 给定一个string,使用bind和check_size在一个int的vector中查找第一个大于string长度的值。

C Primer&#xff08;第5版&#xff09; 练习 10.24 练习 10.24 给定一个string&#xff0c;使用bind和check_size在一个int的vector中查找第一个大于string长度的值。。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /*****…

Altium Designer 22焊接辅助工具 Interactivehtmlbom 插件使用教程

目录 AD22 由Interactivehtmlbom 插件生成的焊接辅助图&#xff0c;交互方式很多&#xff0c;十分方便的为我们提供便利。 介绍安装教程&#xff1a; 前去这个网站 Interactivehtmlbom 插件&#xff0c;单击下载zip 下载完成后找个地方解压&#xff0c;双击Initablelize.bat文…

河道水库雨水情自动测报系统

随着科学技术的不断进步&#xff0c;以及城市化进程的影响&#xff0c;水库的管理变得更加复杂&#xff0c;要实现城市水库的精细化管理&#xff0c;必须借助先进的信息技术手段为支撑&#xff0c;实现对三防、水资源、供水安全的实时监控&#xff0c;优化管理模式和创新管理手…

Matlab 机器人工具箱 例程:运动学+动力学+路径规划+可视化

文章目录 1 创建机器人2 机器人显示3 机器人示教4 机器人路径规划&#xff1a;给定关节角路径5 机器人路径规划&#xff1a;给定末端位姿&#xff0c;求关节角路径6 工作空间可视化参考链接 1 创建机器人 clc;clear;close all; deg pi/180;L1 Revolute(d, 0, a, 0, alpha, 0,…

【Python】快速入门Python一天学完基础语法

文章目录 前言1. HelloWorld2. 变量与数据类型2.1 变量2.2 数据类型2.2.1 String 字符串类型2.2.2 基本类型转换2.2.2 元组2.2.3 字典2.2.4 拆包 2.3 运算2.3.1 双除号/双乘号2.3.2 常见运算函数举例2.3.3 布尔运算 3. 控制流程3.1 if-else 语句3.2 while 循环3.3 for 循环 4. …

逆变器专题(14)-弱电网下的LCL逆变器控制以及谐振峰问题(1)

相应仿真原件请移步资源下载 LCL滤波器 LCL滤波器因其本身为一个二阶系统&#xff0c;其本身就会引发谐振&#xff0c;导致相应谐振频率处的增益得到放大&#xff0c;进而产生谐波等问题&#xff1b;另一方面&#xff0c;在弱电网下&#xff0c;逆变器会与电网阻抗发生耦合&am…

ARM总结and复习

安装交叉编译工具链 a. 为什么安装 因为arm公司的指令集在不断迭代升级&#xff0c;指令集日益增多,而架构是基于指令集研发的&#xff0c;所以架构不一样&#xff0c;指令集也不一样 eg:arm架构使用的是arm指令集 x86架构使用的是x86指令集 而我们日常开发环境中linux的架构…

重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?

大家好我是苏麟 , 今天开始又一个专栏开始了(又一个坑 哈哈) . 重载&#xff08;Overload&#xff09;和重写&#xff08;Override&#xff09;的区别。重载的方法能否根据返回类型进行区分&#xff1f; 方法的重载和重写都是实现多态的方式&#xff0c;区别在于前者实现的是编…

Java进阶-测试方法

来学习一下软件测试相关的方法&#xff0c;了解一下黑盒测试和白盒测试&#xff0c;以及后面要用到的JUnit单元测试。JUnit单元测试也属于白盒测试&#xff0c;这次内容较少且相对简单。 一、软件测试方法 1、黑盒测试 不需要写代码&#xff0c;给输入值&#xff0c;看程序…