【.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常用一些常用的读取器和编写器类:
BinaryReader和BinaryWriter- 用于将基元数据类型作为二进制值进行读取和写入。StreamReader和StreamWriter- 用于通过使用编码值在字符和字节之间来回转换来读取和写入字符。StringReader和StringWriter- 用于从字符串读取字符以及将字符写入字符串中。TextReader和TextWriter- 用作其他读取器和编写器(读取和写入字符和字符串,而不是二进制数据)的抽象基类。
下面的篇幅将详细介绍常用的读取器和编写器。
二、BinaryReader和BinaryWriter
C#提供比较全面对文件读写及其传输功能的类,在我们需要在字节级别上操作文件,却又不是一个字节一个字节的操作,通常是2个、4个或8个字节这样操作,这便有了BinaryReader和BinaryWriter类,它们可以将一个字符或数字按指定个数字节写入,也可以一次读取指定一个字节转为字符或数字。
2.1 BinartReader类
BinartReader类用特定的编码将基元数据类型读作二进制值
- 常用的方法
| 序号 | 方法 | 说明 |
|---|---|---|
| 1 | Close | 关闭当前阅读器及基础流 |
| 2 | Read | 从基础流中读取字符,并提升流的当前位置 |
| 3 | ReadBytes | 从当前流将count个字节读入字节数组,并使当前位置提升count个字节 |
| 4 | ReadInt32 | 从当前流中读取4个字节有符号整数,并使流的当前位置提升4个字节 |
| 5 | ReadString | 从当前流读取一个字符串。字符串有长度前缀,一次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 类以二进制形式将基元类型写入流,并支持用特定的编码写入字符串。
- 常用的方法
| 序号 | 方法 | 说明 |
|---|---|---|
| 1 | Close | 关闭当前的BinaryWriter和基础流 |
| 2 | Seek | 设置当前流中的位置 |
| 3 | Write | 将值写入当前流 |
- 示例
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类读写文件,还提供专门处理文本文件的两个操作类StreamWriter和StreamReader。这两个类从底层封装了文件流,读写时不用重新编码,提供了更文件的读写方式。
3.1 StreamReader类
StreamReader 用于读取标准文本文件中的信息,而 Stream 类用于字节输入和输出;StreamReader 除非另外指定,否则默认为 UTF-8 编码。如果使用属性获取当前字符编码,则 CurrentEncoding 该值在第一种方法之后才是可靠的 Read ,因为在首次调用方法之前不会进行编码自动检测 Read 。
StreamReader不是线程安全的,如果要使线程安全请使用TextReader.Synchronized。
- StreamReader属性
| 序号 | 属性名 | 说明 |
|---|---|---|
| 1 | BaseStream | 返回基础流 |
| 2 | CurrentEncoding | 获取当前 StreamReader 对象正在使用的当前字符编码 |
| 3 | EndOfStream | 获取一个值,该值指示当前的流位置是否在流结尾。 |
- StreamReader方法
| 序号 | 方法 | 说明 |
|---|---|---|
| 1 | Close() | 关闭 StreamReader 对象和基础流,并释放与读取器关联的所有系统资源。 |
| 2 | DiscardBufferedData() | 清除内部缓冲区。 |
| 3 | Dispose(Boolean) | 关闭基础流,释放 StreamReader 使用的未托管资源,同时还可以根据需要释放托管资源。 |
| 4 | Peek() | 返回下一个可用字符,但不使用它 |
| 5 | Read(Char[], Int32, Int32) | 从指定的索引位置开始将来自当前流的指定的最多字符读到缓冲区。 |
| 6 | ReadLine() | 从当前流中读取一行字符并将数据作为字符串返回。 |
| 7 | ReadToEnd() | 读取来自流的当前位置到结尾的所有字符。 |
- 示例
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。
| 序号 | 构造函数 | 说明 |
|---|---|---|
| 1 | StreamWriter(Stream) | 使用 UTF-8 编码及默认的缓冲区大小,为指定的流,初始化 StreamWriter 类的新实例 |
| 2 | StreamWriter(Stream, Encoding) | 使用指定的编码及默认的缓冲区大小,为指定的流,初始化 StreamWriter 类的新实例 |
| 3 | StreamWriter(Stream, Encoding, Int32) | 使用指定的编码及缓冲区大小,为指定的流,初始化 StreamWriter 类的新实例 |
| 4 | StreamWriter(String) | 用默认编码和缓冲区大小,为指定的文件初始化 StreamWriter 类的一个新实例 |
| 5 | StreamWriter(String, Boolean, Encoding) | 使用指定的编码和默认的缓冲区大小,为指定的文件,初始化 StreamWriter 类的新实例。 如果该文件存在,则可以将其覆盖或向其追加。 如果该文件不存在,此构造函数将创建一个新文件 |
| 6 | StreamWriter(String, Boolean, Encoding, Int32) | 使用指定编码和缓冲区大小,为指定路径上的指定文件,初始化 StreamWriter 类的新实例。 如果该文件存在,则可以将其覆盖或向其追加。 如果该文件不存在,此构造函数将创建一个新文件。 |
| 序号 | 属性 | 说明 |
|---|---|---|
| 1 | AutoFlush | 获取或设置一个值,该值指示 StreamWriter 在每次调用 Write(Char) 之后是否都将其缓冲区刷新到基础流 |
| 2 | BaseStream | 获取同后备存储连接的基础流 |
| 3 | Encoding | 获取在其中写入输出的 Encoding |
| 4 | FormatProvider | 获取控制格式设置的对象 |
| 5 | NewLine | 获取或设置由当前 TextWriter 使用的行结束符字符串 |
| 序号 | 方法 | 说明 |
|---|---|---|
| 1 | Close | 关闭当前 StreamWriter 对象和基础流 |
| 2 | Dispose | 使所有缓冲数据写入基础流,释放 StreamWriter 使用的非托管资源,同时还可以根据需要释放受管理资源 |
| 3 | Flush | 清理当前写入器的所有缓冲区,并使所有缓冲数据写入基础流 |
| 4 | Write | 清理当前写入器的所有缓冲区,并使所有缓冲数据写入基础流 |
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());
}相关文章:
【.NET Core】深入理解IO - 读取器和编写器
【.NET Core】深入理解IO - 读取器和编写器 文章目录 【.NET Core】深入理解IO - 读取器和编写器一、概述二、BinaryReader和BinaryWriter2.1 BinartReader类2.2 BinaryWriter类 三、StreamReader和StreamWriter3.1 StreamReader类3.1 StreamWriter类StreamWriter类构造函数Str…...
【Java项目介绍和界面搭建】拼图小游戏——添加图片
🍬 博主介绍👨🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 …...
「MySQL」基本操作类型
🎇个人主页:Ice_Sugar_7 🎇所属专栏:数据库 🎇欢迎点赞收藏加关注哦! 数据库的操作 创建、显示数据库 使用 create 创建一个数据库 create database goods;然后可以用 show databases 来查看已经创建的数…...
Android 14 权限
问题Android 14 按照视频播放类的应用 无法获取到权限。 原因是从 Android 13 开始,如果你的应用程序 targetSdk 指定到了 33 或以上,那么 READ_EXTRERNAL_STORGE 权限就完全失去了作用,申请它将不会产生任何效果。 与此相对应的,…...
Springboot整合SSE实现实时消息推送
SSE详细介绍传送门:SSE实时消息推送 简单描述一下SSE推送在实际项目中应用的常见场景 1,项目页面中有消息通知板块,当信息有变化时,只有手动刷新页面,才会看到最新的数据,这里可以采用SSE技术实时推送最新…...
在pytorch中利用GPU训练神经网络时代码的执行顺序并提高训练效率
在pytorch中利用GPU训练神经网络时代码的执行顺序并提高训练效率 在 PyTorch 中,大多数操作在 GPU 上默认是异步执行的,但这并不意味着它们是并行执行的。要理解代码是同步还是异步执行,以及是串行还是并行执行,我们需要考虑几个…...
vue3学习
距离vue2学习已经一年度了,现在开始vue3的学习。 一、webpack (1)创建列表隔行变色项目及webpack使用: 新建项目空白目录,并运行npm init -y命令,初始化包管理配置文件package.json; 新建sr…...
毫秒生成的时间戳如何转化成东八区具体时间
假设现在有一个时间是1709101071419L 后端代码实现 Java代码(东八区时间) 在Java代码中,我们将时区从UTC调整为东八区(UTC8): import java.time.Instant; import java.time.ZoneId; import java.time.Z…...
02. Nginx入门-Nginx安装
Nginx安装 yum安装 编辑yum环境 cat > /etc/yum.repos.d/nginx.repo << EOF [nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck1 enabled1 gpgkeyhttps://nginx.org/keys/nginx_signing.key module_…...
leetcode73. 矩阵置零
链接见:https://leetcode.cn/problems/set-matrix-zeroes/description/ 题目描述 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 AC代码 class Solution { public:void setZeroes(vec…...
【中间件】RabbitMQ入门
📝个人主页:五敷有你 🔥系列专栏:中间件 ⛺️稳中求进,晒太阳 MQ的优劣: 优势 应用解耦:提升了系统容错性和可维护性异步提速:提升用户体验和系统吞吐量消峰填谷࿱…...
rtt的io设备框架面向对象学习-电阻屏LCD设备
目录 1.8080通信的电阻屏LCD设备1.1 构造流程1.2 使用2.i2c和spi通信的电阻屏LCD 电阻屏LCD通信接口有支持I2c、SPI和8080通信接口的。 1.8080通信的电阻屏LCD设备 lcd这块不像其他设备类,rtt没有实现的设备驱动框架层,那么是在驱动层直接实现的。 以…...
商城免费搭建之java商城 java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景
1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…...
蓝桥杯刷题--python-16
562. 壁画 - AcWing题库 Tint(input()) j1 while(j<T): N int(input()) ainput() s [0]*(N1) # 求前戳和 for i in range(1, N 1): s[i] int(a[i-1]) s[i - 1] # 枚举 # 区间 max_ float(-inf) k (N 2 - 1) // 2 for i in …...
闰年计算中的计算机Bug
不知道你有没有看过凯瑟琳泽塔琼斯主演的《偷天陷阱》,里面主题思想是用银行结算系统的千年虫bug,精心设计,盗取银行几十亿的精彩动作片。所谓2000 年千禧年的千年虫,其实就是计算机计算闰年的bug。 这个闰年计算的历史源远流长&…...
python水表识别图像识别深度学习 CNN
python水表识别,图像识别深度学习 CNN,Opencv,Keras 重点:项目和文档是本人近期原创所作!程序可以将水表图片里面的数据进行深度学习,提取相关信息训练,lw1.3万字重复15%,可以直接上交那种&…...
Java对接快递100实时快递单号查询API接口
目录 1.引入依赖 2.定义配置信息 3.模块结构 4.Controller 5.Service实现类 6.返回数据dto以及dto中的数据dto 7.测试运行 今天也是接到了这个任务,官网有小demo,可以下载下来参考test中代码 官方文档地址: 实时快递查询接口技术文档…...
Redis常见的15个【坑】,避坑指南
一、常见命令 1.1 过期时间意外丢失 原因: SET命令如果不设置过期时间,那么Redis会自动【擦除】这个key的过期时间 1.2 DEL命令阻塞redis key是String类型时,DEL时间复杂度是O(1)key是List/Hash/Set/ZSet类型,DEL时间复杂度是…...
04. Nginx入门-Nginx WEB模块
测试环境 此处使用的yum安装的Nginx路径。 此处域名均在本地配置hosts。 主配置文件 路径:/etc/nginx/nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;events {worker_connection…...
Python在信息安全领域中具有重要的作用
Python在信息安全领域中具有重要的作用。下面是几个方面的说明: 网络安全:Python提供了一系列用于网络安全的库和工具,例如Scapy、Nmap等。这些工具可以应用于漏洞扫描、网络流量分析、数据包嗅探等操作,帮助检测和防御网络攻击。…...
破解厂区防控难题:远程控制联网报警器的技术优势与应用实践
一、厂区安全防控的时代挑战与技术革新在工业生产规模化、厂区安全管理标准化的发展趋势下,厂区安全防控已成为企业生产运营的核心工作。我国正处于厂区安防从 "人工巡检为主" 向 "技防联动" 转型的关键阶段,据行业数据显示…...
2025届学术党必备的六大降重复率平台实际效果
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 人工智能生成内容也就是AIGC普及之后,文本检测系统变得越来越精密了。为了避免机…...
AA-PEG-C12/C16/C18,乙酸聚乙二醇月桂/棕榈/硬脂酸酯,一类结合了乙酸、聚乙二醇和长链烷基的化合物
一.名称英文名称:AA-PEG-C12/C16/C18,Acetic Acid-PEG-C12/C16/C18中文名称:乙酸聚乙二醇月桂/棕榈/硬脂酸酯,乙酸-PEG-月桂/棕榈/硬脂酸酯分子量:1k,2k,3.4k,5k,10k&…...
Tealdeer终极指南:5分钟掌握命令行工具的快速使用技巧
Tealdeer终极指南:5分钟掌握命令行工具的快速使用技巧 【免费下载链接】tealdeer A very fast implementation of tldr in Rust. 项目地址: https://gitcode.com/gh_mirrors/te/tealdeer Tealdeer是一个基于Rust语言开发的极速tldr客户端实现,为命…...
如何实现open62541与物联网协议集成:MQTT、CoAP和HTTP的完美结合
如何实现open62541与物联网协议集成:MQTT、CoAP和HTTP的完美结合 【免费下载链接】open62541 Open source implementation of OPC UA (OPC Unified Architecture) aka IEC 62541 licensed under Mozilla Public License v2.0 项目地址: https://gitcode.com/gh_mi…...
02-LangChain简单介绍、RAG开发
一、LangCain1、介绍LangChain由Harrison Chase创建于2022年10月,它是围绕LLMs(大语言模型)建立的一个框架。LangChain自身并不开发LLMs,它的核心理念是为各种LLMs实现通用的接口,把LLMs相关的组件“链接”在一起&…...
VS2022解决找不到属性管理器,只有属性窗口
曾几何时,属性管理器一般是在解决资源管理器旁边,但是被我删了,然后我就找不到了。 今天给他找出来。在这边鼠标滚轮往下滑点击属性管理器,然后点击添加命令,然后直接点击确定即可。此时视图中就有了属性管理器...
AI辅助开发:让快马AI成为你的编程搭档,智能生成健壮的msi安装管理类库
AI辅助开发:让快马AI成为你的编程搭档,智能生成健壮的msi安装管理类库 最近在开发一个需要处理软件安装包管理的项目,其中涉及到大量.msi文件的安装、卸载和状态检查。这类操作虽然标准化程度高,但实际开发中会遇到各种边界情况和…...
终极指南:3分钟快速掌握Logisim-evolution数字电路设计与仿真
终极指南:3分钟快速掌握Logisim-evolution数字电路设计与仿真 【免费下载链接】logisim-evolution Digital logic design tool and simulator 项目地址: https://gitcode.com/gh_mirrors/lo/logisim-evolution 想要学习数字电路设计却不知从何开始࿱…...
储能变流器双向软开关设计:从拓扑选型到控制策略的工程实现
一、储能PCS的技术挑战与设计目标1.1 储能系统的核心需求储能变流器(PCS)是实现电池与电网之间能量双向流动的关键设备,在充电模式下将电网交流电转换为直流电为电池充电,在放电模式下将电池直流电转换为交流电馈入电网或供给负载…...
