C# 高级文件操作与异步编程探索(初步)

文章目录

    • 文本文件的读写探秘
      • StreamReader 类深度剖析
      • StreamWriter 类细节解读
        • 编码和中文乱码的解决方案
      • 二进制文件的读写
        • BinaryReader 类全面解析
        • BinaryWriter 类深度探讨
    • 异步编程与C#的未来方向
      • 同步与异步:本质解读
      • Task 的神奇所在
      • async/await 的魔法

在现代编程实践中,文件操作和异步编程无疑构成了软件开发的基础。对于C#开发者来说,准确掌握System.IO命名空间的细节,以及有效利用异步模式中的Taskasync/await是软件开发道路上至关重要的一步。本文将详细探讨C#中高效文件操作的模式、方法,及其在现代编程中的应用,并深入理解异步编程的功用和优势。

文本文件的读写探秘

阅读和书写文本文件看似简单的操作,实则五味杂陈。优秀的代码不仅能够处理文本,在性能和资源管理方面也得到充分优化。C# 为此提供了StreamReaderStreamWriter两个非常有力的类,让文本的读写变得既简单又高效。

StreamReader 类深度剖析

StreamReader 类是处理读取文本文件的强大工具。它继承自TextReader类,提供了丰富多样的方法用于读取字符流。以下为StreamReader类的方法摘要及其使用说明。

| 序号 | 方法名               | 描述                                            |
|------|---------------------|-------------------------------------------------|
|  1   | Close()             | 关闭 StreamReader,释放相关资源                |
|  2   | Peek()              | 返回下一个可用字符,但不消费                    |
|  3   | Read()              | 读取下一个字符,并按需移动字符的位置指针        |
|  4   | ReadToEnd()         | 读取从当前位置到流末尾的所有字符               |
|  5   | ReadLine()          | 读取当前行的数据,返回字符串                   |

示例代码用于阐明StreamReader的基本使用:

using (StreamReader sr = new StreamReader("example.txt", Encoding.UTF8))
{// 读取文件直至末尾var content = sr.ReadToEnd();Console.WriteLine(content);
}

StreamWriter 类细节解读

StreamReader相对应的是StreamWriter类,它将文本写入字符流。也继承自TextWriter类,它扮演着数据输出的角色。下面是一些StreamWriter常用的方法和示例:

| 序号 | 方法名               | 描述                                                   |
|------|---------------------|--------------------------------------------------------|
|  1   | Close()             | 关闭 StreamWriter,释放资源                            |
|  2   | Flush()             | 清空缓冲区内容,确保所有数据都写入基础流               |
|  3   | Write()             | 写入数据到流中                                         |
|  4   | WriteLine()         | 写入数据并在末尾加上换行符                             |

一个基本的StreamWriter使用示例:

using (StreamWriter sw = new StreamWriter("example.txt"))
{// 写入一些文本到文件sw.WriteLine("Hello, C# File IO!");sw.WriteLine("Another line.");
}
编码和中文乱码的解决方案

在处理不同语言字符时,尤其是中文字符,我们经常遇到乱码问题。解决这一问题的关键在于正确的编码方式。例如,要读取GB2312编码的文本文件,需先注册相应的编码提供程序:

// 在代码中注册全局编码提供程序
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);using (StreamReader sr = new StreamReader("C:/a.txt", Encoding.GetEncoding("GB2312")))
{var content = sr.ReadToEnd();Console.WriteLine(content);
}

在项目文件.csproj中引入相应的编码包:

<ItemGroup><PackageReference Include="System.Text.Encoding.CodePages" Version="4.7.1" />
</ItemGroup>

二进制文件的读写

当我们处理更加复杂的数据类型,如图像、音频或任何其他非文本格式,二进制读写就派上用场了。C#中的BinaryReaderBinaryWriter类提供了直接和简洁的方法来执行这项任务。

BinaryReader 类全面解析

对于BinaryReader,其主要用途是从二进制文件中按特定格式读取数据。以下是一些关键方法:

| 序号 | 方法名             | 描述                                       |
|------|-------------------|--------------------------------------------|
|  1   | Close()           | 关闭 BinaryReader 并释放资源              |
|  2   | ReadBoolean()     | 读取一个布尔值                            |
|  3   | ReadInt32()       | 从流中读取一个有符号32位整数              |
|  4   | ReadBytes(int n)  | 读取 n 个字节的数据                       |

读取二进制数据流的简单示例:

using (BinaryReader reader = new BinaryReader(File.Open("example.dat", FileMode.Open)))
{var booleanValue = reader.ReadBoolean();var intValue = reader.ReadInt32();var byteArray = reader.ReadBytes(10);
}
BinaryWriter 类深度探讨

BinaryWriter搭配BinaryReader使用,用于将数据写入二进制流。以下为其核心方法列表:

| 序号 | 方法名           | 描述                                       |
|------|-----------------|--------------------------------------------|
|  1   | Close()         | 关闭 BinaryWriter 并释放资源              |
|  2   | Write(bool v)   | 写入一个布尔值                             |
|  3   | Write(int v)    | 写入一个有符号32位整数                     |
|  4   | Write(byte[] v) | 写入字节数组                               |

实现二进制写操作的实例如下:

using (BinaryWriter writer = new BinaryWriter(File.Open("example.dat", FileMode.Create)))
{writer.Write(true);writer.Write(42);writer.Write(new byte[] { 1, 2, 3, 4 });
}

异步编程与C#的未来方向

.NET Framework 4.5之后,C#引入了asyncawait关键字,开启了异步编程的新纪元。异步编程的优势体现在它能够增强应用程序的响应性,优化资源的使用,并简化复杂的并发代码的编写。

同步与异步:本质解读

同步操作往往是阻塞性的,意味着直至当前操作完成,后续代码才能执行。相反,异步操作允许程序在等待操作完成的同时,继续处理其他任务。
在这里插入图片描述

Task 的神奇所在

Task类于.NET 4.0引入,标志着.NET并行编程模型的重大变革。下面透彻探讨Task的诸多方面:

| 序号 | 方法名          | 描述                                      |
|------|----------------|-------------------------------------------|
|  1   | Start()        | 开始执行任务                              |
|  2   | Run()          | 在任务调度器上异步执行任务                |
|  3   | Wait()         | 阻塞直至任务完成                          |
|  4   | Result         | 获取任务的结果(如果有)                  |

创建并运行Task的基本范例:

// 使用 Task 构造器
var task1 = new Task(() => SomeLongOperation());
task1.Start();// 使用 Task.Run 方法
var task2 = Task.Run(() => SomeLongOperation());
task2.Wait();

async/await 的魔法

asyncawait关键字让异步编程更加直观。async标记的方法表示该方法是异步的,await则表示程序应暂停执行当前方法,直至等待的Task完成。

public async Task<string> ReadFileAsync(string filePath)
{using (StreamReader sr = new StreamReader(filePath)){return await sr.ReadToEndAsync();}
}

觉得本篇文章写的还不错可以点赞,收藏,关注。主页有21天速通C#教程欢迎订阅!!!
在这里插入图片描述

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

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

相关文章

推动制药行业数字化转型:基于超融合架构的MES一体机解决方案

随着中国对信息化重视程度的不断加深&#xff0c;制药行业作为国民经济的重要支柱之一&#xff0c;也在积极寻求通过数字化手段提升产业效率与产品质量。自党的十六大提出“以信息化带动工业化”的战略以来&#xff0c;制药业的这一转型探索尤为迫切。 在现代制药生产中&#…

【已修复】iPhone13 Pro 长焦相机水印(黑斑)修复 洗水印

iPhone13 Pro 长焦相机水印&#xff08;黑斑&#xff09;修复 洗水印 问题描述 iPhone13 Pro 后摄3倍相机有黑色斑点&#xff08;水印&#xff09;&#xff0c;如图所示&#xff0c; 后摄相机布局如图所示&#xff0c; 修复过程 拆机过程有风险&#xff0c;没有把握最好不要…

芒果YOLOv8改进145:全新风格原创YOLOv8网络结构解析图

&#x1f4a1;本篇分享一下个人绘制的原创全新风格 YOLOv8网络结构图 感觉搭配还行&#xff0c;看着比较直观。 该专栏完整目录链接&#xff1a; 芒果YOLOv8深度改进教程 订阅了专栏的读者 可以获取一份 <可以自行修改 / 编辑> 的 YOLOv8结构图修改源文件 YOLOv8结构图…

HackTheBox-Machines--Legacy

文章目录 1 端口扫描2 测试思路3 445端口漏洞测试4 flag Legacy 测试过程 1 端口扫描 nmap -sC -sV 10.129.227.1812 测试思路 目标开启了135、139、445端口&#xff0c;445 SMB服务存在很多可利用漏洞&#xff0c;所以测试点先从445端口开始。而且在Nmap扫描结果中&#xff0c…

项目四-图书管理系统

1.创建项目 流程与之前的项目一致&#xff0c;不再进行赘述。 2.需求定义 需求: 1. 登录: ⽤⼾输⼊账号,密码完成登录功能 2. 列表展⽰: 展⽰图书 3.前端界面测试 无法启动&#xff01;&#xff01;&#xff01;--->记得加入mysql相关操作记得在yml进行配置 配置后启动…

量化交易入门(二十五)什么是RSI,原理和炒股实操

前面我们了解了KDJ&#xff0c;MACD&#xff0c;MTM三个技术指标&#xff0c;也进行了回测&#xff0c;结果有好有坏&#xff0c;今天我们来学习第四个指标RSI。RSI指标全称是相对强弱指标(Relative Strength Index),是通过比较一段时期内的平均收盘涨数和平均收盘跌数来分析市…

3.28总结

