【.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常用属性
序号 | 属性名 | 属性说明 |
---|---|---|
1 | CanRead | 获取一个值,该值指示当前流是否支持读取 |
2 | CanSeek | 获取一个值,该值指示当前流是否支持查询 |
3 | CanTimeout | 获取一个值,该值确定当前流是否可以超时 |
4 | CanWrite | 获取一个值,该值指示当前流是否支持写入 |
5 | IsAsync | 获取一个值,它指示FileStream 是异步打开还是同步打开的 |
6 | Length | 获取流的长度(以字节为单位) |
7 | Name | 获取FileStream 中已打开的文件的绝对路径 |
8 | Position | 获取或设置此流的当前位置 |
9 | ReadTimeout | 获取或设置一个值(以毫秒为单位),该值确定流在超时前将尝试读取的时间 |
10 | SafeFileHandle | 获取 SafeFileHandle 对象,它代表当前FileStream 对象所封装的文件的操作系统文件句柄。 |
11 | WriteTimeout | 获取或设置一个值(以毫秒为单位),该值确定在超时前将尝试写入多长时间。 |
2.5 FileStream.Read方法
从流中读取字节块并将该数据写入给定缓冲区中
- 重载
序号 | 方法 | 说明 |
---|---|---|
1 | Read(Byte[],Int32,Int32) | 从流中读取字节块并将该数据写入给定缓冲区中 |
2 | Read(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方法
将字节的序列从只读范围写入当前文件流,并按写入的字节数向前移动此文件流中的当前位置。
- 重载
序号 | 方法 | 说明 |
---|---|---|
1 | Write(ReadOnlySpan) | 将字节的序列从只读范围写入当前文件流,并按写入的字节数向前移动此文件流中的当前位置 |
2 | Write(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.AutoFlush
为true
表示数据将从缓冲区刷新到流,但不会刷新编码器状态。这允许编码器将其状态保留,以便可以正确编码一下字符块。
三、FileStream总结
上面介绍了FileStream
的一般用法,如果需要有异常操作,异步读取使用ReadAsync
方法,使用ReadAsync
方法 可以执行资源密集型文件操作,而不会阻止main
线程。 异步写入使用WriteAsync
方法,WriteAsync
方法可以执行资源密集型文件操作,而不会阻止main
线程。在选择FileStream
时,根据实际的使用场景选择对应的方法完成对流的操作。
相关文章:

【.NET Core】深入理解IO - FileSteam流
【.NET Core】深入理解IO - FileSteam流 文章目录 【.NET Core】深入理解IO - FileSteam流一、IO流概述二、文件流FileStream2.1 FileStream概述2.2 FileStream检测流位置更改2.3 FileStream构造函数2.4 FileStream常用属性2.5 FileStream.Read方法2.6 FileStream.Write方法2.7…...
CentOS7 Mysql 忘记密码或临时密码进不去时怎么跳过密码进去然后再更改密码
CentOS7 Mysql 忘记密码或临时密码进不去时怎么跳过密码进去然后再更改密码 1、进文件 vi /etc/my.cnf2、加skip-grant-tables设置跳过密码 在[mysqld]下面加 skip-grant-tables3、mysql -u root -p直接回车无密码进去mysql mysql -u root -p3、先更新,不执行这…...

深度学习 精选笔记(8)梯度消失和梯度爆炸
学习参考: 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增),以达到集多方教程的精华于一文的目的。 ③非常推荐上面(学习参考&#x…...

linux操作docker
docker地址 官方地址 centos7安装docker 卸载旧版本docker sudo //在前面表示以管理员权限操作yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine安装docker //安装所需资…...
k8s Pod 进阶(资源限制,健康检查探针详解,启动退出,pod生命周期,)
目录 资源限制 查看资源控制字段 Pod 资源限制方式 Pod 和容器中定义资源请求和限制的具体字段 CPU资源单位 内存资源单位 示例 健康检查(探针) 探针的三种规则 存活探针(Liveness Probe) 就绪探针(Readines…...
SpringBoot整合ActiveMQ步骤
SpringBoot整合ActiveMQ主要涉及以下几个步骤: 添加依赖:在SpringBoot项目的pom.xml文件中添加ActiveMQ的依赖。 <dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-spring</artifactId><ver…...
MySQL的单表和多表查询
我们在前面曾构建过三个用于实验的表格,下面将基于这三个表进行实践。 # 建立一个用于实验的三个表格 mysql> create table emp (-> empno varchar(10),-> ename varchar(50),-> job varchar(50),-> mgr int,-> hiredate timestamp,-&…...

攻防世界例题wp
1.看到_wakeup()函数第一反应要么触发,要么绕过在这里绕过 2.构造payload实例化一个对象后反序列化 3构造脚本如下: 4.因为它是一个绕过的方法所以我们要使用绕过的方法。 5.继续构造payload将上图的1换成2进行绕过 最终的payload为 O:4:"xctf…...

仿牛客网项目---显示评论和添加评论功能的实现
这篇文章,我来介绍一下我的项目中的另外一个功能:显示评论和添加评论。 其实这两个功能都不怎么重要,我感觉最重要的应该是用户注册登录功能,这个也了解一下,知道这么一回事儿就好。 首先设计DAO层。 Mapper public …...

idea集成git详解教程(实用篇)
0.Git常用命令 Git常用命令-CSDN博客 1.下载git Git - Downloads 一路傻瓜式安装即可(NEXT) 2.软件测试 在Windows桌面空白处,点击鼠标右键,弹出右键菜单 Git软件安装后,会在右键菜单中增加两个菜单 Git GUI He…...

搭建LNMP环境并配置个人博客系统
LNMP是Linux(操作系统)、Nginx(Web服务器)、MySQL(数据库)和PHP(脚本解释器)的组合,常用于部署高性能的动态网站,如WordPress等博客平台 一、安装Linux操作系…...

为什么网络安全缺口这么大,还是这么缺网络安全工程师?
为啥网安领域缺口多达300多万人,但网安工程师(白帽黑客)却很少,难道又是砖家在忽悠人??? 主要原因为这三点: 首先是学校的原因,很多学校网络安全课程用的还都是十年前的老教材&…...
创新洞察|诺奖获得者埃德蒙·费尔普斯谈未来:中国创新从何而来?
当下,全球宏观经济形势正在发生深刻变化,以创新推进高质量发展被推向前所未有的高度。作为多年与中国经济结伴而行的经济学家、2006年诺贝尔经济学奖得主,埃德蒙费尔普斯认为:创新无处不在,而中国人具有巨大的创新活力…...

SpringMVC 学习(六)之视图
目录 1 SpringMVC 视图介绍 2 JSP 视图 3 Thymeleaf 视图 4 FreeMarker 视图 5 XSLT 视图 6 请求转发与重定向 6.1 请求转发 (Forward) 6.2 重定向 (Redirect) 7 视图控制器 (view-controller) 1 SpringMVC 视图介绍 在 SpringMVC 框架中,视图可以是一个 J…...

ROS 2基础概念#1:计算图(Compute Graph)| ROS 2学习笔记
在ROS中,计算图(ROS Compute Graph)是一个核心概念,它描述了ROS节点之间的数据流动和通信方式。它不仅仅是一个通信网络,它也反映了ROS设计哲学的核心——灵活性、模块化和可重用性。通过细致探讨计算图的高级特性和实…...
一本通 1403:素数对
在判断素数对的两个数是否都为素数时可以只判断数的一半 #include<bits/stdc.h> using namespace std; bool su(int a,int b){ for(int i2;i<sqrt(a);i){ if(a%i0){ return 0; } } for(int i2;i<sqrt(b);i){ if(…...

华为---RSTP(四)---RSTP的保护功能简介和示例配置
目录 1. 技术背景 2. RSTP的保护功能 3. BPDU保护机制原理和配置命令 3.1 BPDU保护机制原理 3.2 BPDU保护机制配置命令 3.3 BPDU保护机制配置步骤 4. 根保护机制原理和配置命令 4.1 根保护机制原理 4.2 根保护机制配置命令 4.3 根保护机制配置步骤 5. 环路保护机…...
Android基础控件介绍
在Android应用程序开发中,使用基础控件是非常常见的。这些控件允许您在用户界面中显示文本、图像、按钮等元素,以及接收用户输入。本文将介绍几种常见的基础控件,并给出每个控件在示例XML中使用的属性的详细说明。 1. TextView TextView 是…...

【总结】Maxwell学习笔记
1.Maxwell简介 Maxwell 是一款用Java编写的MySQL变更数据抓取软件,它会实时监控Mysql数据库的数据变更操作(包括insert、update、delete),并将变更数据以 JSON 格式发送给 Kafka、Kinesi等流数据处理平台 官网地址:M…...
AFL fork server和fuzzer的交互
看了一些博客,都是在说fuzzer和fork server进行交互,由fork server fork出子进程来执行程序,但是不太明白这两者到底是如何在代码层面进行交互的。 run_target中有这么一段代码,大概意思是fuzzer给fork server传递prev_timed_out…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...

【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...