【.NET Core】深入理解IO - 读取器和编写器

【.NET Core】深入理解IO - 读取器和编写器

文章目录

  • 【.NET Core】深入理解IO - 读取器和编写器
    • 一、概述
    • 二、BinaryReader和BinaryWriter
      • 2.1 BinartReader类
      • 2.2 BinaryWriter类
    • 三、StreamReader和StreamWriter
      • 3.1 StreamReader类
      • 3.1 StreamWriter类
        • StreamWriter类构造函数
        • StreamWriter类属性
        • StreamWriter类常用方法
        • StreamWriter使用示例

在这里插入图片描述

一、概述

System.IO名空间还提供用于在流中读取和写入已编码字符的类型。 通常,流用于字节输入和输出。 读取器和编写器类型处理编码字符与字节之间的来回转换,以便流可以完成操作。 每个读取器和编写器类都与流关联,可以通过类的 BaseStream 属性进行检索。

System.IO常用一些常用的读取器和编写器类:

  • BinaryReaderBinaryWriter - 用于将基元数据类型作为二进制值进行读取和写入。
  • StreamReaderStreamWriter - 用于通过使用编码值在字符和字节之间来回转换来读取和写入字符。
  • StringReaderStringWriter - 用于从字符串读取字符以及将字符写入字符串中。
  • TextReaderTextWriter - 用作其他读取器和编写器(读取和写入字符和字符串,而不是二进制数据)的抽象基类。

下面的篇幅将详细介绍常用的读取器和编写器。

二、BinaryReader和BinaryWriter

C#提供比较全面对文件读写及其传输功能的类,在我们需要在字节级别上操作文件,却又不是一个字节一个字节的操作,通常是2个、4个或8个字节这样操作,这便有了BinaryReaderBinaryWriter类,它们可以将一个字符或数字按指定个数字节写入,也可以一次读取指定一个字节转为字符或数字。

2.1 BinartReader类

BinartReader类用特定的编码将基元数据类型读作二进制值

  • 常用的方法
序号方法说明
1Close关闭当前阅读器及基础流
2Read从基础流中读取字符,并提升流的当前位置
3ReadBytes从当前流将count个字节读入字节数组,并使当前位置提升count个字节
4ReadInt32从当前流中读取4个字节有符号整数,并使流的当前位置提升4个字节
5ReadString从当前流读取一个字符串。字符串有长度前缀,一次7位地被编码为整数
  • 示例
using (FileStream fs=new FileStream(path,FileMode.Open,FileAccess.Read))
{BinaryReader br = new BinaryReader(fs);//以二进制方式读取文件中的内容  bool b = br.ReadBoolean();double d = br.ReadDouble();float f = br.ReadSingle();int i = br.ReadInt32();string s = br.ReadString();//打印每个值Console.WriteLine("{0},{1},{2},{3},{4}",b,d,f,i,s);//关闭流br.Close();fs.Close();
}

2.2 BinaryWriter类

BinaryWriter 类以二进制形式将基元类型写入流,并支持用特定的编码写入字符串。

  • 常用的方法
序号方法说明
1Close关闭当前的BinaryWriter和基础流
2Seek设置当前流中的位置
3Write将值写入当前流
  • 示例
using (FileStream fs=new FileStream(path,FileMode.OpenOrCreate))
{BinaryWriter bw=new BinaryWriter(fs);//以二进制方式向创建的文件中写入内容   bw.Write(588);              //  整型  bw.Write(58.8f);            // 浮点型  bw.Write(58.8);             // double型  bw.Write(true);             // 布尔型  bw.Write("程序人生道可道");  // 字符串型  //关闭流bw.Close();fs.Close();
}

三、StreamReader和StreamWriter

C# 除了使用FileStream类读写文件,还提供专门处理文本文件的两个操作类StreamWriterStreamReader。这两个类从底层封装了文件流,读写时不用重新编码,提供了更文件的读写方式。

3.1 StreamReader类

StreamReader 用于读取标准文本文件中的信息,而 Stream 类用于字节输入和输出;StreamReader 除非另外指定,否则默认为 UTF-8 编码。如果使用属性获取当前字符编码,则 CurrentEncoding 该值在第一种方法之后才是可靠的 Read ,因为在首次调用方法之前不会进行编码自动检测 Read 。

