【.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.rhkb.cn/news/271947.html

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

相关文章

尚硅谷JavaScript高级学习笔记

01 准备 JavaScript中函数是对象。我们后续描述构造函数的内存模型时&#xff0c;会将构造函数称为构造函数对象。 02 数据类型 typeof 运算符来查看值的类型&#xff0c;它返回的是类型的字符串值 会做数据转换 03 相关问题 04数据_变量_内存 05相关问题1 06相关问题2 …

植物病虫害:YOLO玉米病虫害识别数据集

玉米病虫害识别数据集&#xff1a;玉米枯萎病&#xff0c;玉米灰斑病&#xff0c;玉米锈病叶&#xff0c;粘虫幼虫&#xff0c;玉米条斑病&#xff0c;黄二化螟&#xff0c;黄二化螟幼虫7类&#xff0c;yolo标注完整&#xff0c;3900多张图像&#xff0c;全部原始数据&#xff…

学习人工智能:吴恩达《AI for everyone》2019 第4周:歧视,攻击,发展中国家,就业

吴恩达 Andrew Ng&#xff0c; 斯坦福大学前教授&#xff0c;Google Brain项目发起人、领导者。 Coursera 的联合创始人和联合主席&#xff0c;在 Coursera 上有十万用户的《机器学习》课程&#xff1b;斯坦福大学计算机科学前教授。百度前副总裁、前首席科学家&#xff1b;谷…

WPF 消息提示 类似toast方式

WPF里面的消息提示一般都是MessageBox.Show()&#xff0c;这种样式不是很好看&#xff0c;所以就想办法重新搞了一个类似弹出消息的功能。原理很简单&#xff0c;就是弹出一个新窗体&#xff0c;然后等几秒窗体自动关闭。 先上效果图&#xff1a; 新建一个MsgHelper.cs类&…

Linux文件与文件系统的压缩

文章目录 Linux文件与文件系统的压缩Linux系统常见的压缩命令gzip&#xff0c;zcat/zmore/zless/zgrepbzip2&#xff0c;bzcat/bzmore/bzless/bzgreppxz&#xff0c;xzcat/xzmore/xzless/xzgrepgzip&#xff0c;bzip2&#xff0c;xz压缩时间对比打包命令&#xff1a;tar打包命令…

window vscode安装node.js

window vscode安装node.js 官网下好vscode 和nodejs 选.msi的安装 点这个安装 下载完 继续安装 完毕后倒杯水喝个茶等2分钟 重启VScode 或者在cmd 运行 npm -v node -v 显示版本号则成功

Prompt进阶系列1:LangGPT(从编程语言反思LLM的结构化可复用提示设计框架)

Prompt进阶系列1:LangGPT(从编程语言反思LLM的结构化可复用提示设计框架) 大语言模型 (Large Language Models, LLMs) 在不同领域都表现出了优异的性能。然而&#xff0c;对于非AI专家来说&#xff0c;制定高质量的提示来引导 LLMs 是目前AI应用领域的一项重要挑战。现有的提示…

Flink 物理执行图

文章目录 物理执行图一、Task二、ResultPartition三、ResultSubpartition四、InputGate五、InputChannel 物理执行图 JobManager根据ExecutionGraph对作业进行调度&#xff0c;并在各个TaskManager上部署任务。这些任务在TaskManager上的实际执行过程就形成了物理执行图。物理…

【目标检测实验系列】AutoDL线上GPU服务器租用流程以及如何用Pycharm软件远程连接服务器进行模型训练 (以Pycharm远程训练Yolov5项目为例子 超详细)

目录 1. 文章主要内容2. 租用AutoDL服务器详细教程2.1 注册AutoDL账号&#xff0c;并申请学生认证(学生认证有优惠&#xff0c;如果不是学生可以忽略此点)2.2 算力市场选择GPU&#xff0c;并选择初始化配置环境2.3 控制台参数解析&#xff0c;并使用相关参数登录Xftp(Windows与…

【蓝桥杯】k倍区间

一.题目描述 二.问题分析 对于该问题&#xff0c;标签上写的是暴力&#xff0c;但是如果使用暴力的话&#xff0c;会超时。 首先&#xff0c;对于两个数a&#xff0c;b&#xff08;假设a小于b&#xff09;&#xff0c;若a与b对k取余后结果相同&#xff0c;则b-a可以整除k。 …

