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

【.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时,根据实际的使用场景选择对应的方法完成对流的操作。

相关文章:

【.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、先更新&#xff0c;不执行这…...

深度学习 精选笔记(8)梯度消失和梯度爆炸

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#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资源单位 内存资源单位 示例 健康检查&#xff08;探针&#xff09; 探针的三种规则 存活探针&#xff08;Liveness Probe&#xff09; 就绪探针&#xff08;Readines…...

SpringBoot整合ActiveMQ步骤

SpringBoot整合ActiveMQ主要涉及以下几个步骤&#xff1a; 添加依赖&#xff1a;在SpringBoot项目的pom.xml文件中添加ActiveMQ的依赖。 <dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-spring</artifactId><ver…...

MySQL的单表和多表查询

我们在前面曾构建过三个用于实验的表格&#xff0c;下面将基于这三个表进行实践。 # 建立一个用于实验的三个表格 mysql> create table emp (-> empno varchar(10),-> ename varchar(50),-> job varchar(50),-> mgr int,-> hiredate timestamp,-&…...

攻防世界例题wp

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

仿牛客网项目---显示评论和添加评论功能的实现

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

idea集成git详解教程(实用篇)

0.Git常用命令 Git常用命令-CSDN博客 1.下载git Git - Downloads 一路傻瓜式安装即可&#xff08;NEXT&#xff09; 2.软件测试 在Windows桌面空白处&#xff0c;点击鼠标右键&#xff0c;弹出右键菜单 Git软件安装后&#xff0c;会在右键菜单中增加两个菜单 Git GUI He…...

搭建LNMP环境并配置个人博客系统

LNMP是Linux&#xff08;操作系统&#xff09;、Nginx&#xff08;Web服务器&#xff09;、MySQL&#xff08;数据库&#xff09;和PHP&#xff08;脚本解释器&#xff09;的组合&#xff0c;常用于部署高性能的动态网站&#xff0c;如WordPress等博客平台 一、安装Linux操作系…...

为什么网络安全缺口这么大,还是这么缺网络安全工程师?

为啥网安领域缺口多达300多万人&#xff0c;但网安工程师&#xff08;白帽黑客&#xff09;却很少&#xff0c;难道又是砖家在忽悠人&#xff1f;&#xff1f;&#xff1f; 主要原因为这三点: 首先是学校的原因&#xff0c;很多学校网络安全课程用的还都是十年前的老教材&…...

创新洞察|诺奖获得者埃德蒙·费尔普斯谈未来:中国创新从何而来?

当下&#xff0c;全球宏观经济形势正在发生深刻变化&#xff0c;以创新推进高质量发展被推向前所未有的高度。作为多年与中国经济结伴而行的经济学家、2006年诺贝尔经济学奖得主&#xff0c;埃德蒙费尔普斯认为&#xff1a;创新无处不在&#xff0c;而中国人具有巨大的创新活力…...

SpringMVC 学习(六)之视图

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

ROS 2基础概念#1:计算图(Compute Graph)| ROS 2学习笔记

在ROS中&#xff0c;计算图&#xff08;ROS Compute Graph&#xff09;是一个核心概念&#xff0c;它描述了ROS节点之间的数据流动和通信方式。它不仅仅是一个通信网络&#xff0c;它也反映了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应用程序开发中&#xff0c;使用基础控件是非常常见的。这些控件允许您在用户界面中显示文本、图像、按钮等元素&#xff0c;以及接收用户输入。本文将介绍几种常见的基础控件&#xff0c;并给出每个控件在示例XML中使用的属性的详细说明。 1. TextView TextView 是…...

【总结】Maxwell学习笔记

1.Maxwell简介 Maxwell 是一款用Java编写的MySQL变更数据抓取软件&#xff0c;它会实时监控Mysql数据库的数据变更操作&#xff08;包括insert、update、delete&#xff09;&#xff0c;并将变更数据以 JSON 格式发送给 Kafka、Kinesi等流数据处理平台 官网地址&#xff1a;M…...

AFL fork server和fuzzer的交互

看了一些博客&#xff0c;都是在说fuzzer和fork server进行交互&#xff0c;由fork server fork出子进程来执行程序&#xff0c;但是不太明白这两者到底是如何在代码层面进行交互的。 run_target中有这么一段代码&#xff0c;大概意思是fuzzer给fork server传递prev_timed_out…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

k8s从入门到放弃之Pod的容器探针检测

k8s从入门到放弃之Pod的容器探针检测 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;容器探测是指kubelet对容器执行定期诊断的过程&#xff0c;以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...

精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑

精益数据分析&#xff08;98/126&#xff09;&#xff1a;电商转化率优化与网站性能的底层逻辑 在电子商务领域&#xff0c;转化率与网站性能是决定商业成败的核心指标。今天&#xff0c;我们将深入解析不同类型电商平台的转化率基准&#xff0c;探讨页面加载速度对用户行为的…...

XXE漏洞知识

目录 1.XXE简介与危害 XML概念 XML与HTML的区别 1.pom.xml 主要作用 2.web.xml 3.mybatis 2.XXE概念与危害 案例&#xff1a;文件读取&#xff08;需要Apache >5.4版本&#xff09; 案例&#xff1a;内网探测&#xff08;鸡肋&#xff09; 案例&#xff1a;执行命…...

第21节 Node.js 多进程

Node.js本身是以单线程的模式运行的&#xff0c;但它使用的是事件驱动来处理并发&#xff0c;这样有助于我们在多核 cpu 的系统上创建多个子进程&#xff0c;从而提高性能。 每个子进程总是带有三个流对象&#xff1a;child.stdin, child.stdout和child.stderr。他们可能会共享…...