StreamReader不是线程安全的,如果要使线程安全请使用TextReader.Synchronized

  • StreamReader属性
序号属性名说明
1BaseStream返回基础流
2CurrentEncoding获取当前 StreamReader 对象正在使用的当前字符编码
3EndOfStream获取一个值,该值指示当前的流位置是否在流结尾。
  • StreamReader方法
序号方法说明
1Close()关闭 StreamReader 对象和基础流,并释放与读取器关联的所有系统资源。
2DiscardBufferedData()清除内部缓冲区。
3Dispose(Boolean)关闭基础流,释放 StreamReader 使用的未托管资源,同时还可以根据需要释放托管资源。
4Peek()返回下一个可用字符,但不使用它
5Read(Char[], Int32, Int32)从指定的索引位置开始将来自当前流的指定的最多字符读到缓冲区。
6ReadLine()从当前流中读取一行字符并将数据作为字符串返回。
7ReadToEnd()读取来自流的当前位置到结尾的所有字符。
  • 示例
public async Task ReadAndDisplayFilesAsync()
{String filename = "TestFile1.txt";Char[] buffer;using (var sr = new StreamReader(filename)) {buffer = new Char[(int)sr.BaseStream.Length];await sr.ReadAsync(buffer, 0, (int)sr.BaseStream.Length);}Console.WriteLine(new String(buffer));
}

3.1 StreamWriter类

StreamWriter实现一个TextWriter,使其以一种特定的编码向流中写入字符;StreamWrite专用于特定编码的字符输出,而从派生的类 Stream 则设计用于字节输入和输出。StreamWriter 除非另外指定,否则默认为使用实例 UTF8Encoding。

  • StreamWriter类构造函数
序号构造函数说明
1StreamWriter(Stream)使用 UTF-8 编码及默认的缓冲区大小,为指定的流,初始化 StreamWriter 类的新实例
2StreamWriter(Stream, Encoding)使用指定的编码及默认的缓冲区大小,为指定的流,初始化 StreamWriter 类的新实例
3StreamWriter(Stream, Encoding, Int32)使用指定的编码及缓冲区大小,为指定的流,初始化 StreamWriter 类的新实例
4StreamWriter(String)用默认编码和缓冲区大小,为指定的文件初始化 StreamWriter 类的一个新实例
5StreamWriter(String, Boolean, Encoding)使用指定的编码和默认的缓冲区大小,为指定的文件,初始化 StreamWriter 类的新实例。 如果该文件存在,则可以将其覆盖或向其追加。 如果该文件不存在,此构造函数将创建一个新文件
6StreamWriter(String, Boolean, Encoding, Int32)使用指定编码和缓冲区大小,为指定路径上的指定文件,初始化 StreamWriter 类的新实例。 如果该文件存在,则可以将其覆盖或向其追加。 如果该文件不存在,此构造函数将创建一个新文件。
  • StreamWriter类属性
序号属性说明
1AutoFlush获取或设置一个值,该值指示 StreamWriter 在每次调用 Write(Char) 之后是否都将其缓冲区刷新到基础流
2BaseStream获取同后备存储连接的基础流
3Encoding获取在其中写入输出的 Encoding
4FormatProvider获取控制格式设置的对象
5NewLine获取或设置由当前 TextWriter 使用的行结束符字符串
  • StreamWriter类常用方法
序号方法说明
1Close关闭当前 StreamWriter 对象和基础流
2Dispose使所有缓冲数据写入基础流,释放 StreamWriter 使用的非托管资源,同时还可以根据需要释放受管理资源
3Flush清理当前写入器的所有缓冲区,并使所有缓冲数据写入基础流
4Write清理当前写入器的所有缓冲区,并使所有缓冲数据写入基础流
  • StreamWriter使用示例
string path = @"G:\GoyeerOutput\Version.txt";using (StreamWriter StrWt = new StreamWriter(path, true))//true的作用是给文件新增字符,不覆盖
{StrWt.Write("5)使用StreamWriter写入的字符串");
}
using (StreamReader sr = new StreamReader(path))
{// 这允许您执行一次读取操作.Console.WriteLine(sr.ReadToEnd());
}

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

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

