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

news2024/12/22 23:49:13

【.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.coloradmin.cn/o/1489606.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI大语言模型【成像光谱遥感技术】ChatGPT应用指南

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境,是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型,在理解和生成人类语言方面表现出了非凡的能力。本文重点介绍ChatGPT在遥感中的应用,人工智能…

想学习FPGA,建议购买哪一款开发板呢?

FPGA项目: 多通道信号采集呈像系统 该系统是以Artix-7系列的FPGA为主控芯片,设计并实现了一款基于A7系列开发板的多通道信号采集呈像系统,该设计采用DAC芯片(数模转换芯片)将数字信号转换成模拟信号,通过…

LLM春招,搜广推,nlp(2)

Encoder和Decoder怎么交互的 decoder里面的K,V输入用的是encoder的输出,并不是共享了K, V参数,decoder每层的参数都是独立的。Decoder每层是有两块Attention的:一块是正常的Self-Attention,QKV的输入都来自Decoder上一…

ArcGIS学习(九)选址分析

ArcGIS学习(九)选址分析 本任务给大家带来的案例是租房选址分析。选址分析是我们平时经常接触到的分析场景。概括起来说,选址分析就是根据选址条件来确定哪些区域满足我们的选址要求。首先,先来看看我们这个案例的场景和基础数据。我们以某个城市某一租客的租房选址为例。…

STM32CubeMX学习笔记8 -ADC

1. ADC简介 ADC 是Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。简单地说就是将模拟电压值,转换成对应的肉眼…

完结撒花~Matlab论文插图绘制模板第139期—罗盘图

2021年2月2日,Matlab论文插图绘制模板第1期,启动。 三年后…… 2024年3月4日,Matlab论文插图绘制模板第139期,完结。 别的也不多说了,《Matlab论文插图绘制模板》1-139期精修合集,正加速整理制作中&…

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

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

mac下终端命令提示补全

欢迎来到我的博客,代码的世界里,每一行都是一个故事 mac下终端命令提示补全 前言Zsh-autosuggestions原理解析:智能提示的工作方式1. 命令历史分析:2. 智能提示生成:3. 用户交互和选择:4. 配置和个性化&…

Java集合框架-Collection和Map

文章目录 Collection-单列集合特点ListArrayListLinkedListVecter SetHashSetTreeSet Map-键值对集合特点Map常用APIput添加细节remove Map的三种遍历方式1.通过键找值2.通过"键值对"3.Lambda表达式foreach源码 HashMap需求 为什么要使用泛型 泛型的优点1.集合中存储…

《精益DevOps》译者序

计算机网络的发展导致了IT领域中的两个重要发展——虚拟化和分布式计算,云服务是虚拟化的一个直接体现,而微服务架构则是分布式计算的一个重要应用领域。不论是虚拟化还是分布式计算,都对软件工程中的研发效能提出了新的问题和挑战&#xff0…

Linux x86平台获取sys_call_table

文章目录 前言一、根据call *sys_call_table来获取二、使用dump_stack三、根据MSR_LSTAR寄存器四、使用sys_close参考资料 前言 Linux 3.10.0 – x86_64 最简单获取sys_call_table符号的方法: # cat /proc/kallsyms | grep sys_call_table ffffffff816beee0 R sy…

实名制交友-智能匹配-仿二狗交友系统-TP6+uni-APP小程序H5公众号-源码交付-支持二开!

一、代码风格 通常不同的开发者具备不同的代码风格,但为了保证语音交友系统开发质量,在编码前需要进行代码风格的统一,通过制定一定的规则,约束开发者的行为。具有统一风格的代码才能更清晰、更完整、更容易理解、更方便后期维护…

互联网加竞赛 车道线检测(自动驾驶 机器视觉)

0 前言 无人驾驶技术是机器学习为主的一门前沿领域,在无人驾驶领域中机器学习的各种算法随处可见,今天学长给大家介绍无人驾驶技术中的车道线检测。 1 车道线检测 在无人驾驶领域每一个任务都是相当复杂,看上去无从下手。那么面对这样极其…

AURIX CSA(上下文存储)介绍(续写中...)

1.CSA概述 CSA(Context Save Areas)上下文存储区域,每次函数调用、进入中断、进入Trap都会存CSA对象,便于退出时候恢复。每个CSA对象的大小为固定的64字节。最大可以支持分配为2^164M。 2.GPRs寄存器 32个通用寄存器(GPRs) 16个…

Redis缓存【重点】

参考链接 https://xiaolincoding.com/redis/cluster/cache_problem.html#%E7%BC%93%E5%AD%98%E9%9B%AA%E5%B4%A9 目录 缓存雪崩大量数据同时过期Redis 故障宕机 缓存击穿第一种方案,非法请求的限制第二种方案,缓存空值或者默认值第三种方案,使…

回溯算法套路②组合型回溯+剪枝【基础算法精讲 15】

学习地址 : 回溯算法套路②组合型回溯剪枝【基础算法精讲 15】_哔哩哔哩_bilibili 回顾 : 从n 个数中选出k个数的组合 , 可以看成是长度固定的子集 ; 剪枝技巧 : 77 . 组合 链接 : . - 力扣(LeetCode) 枚举下一个元素选…

嵌入式中volatile关键字的使用方法

Hi,大家好! 今天我们来学习一下volatile关键字,volatile关键字想必大家在平时编程中都见过或用过。可是小伙伴们有没有想过什么时候需要使用volatile关键字吗? 在C语言中,volatile是一个关键字,用于告诉编译器不要优化…

【MATLAB第97期】基于MATLAB的贝叶斯Bayes算法优化BiGRU双向门控循环单元的多输入单输出回归预测模型,含GRU与BiGRU多层结构优化选择

【MATLAB第97期】基于MATLAB的贝叶斯Bayes算法优化BiGRU双向门控循环单元的多输入单输出回归预测模型,含GRU与BiGRU结构层数优化 前言 前面在【MATLAB第10期】讲解了基于贝叶斯Bayes算法优化LSTM长短期记忆网络的多输入单输出回归预测模型。 本次模型难点包括&am…

ChatGPT数据分析应用——热力图分析

ChatGPT数据分析应用——热力图分析 ​ 热力图分析既可以算作一种可视化方法,也可以算作一种分析方法,主要用于直观地展示数据的分布情况。接下来我们让ChatGPT解释这个方法的概念并提供相应的案例。发送如下内容给ChatGPT。 ​ ChatGPT收到上述内容后&…

[linux]shell脚本语言:变量、测试、控制语句以及函数的全面详解

一、shell的概述 1、shell本质是脚本文件:完成批处理。 shell脚本是一种脚本语言,我们只需使用任意文本编辑器,按照语法编写相应程序,增加可执行权限,即可在安装shell命令解释器的环境下执行。shell 脚本主要用于帮助开…