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

10.5 流

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

简单理解流像是一页纸张,根据需要写入的内容这页纸可以很大,也可以很小,可以向纸张上面写入(Write)内容(通常是字节形式的数据),写入的位置(Position)随写入内容而增加相应数量;同时也可以从纸上已有内容的某个位置读取(Read)已经写入的内容,读取的位置(Position)也随读取内容而增加相应数量。已经有的内容是不能裁剪掉的,但是可以从已经写入内容的某个位置(Position)开始,用新的内容覆盖原有内容。

10.5.1 Stream(数据流)类

Stream类是C#中数据读取最基本的概念,是所有流的抽象基类。它包含了三类基本操作:

1、读取:从流到数据结构(如字节数组)的数据传输。

2、写入:从数据源到流的数据传输。

3、查找:对流内的当前位置进行的查询和修改。

根据基础数据源或储存库,流可能只支持这些功能中的一部分。例如:NetworkStream不支持查找。

Stream常用属性:

  1. CanRead:只读属性,当前流是否可读取。
  2. CanSeek:只读属性,当前流是否支持查找功能的值。
  3. CanTimeout:只读属性,当前流是否可以超时,这个属性总是返回False。
  4. CanWrite:只读属性,当前流是否可写入。
  5. Length:只读属性,流长度(字节)。
  6. Position:当前流中读写的位置。
  7. ReadTimeout:确定流在超时前尝试读取多长时间(毫秒)。
  8. WriteTimeout:确定流在超时前尝试写入多长时间(毫秒)。

一般而言,并不是所有的流都支持读、写、定位操作,读写文件时候都应该检查是否可读(CanRead)、可写(CanWrite)、可设置流当前位置(CanSeek)。

当CanRead为False时,不能使用Read及相关方法;当CanWrite为False时,不能使用Write及相关方法;当CanSeek为False时,不能使用Seek方法。

如果向只读的数据流写入数据,或者读取只写的数据流,都会引发系统错误。

Stream常用方法:

  1. BeginRead :开始异步读操作。
  2. BeginWrite :开始异步写操作。
  3. EndRead :等待挂起的异步读取完成。
  4. EndWrite :结束异步写操作。
  5. Flush :将清除该流的所有缓冲区,并使得所有缓冲数据被写入到基础设备。
  6. Read :从当前流读取字节序列,并将此流中的位置提升读取的字节数。
  7. Write :向当前流中写入字节序列,并将此流中的当前位置提升写入的字节数。
  8. ReadByte :从流中读取一个字节,并将流内的位置向前推进一个字节,如果已到达流的末尾,则返回 -1。
  9. WriteByte :将一个字节写入流内的当前位置,并将流内的位置向前推进一个字节。
  10. CopyTo:从当前流中读取字节并将其写入到另一流中。
  11. Seek :设置当前流中数据指针的位置,程序将根据指针位置进行读写操作。
  12. Close :关闭当前流并释放与之关联的所有资源(如套接字和文件句柄),打开或创建了文件必须Close方法。
10.5.1.1 Stream类的子类

Stream类有如下几个常见子类:

  1. FileStream:文件流,读写文件里面的数据。
  2. MemoryStream:内存流,读写内存里的数据
  3. NetworkStream:网络流,读写网络传输数据。
  4. CryptoStream:加密流,用于数据的加密与解密。
  5. GzipStream和DeflateStream:压缩流,用于数据的压缩与解压缩。

流在实际使用时候,应使用它的具体相关的子类。

10.5.1.2 同步和异步

从.NET Framework 4.5开始, C#在Stream的子类中提供新的异步方法,包括 ReadAsync,WriteAsync, CopyToAsync,和FlushAsync,新的异步方法将逐渐取代BeginRead和BeginWrite。这些方法使您可以执行占用大量资源的 I/O 操作而不会阻塞主线程。在程序中一个耗时的流操作可能阻塞UI线程并让应用看起来好像卡死,因此这个时候就可以考虑使用异步。

同步:指的是在一个操作完成之前,接下来的操作必须等待上一个操作结束,才能继续。

