【.NET Core】深入理解IO - FileSteam流

【.NET Core】深入理解IO - FileSteam流

文章目录

  • 【.NET Core】深入理解IO - FileSteam流
    • 一、IO流概述
    • 二、文件流FileStream
      • 2.1 FileStream概述
      • 2.2 FileStream检测流位置更改
      • 2.3 FileStream构造函数
      • 2.4 FileStream常用属性
      • 2.5 FileStream.Read方法
      • 2.6 FileStream.Write方法
      • 2.7 FileStream.Seek方法
      • 2.8 FileStream.Flush 方法
    • 三、FileStream总结

在这里插入图片描述

一、IO流概述

抽象类Stream支持读取和写入字节。所有表示流的类都继承自Stream类。Stream类及其派生类提供数据源和存储库的常见视图。

流主要设计三个基本的操作:

  • 读取 - 将数据从流传输到数据结构中。
  • 写入 - 将数据从数据源传输到流。
  • 查找 - 对流中的当前位置进行查询和修改。

IO流常用的流包含一下几个类,博主将在将来的博文中一一介绍。

  • FileStream - 用于对文件进行读取和写入操作。
  • IsolatedStorageFileStream - 用于对独立存储中的文件进行读取或写入操作。
  • MemoryStream - 用于作为后备存储对内存进行读取和写入操作。
  • BufferedStream - 用于改进读取和写入操作的性能。
  • NetworkStream - 用于通过网络套接字进行读取和写入。
  • PipStream - 用于通过匿名和命名管道进行读取和写入。
  • CryptoStream - 用于将数据流链接到加密转换。

二、文件流FileStream

2.1 FileStream概述

使用FileStream类读取、写入、打开和关闭文件系统上的文件,以及操作其他与文件相关的操作句柄、包括管道、标注输入和标注输出。可以使用Write和方法执行同步操作,或者ReadAsyncCopyToAsyncWriteAsync以及FlushAsync执行异步操作的方法。FlushReadCopyTo使用异步方法执行资源密集型文件操作,而不阻止主线程。

FileStream类实现IDisposable接口。在使用完类型后,你应直接或间接释放类型。如要直接释放类型,请在try/catch块中调用其Dispose方法。如要间接释放类型,请使用using语言构造。

2.2 FileStream检测流位置更改

FileStream当对象在其句柄上没有独占保留时,另一个线程可以同时访问文件句柄,并更改与文件句柄关联的操作系统文件指针的位置。在这种情况下,对象中的FileStream缓存位置以及缓冲区中缓存的数据可能会受到损害。该FileStream对象定期对访问缓存缓冲区的方法执行检查,以确保操作系统的句柄位置与对象使用的FileStream缓存位置相同。

2.3 FileStream构造函数

  • FileStream(String,FileMode)

使用指定的路径和创建模式初始化FileStream类的新实例。

  • FileStream(String,FileStreamOptions)

使用指定的路径、创建模式、读/写和共享权限、缓存区大小、其他文件选项、预分配大小及其FileStream对同一文件的访问权限初始化类的新实例FileSteam

  • FileStream(String,FileMode,FileAccess)

使用指定的路径、创建模式和读/写权限初始化FileStream类新实例。

  • FileStream(String,FileMode,FileAccess,FileShare,Int32,Boolean)

使用指定的路径、创建模式、读/写和共享权限、缓冲区大小和同步或异步状态初始化FileStream类的新实例。

  • FileStream(String,FileMode,FileAccess,FileShare)

使用指定的路径、创建模式、读/写权限和共享权限创建 FileStream类的新实例

  • FileStream(String,FileModel,FileAccesss,FileShare,Int32,FileOptions)

使用指定的路径、创建模式、读/写和共享权限、其他 FileStreams 可以具有的对此文件的访问权限、缓冲区大小和附加文件选项初始化FileStream类的新实例。

2.4 FileStream常用属性

序号属性名属性说明
1CanRead获取一个值,该值指示当前流是否支持读取
2CanSeek获取一个值,该值指示当前流是否支持查询
3CanTimeout获取一个值,该值确定当前流是否可以超时
4CanWrite获取一个值,该值指示当前流是否支持写入
5IsAsync获取一个值,它指示FileStream是异步打开还是同步打开的
6Length获取流的长度(以字节为单位)
7Name获取FileStream中已打开的文件的绝对路径
8Position获取或设置此流的当前位置
9ReadTimeout获取或设置一个值(以毫秒为单位),该值确定流在超时前将尝试读取的时间
10SafeFileHandle获取 SafeFileHandle对象,它代表当前FileStream对象所封装的文件的操作系统文件句柄。
11WriteTimeout获取或设置一个值(以毫秒为单位),该值确定在超时前将尝试写入多长时间。