1.java学习记录 1.方法的重载 重载换而言之其实就是函数名不变&#xff0c;但是其中的参数需要改变&#xff0c;可以三个方面改变&#xff08;参数类型&#xff0c;参数顺序&#xff0c;参数个数这三个方面入手&#xff0c;这样可以运用的&#xff09; 但是&#xff1a;注意…

2024.3.21|华北水利水电大学江淮校区ACM社团训练赛

2024.3.21|华北水利水电大学江淮校区ACM社团训练赛 1.数字拆解 2.矩阵修改 3.因子数 4.回文数 5.中位数 心有猛虎&#xff0c;细嗅蔷薇。你好朋友&#xff0c;这里是锅巴的C\C学习笔记&#xff0c;常言道&#xff0c;不积跬步无以至千里&#xff0c;希望有朝一日我们积累的滴…

springboot+vue在idea上面的使用小结

1.在mac上面删除java的jdk方法&#xff1a; sudo rm -rfjdk的路径 sudo rm -rf /Users/like/Library/Java/JavaVirtualMachines/corretto-17.0.10/Contents/Home 2.查询 Mac的jdk版本和路径&#xff1a; /usr/libexec/java_home -V 3.mac上面查询和关闭idea的网页端口&…

快速上手Spring Cloud五:Spring Cloud与持续集成/持续部署(CI/CD)

快速上手Spring Cloud 一&#xff1a;Spring Cloud 简介 快速上手Spring Cloud 二&#xff1a;核心组件解析 快速上手Spring Cloud 三&#xff1a;API网关深入探索与实战应用 快速上手Spring Cloud 四&#xff1a;微服务治理与安全 快速上手Spring Cloud 五&#xff1a;Spring …

samba实现linux共享文件夹

一、samba安装 sudo apt install samba 二、配置Samba 编辑Samba配置文件sudo vi /etc/samba/smb.conf 在文件末尾添加以下内容&#xff0c;设置一个简单的共享目录&#xff08;替换path_to_share为实际的共享目录路径&#xff09;&#xff1a; [Share] path /path_to_sha…

鱼眼相机的测距流程及误差分析[像素坐标系到空间一点以及测距和误差分析]

由于最近在整理单目测距的内容&#xff0c;顺手也总结下鱼眼相机的测距流程和误差分析&#xff0c;如果有错误&#xff0c;还请不吝赐教。 参考链接: 鱼眼镜头的成像原理到畸变矫正&#xff08;完整版&#xff09; 相机模型总结&#xff08;针孔、鱼眼、全景&#xff09; 三维…

Unity照片墙简易圆形交互效果总结

还要很多可以优化的点地方&#xff0c;有兴趣的可以做 比如对象的销毁和生成可以做成对象池&#xff0c;走到最左边后再移动到最右边循环利用 分析过程文件&#xff0c;采用Blender&#xff0c;资源已上传&#xff0c;可以播放动画看效果&#xff0c;下面截个图&#xff1a; …

关系型数据库mysql(8)sql高级语句②

目录 一.子查询——Subquery 语法 环境准备 In——查询已知的值的数据记录 子查询——Insert 子查询——Update 子查询——Delete Not In——表示否定&#xff0c;不在子查询的结果集里 Exists——判断查询结果集是否为空 子查询——别名 ​编辑 二.视图 理论&a…

图论之路径条数专题

一直忙着金工实习蓝桥杯&#xff0c;好久没有看图论了&#xff0c;今天就小试几题享受下被虐的快感。 1.最短路拓扑 首先来几个结论&#xff1a; 1.最短路图没有环&#xff08;可以用反证法证明&#xff09; 2.dis[u]edge[u,v]dis[v]&#xff0c;那么u,v端点的边一定在最短路…

selenium自动化测试

selenium自动化测试 1、Javaselenium环境搭建2、测试&#xff0c;打开任意网页3、selenium 常见的Api3.1元素定位findElement3.1.1 css 选择语法3.1.2 xpath 选择语法 1、Javaselenium环境搭建 下载chromedriver&#xff0c;版本要与Chrome浏览器版本一致。 下载之后将chro…

第P1周:实现mnist手写数字识别

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制](https://mtyjkh.blog.csdn.net/)** 目录 一、前言 二、我…

vant checkbox 复选框 样式改写

修改前 修改后 基于 vant&#xff1a; 4.8.3 unocss: 0.53.4 <van-checkbox-group v-model"query.zczb" shape"square" class"text-16 w-100% flex flex-wrap"><template v-for"item in registerCapitalOption"><v…

LeetCode 27 移除元素

给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面…

“预防儿童烧烫伤”科普安全课堂走进嘉鱼县第一小学

为提高嘉鱼县儿童烧烫伤安全意识、隐患识别能力以及突发应急处置能力&#xff0c;3月26日下午&#xff0c;在中国社会福利基金会烧烫伤关爱公益基金、嘉鱼县妇女联合会、嘉鱼县教育局的支持下&#xff0c;嘉鱼县蒲公英社会工作服务中心走进嘉鱼县第一小学开展预防儿童烧烫伤科普…