异步:指的是主线程可以继续进行其他工作,稍后,用户将能够处理数据。

具体的异步读写文件操作请参看第10.6.1.3节。

10.5.2 FileStream(文件流)类

FileStream类为文件读写操作提供流,继承于Stream类。

FileStream常用属性:

  1. IsAsync 获取一个值,该值指示 FileStream 是异步还是同步打开的。

FileStream常用构造函数:

  1. FileStream(String, FileMode, FileAccess):使用指定的文件路径、创建模式和读写权限初始化FileStream类的新实例。

第一个参数是指定的文件的路径。

第二个参数是一个FileMode枚举,指定了打开文件的方式,包括以下成员:

  1. Append:文件存在,则打开文件并将读写位置放置到文件尾;否则创建一个新文件。
  2. Create:创建新文件。 如果文件已存在,它将被覆盖。
  3. CreateNew:创建新文件, 如果文件已存在则引发异常。
  4. Open:打开现有文件,如果文件不存在则引发异常。
  5. OpenOrCreate:文件存在就打开文件;否则创建新文件。
  6. Truncate:打开现有文件并清除内容,如果文件不存在则引发异常。

第三个参数是一个FileAccess枚举,指定了文件读写权限,包括以下成员:

  1. Read:文件的读访问。可与 Write 组合从文件中读取数据。
  2. Write:文件的写访问。 可Read 组合将数据写入文件。
  3. ReadWrite:对文件的读访问和写访问。
  1. FileStream(String, FileMode, FileAccess, FileShare):使用指定的路径、创建模式、读/写权限和共享权限初始化FileStream类的新实例。

前三个参数和上面的重载相同。

第四个参数是一个FileShare枚举,指定了其它FileStream对象对同一文件可以的操作方式,包括以下成员:

  1. Delete:允许随后删除文件。
  2. Inheritable:使文件句柄可由子进程继承。 
  3. None:谢绝共享当前文件。
  4. Read:允许随后打开文件读取。
  5. ReadWrite:允许随后打开文件读取或写入。
  6. Write:允许随后打开文件写入。

FileStream常用方法:

  1. Lock:防止其他进程读取或写入 FileStream。
  2. Unlock:允许其他进程访问以前锁定的某个文件的全部或部分。
  3. ReadAsync:从当前流异步读取字节序列,并将流中的位置提升读取的字节数。
  4. WriteAsync:将字节序列异步写入当前流,并将流的当前位置提升写入的字节数。

 

学习更多vb.net知识,请参看vb.net 教程 目录

学习更多C#知识,请参看C#教程 目录

 


http://www.kler.cn/a/524817.html

相关文章:

  • (一)QT的简介与环境配置WIN11
  • SQL UCASE() 函数详解
  • CMAKE工程编译好后自动把可执行文件传输到远程开发板
  • 《深度剖析Q-learning中的Q值:解锁智能决策的密码》
  • HTML<kbd>标签
  • 第19篇:python高级编程进阶:使用Flask进行Web开发
  • Java坦克大战
  • 蛇年的第一篇博客:设想中的汉字编码
  • Sprintboot原理
  • VMware安装win10记录
  • MySQL备忘录
  • 上位机知识篇---Linux的shell脚本搜索、查找、管道
  • 【数据结构】初识链表
  • MongoDB常见的运维工具总结介绍
  • 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-19- 操作鼠标悬停(详细教程)
  • 代码随想录|动态规划 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组
  • Go学习:格式化输入输出
  • solon-flow 你好世界!
  • C++传送锚点的内存寻址:内存管理
  • G. Rudolf and CodeVid-23
  • [250125] DeepSeek 发布开源大模型 R1,性能比肩 OpenAI o1 | 希捷推出高达 36TB 的硬盘
  • 【C++】STL容器使用与实现详解:vector
  • STM32 PWM驱动直流电机
  • 2024 CVPR Highlight Learning-Feedback
  • C# 环境:深入探讨与优化
  • Python中的函数(上)