2.5 FileStream.Read方法

从流中读取字节块并将该数据写入给定缓冲区中

  • 重载
序号方法说明
1Read(Byte[],Int32,Int32)从流中读取字节块并将该数据写入给定缓冲区中
2Read(Span)从当前文件流中读取字节序列,并在该文件流中按照读取的字节数提升位置。
  • 注解

方法Read 中offset参数(开始读取的缓冲区索引)提供字节array的偏移量,参数count提供要从此流中读取的最大字节数。返回的值是读取的实际字节数。如果到达流的末尾,则返回的值为零。如果读取操作成功,则流的当前位置将按读取的字节数前进。如果发生异常,流的当前位置保持不变。

方法Read仅在到达流的末尾后返回零,否则,Read始终在返回之前至少从流中读取一个字节。如果在调用Read时流中没有数据可用,则方法将阻塞,直到至少可以返回一个字节的数据。实现可以自由返回比请求的字节少,即使尚未到达流的末尾。

  • 示例
public void FileReadDemo()
{string pathSource = @"c:\tests\source.txt";try{using (FileStream fsSource = new FileStream(pathSource,FileMode.Open,FileAccess.Read)){byte[] bytes = new byte[fsSource.Length];int numBytesToRead = (int)fsSource.Length;int numBytesRead = 0;while (numBytesToRead > 0){int n = fsSource.Read(bytes, numBytesRead, numBytesToRead);if (n == 0)break;numBytesRead += n;numBytesToRead -= n;}numBytesToRead = bytes.Length;using (FileStream fsNew = new FileStream(pathNew,FileMode.Create, FileAccess.Write)){fsNew.Write(bytes, 0, numBytesToRead);}}}catch(FileNotFoundException fileStreamException){Console.WriteLine(fileStreamException.Message)    }
}

2.6 FileStream.Write方法

将字节的序列从只读范围写入当前文件流,并按写入的字节数向前移动此文件流中的当前位置。

  • 重载
序号方法说明
1Write(ReadOnlySpan)将字节的序列从只读范围写入当前文件流,并按写入的字节数向前移动此文件流中的当前位置
2Write(Byte[],Int32,Int32)将字节块写入文件流。
  • 注解

CanWrite使用,属性确定当前实例是否支持写入。WriteAsync使用方法以异步方式写入当前流。

如果吸入操作成功,则文件流中的位置将按写入的字节数前进。如果发生异常,则文件流中的位置保持不变。

  • 示例
if(fileStream.Length == 0)
{tempString =lastRecordText + recordNumber.ToString();fileStream.Write(uniEncoding.GetBytes(tempString),0,uniEncoding.GetByteCount(tempString));
}

2.7 FileStream.Seek方法

将该流的当前位置设置为给定值。

public override long Seek (long offset, System.IO.SeekOrigin origin);
  • offset 相对于origin的点,从此处开始查找。
  • SeekOrigin 使用SeekOrigin 类型的值,将开始位置,结束位置或当前位置指定为offset的参考点。
  • 示例
public static void Main()
{long offset;int nextByte;using (FileStream fs = new FileStream(@"c:\temp\alphabet.txt", FileMode.Open, FileAccess.Read)){for (offset = 1; offset <= fs.Length; offset++){fs.Seek(-offset, SeekOrigin.End);Console.Write((char)fs.ReadByte());}Console.WriteLine();fs.Seek(20, SeekOrigin.Begin);while ((nextByte = fs.ReadByte()) > 0){Console.Write((char)nextByte);}Console.WriteLine();}
}

2.8 FileStream.Flush 方法

调用FileStream.Flush方法时,会刷新操作系统I/O缓冲区。

I/O缓冲区只有调用Flush或释放对象才会释放缓冲区,否则不会刷新流的编码器。如将StreamWriter.AutoFlushtrue表示数据将从缓冲区刷新到流,但不会刷新编码器状态。这允许编码器将其状态保留,以便可以正确编码一下字符块。

三、FileStream总结