相关文章

学习javascript,前端知识精讲,助力你轻松掌握

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 所属专栏:前端泛海 景天的主页:景天科技苑 文章目录 1.JavaScript 简介2.js中,一切皆是对象3.js的引入方式4.js的变量以及…

JeecgBoot Vue3前端项目性能优化按需加载方案

JeecgBoot vue3前端项目在 3.5.5 版本之前,的确存在很严重的性能问题,大家可以参考以下文档进行升级。 按需加载改造方法 1、全局注册地方去掉2、组件改成异步注册3、用不到的大组件可以删掉 【精简项目方案】 大组件 1、富文本 tinyme2、Markdown3、…

09. Nginx进阶-Rewrite

简介 什么是rewrite? rewrite即URL重写,主要实现URL地址重写,以及重定向。 就是把插入web的请求重定向到其他URL的过程。 rewrite使用场景 URL地址调整 例如用户访问wang.mingqu.com将其跳转到ming.mingqu.com。 或者当用户通过http的方…

抢先看!Salesforce新职业Admineloper适合你吗?

每个Salesforce管理员在思考自己的职业生涯时,可能都会想到:下一步是往架构师,或者开发,还是咨询的方向发展。无论哪种职业规划,都需要培养新的技能。 由于角色职责、团队、客户需求等的变化,许多管理员在…

OSPF故障排查,这10大技巧是个网工都在用!

中午好,我的网工朋友。 OSPF这个名词网工们都不陌生吧。 OSPF,即开放式最短路径优先(Open Shortest Path First,OSPF)是广泛使用的一种动态路由协议。 它属于链路状态路由协议,具有路由变化收敛速度快、…

光纤激光焊接机:现代焊接工艺的变革引领者

随着科技的不断进步,传统焊接工艺正经历着一场革命性的变革。在这场变革中,光纤激光焊接机凭借其独特的技术优势,正逐渐崭露头角,成为现代焊接工艺的革新者。 光纤激光焊接机是一种采用激光束作为热源,通过聚焦镜将激光…

现代信号处理学习笔记(三)信号检测

通过观测数据判断信号是否存在,这一问题称为信号检测。 目录 前言 一、统计假设检验 1、信号检测的基本概念 2、信号检测理论测度 比率测度 概率测度 3、决策理论空间 二、概率密度函数与误差函数 1、概率密度函数 2、误差函数与补余误差函数 三、检测概…

容器云平台巡检实战:运维进阶技巧与策略

1 docker容器日常巡检 通过以下方式进行检查: 1.1 docker/podman ps查看容器状态 Docker/podman ps -a 查看容器状态STATUS: Exited(0):表示容器正常退出 Exited(其他数字):容器异常退出,需要通过log 查看原因 Up…

7款炫酷的前端动画特效分享(三)(附效果图及在线演示)

分享7款好玩的前端动画特效 其中有CSS动画、SVG动画、js小游戏等等 下方效果图可能不是特别的生动 那么你可以点击在线预览进行查看相应的动画特效 同时也是可以下载该资源的 CSS3模仿四季交替动画 基于HTML5CSS3实现的卡通风格一年四季交替动画特效 以下效果图只能体现框架的…

redis09 集群(cluster)

思维草图 为什么要使用集群 单台redis内存容量的限制单台redis并发写量太大有性能瓶颈 redis集群认识 redis集群是对redis的水平扩容,即启动N个redis节点,将整个数据分布存储在这个N个节点中,每个节点存储总数据的1/N。 如下图&#xff1…

Chain-of-thought prompting(链式思考提示)

1.大模型“涌现”的思维链 最近 AI 大厂的开发人员和高校的 NLP 研究人员,都在琢磨,怎么让大模型“涌现”。 所谓“涌现”,在大模型领域指的是当模型突破某个规模时,性能显著提升,表现出让人惊艳、意想不到的能力。比如…

vue点击按钮同时下载多个文件

点击下载按钮根据需要的id调接口拿到返回需要下载的文件 再看返回的数据结构 数组中一个对象,就是一个文件,多个对象就是多个文件 下载函数 // 下载tableDownload(row) {getuploadInventoryDownload({ sysBatch: row.sysBatch, fileName: row.fileName…