ubuntu 卸载miniconda3

一开始安装路径错了&#xff0c;需要重新安一次&#xff0c;就一起记录了。 前提是这种方式安装&#xff1a; ubuntu安装miniconda3管理python版本-CSDN博客 删除Miniconda的安装目录 这目录就是你选择安装的时候指定的&#xff0c;如果记不得了,可以这样查看 which conda 这…

flink重温笔记(十二): flink 高级特性和新特性(1)——End-to-End Exactly-Once(端到端精确一致性语义)

Flink学习笔记 前言&#xff1a;今天是学习 flink 的第 12 天啦&#xff01;学习了 flink 高级特性和新特性之 End-to-End Exactly-Once&#xff08;端到端精确一致性语义&#xff09;&#xff0c;主要是解决大数据领域数据从数据源到数据落点的一致性&#xff0c;不会容易造成…

Python编程实验六:面向对象应用

目录 一、实验目的与要求 二、实验内容 三、主要程序清单和程序运行结果 第1题 第2题 四、实验结果分析与体会 一、实验目的与要求 &#xff08;1&#xff09;通过本次实验&#xff0c;学生应掌握类的定义与对象的创建、类的继承与方法的覆盖&#xff1b; &#xff08;2…

基于SSM技术的分布式销售平台设计与实现

目 录 摘 要 I Abstract II 1 绪论 1 1.1 课题研究背景与意义 1 1.2 国内外研究现状 1 1.2.1 国外研究现状 1 1.2.2 国内研究现状 2 1.3 本章小结 2 2 工程开发技术介绍 3 2.1 Web前端技术栈 3 2.1.1 HTML&CSS 3 2.1.2 jQuery 3 2.1.3 JSP 3 2.2 服务端开发技术栈 3 2.2.1…

【Linux】第一个小程序--进度条

这篇博客要综合利用以前的知识&#xff0c;来实现一个进度条程序~ 目录 换行&回车 缓冲区 实现简单的倒计时 实现进度条 version1 version2 在开始写这个小程序之前&#xff0c;我们先学习一些预备知识&#xff1a; 换行&回车 缓冲区 在我们运行这个程序时&…

基于R语言lavaan结构方程模型(SEM)技术应用

结构方程模型&#xff08;Sructural Equation Modeling&#xff0c;SEM&#xff09;是分析系统内变量间的相互关系的利器&#xff0c;可通过图形化方式清晰展示系统中多变量因果关系网&#xff0c;具有强大的数据分析功能和广泛的适用性&#xff0c;是近年来生态、进化、环境、…

Mysql中的MVCC

”真正学会&#xff0c;如你般自由~“ MVCC机制简介 MVCC(Multi-Version-Concurrency-Control)多版本并发控制&#xff0c;MVCC 是一种并发控制的方法&#xff0c;一般在数据库管理系统中&#xff0c;实现对数据库的并发访问&#xff1b;在编程中实现事务内存。 取自 MVCC存在被…

图片编辑器tui-image-editor

提示&#xff1a;图片编辑器tui-image-editor 文章目录 前言一、安装tui-image-editor二、新建components/ImageEditor.vue三、修改App.vue四、效果五、遇到问题 this.getResolve is not a function总结 前言 需求&#xff1a;图片编辑器tui-image-editor 一、安装tui-image-ed…

【李沐精读系列】GPT、GPT-2和GPT-3论文精读

论文&#xff1a; GPT&#xff1a;Improving Language Understanding by Generative Pre-Training GTP-2&#xff1a;Language Models are Unsupervised Multitask Learners GPT-3&#xff1a;Language Models are Few-Shot Learners 参考&#xff1a;GPT、GPT-2、GPT-3论文精读…

javaSE-----继承和多态

目录 一.初识继承&#xff1a; 1.1什么是继承&#xff0c;为什么需要继承&#xff1a; 1.2继承的概念与语法&#xff1a; 二.成员的访问&#xff1a; 2.1super关键字 2.2this和super的区别&#xff1a; 三.再谈初始化: 小结&#xff1a; 四.初识多态&#xff1a; 4.1多…