上面介绍了FileStream的一般用法,如果需要有异常操作,异步读取使用ReadAsync方法,使用ReadAsync方法 可以执行资源密集型文件操作,而不会阻止main线程。 异步写入使用WriteAsync方法,WriteAsync方法可以执行资源密集型文件操作,而不会阻止main线程。在选择FileStream时,根据实际的使用场景选择对应的方法完成对流的操作。

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

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

相关文章

WIN10 无密码自动登录

1、家里重装了一下WIN10系统&#xff0c;第一次登陆居然用了微软网站账号&#xff0c;结果密码忘记了&#xff0c;后面只能用PIN码登陆系统。 2、需要登录微软的网站修改密码&#xff1a; Microsoft account | Sign In or Create Your Account Today – Microsoft 3、在运行…

ywtool check命令及ywtool clean命令

提示:工具下载链接在文章最后 目录 一.ywtool check命令1.1 ywtool check -I1.2 ywtool check all1.3 ywtool check io1.4 ywtool check elk1.5 ywtool check php1.6 ywtool check mysql1.7 ywtool check nginx1.8 ywtool check system1.9 ywtool check docker_nbip [容器名称]…

[面试] 如何保证Redis和MySQL数据一致性?

为什么要在Redis存数据 Redis 用来实现应用和数据库之间读操作的缓存层&#xff0c;主要目的是减少数据 库 IO&#xff0c;还可以提升数据的 IO 性能。 因为Redis基于内存, 查询效率比MySQL快很多, 所以有限查询Redis中的数据,如果Redis没有就查询数据库然后同步到Redis 出…

作业1-224——P1927 防护伞

思路 遍历一下找到两点间的最远距离&#xff0c;直接公式算结果&#xff0c;控制输出位数 参考代码 #include<iostream> #include<iomanip> #include<cmath> using namespace std; int main() { int n; cin>>n; int x[n],y[n]; do…

071:vue+cesium 实现下雨效果

第071个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中实现下雨效果,这里使用着色器来实现实例特效。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共120行)着色代码实现心得:专栏目标示例效果

94. 递归实现排列型枚举 刷题笔记

思路 依次枚举 每个位置用哪个数字 要求按照字典序最小来输出 而每次搜索下一层时i都是从1开始 也就是说 如果有小的数可以填上 那么该方案会填上这个数字 例如 当n等于3 第一次搜索 1 2 3输出后返回 返回后此时i3 第二个位置填3 1 3 2 输出后返回 此时返回到第一层…

Python环境搭建

安装包百度网盘&#xff1a;百度网盘 请输入提取码 Python 解释器IDLEJupyterPycharmAnaconda Python解释器 Python的解释器是一种可以执行Python代码的软件程序。Python官方提供了多个解释器&#xff0c;包括CPython、Jython、IronPython、PyPy等。其中&#xff0c;CPython是最…

vscode起本地服务

下载这个 插件 Live Server (Five Server) 下载完会出现这个

计算机视觉领域的前景与挑战-数据增强

计算机视觉在利用数据增强的技术强化下能够大规模提高模型的准确率。—Google Brain科学家Ekin Dogus Cubuk 数据增强技术的多样性提高准确性 Google Brain科学家Ekin Dogus Cubuk做了一个有趣的演讲&#xff0c;重点介绍了深度学习中一个有待充分利用的工具——数据增强。虽然…

档案数字化验收流程

档案数字化验收流程通常包括以下步骤&#xff1a; 1. 确定验收标准&#xff1a;制定档案数字化验收标准&#xff0c;明确要求检查的内容、质量要求、验收标准等。 2. 准备验收环境&#xff1a;为档案数字化验收准备合适的环境&#xff0c;包括验收场所、设备、人员等。 3. 准备…

网络安全课程VIP介绍(比同行便宜)

免责声明 本文发布的工具和脚本&#xff0c;仅用作测试和学习研究&#xff0c;禁止用于商业用途&#xff0c;不能保证其合法性&#xff0c;准确性&#xff0c;完整性和有效性&#xff0c;请根据情况自行判断。如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利&#xff0c…

[VNCTF2024]-PWN:preinit解析(逆向花指令,绕过strcmp,函数修改,机器码)

查看保护&#xff1a; 查看ida&#xff1a; 这边其实看反汇编没啥大作用&#xff0c;需要自己动调。 但是前面的绕过strcmp还是要看一下的。 解题&#xff1a; 这里是用linux自带的产生随机数的文件urandom来产生一个随机密码&#xff0c;然后让我们输入密码&#xff0c;用st…