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.hqwc.cn/news/576069.html

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

相关文章

jvm(HotSpotVM)学习记录

1&#xff1a;当我们写的java文件经过编译器编译后生成class文件。class文件里面包含了各种java语言规范的特定语法。可以通过javap -v -private xxx.class 例如&#xff1a; javap -v -private Gas.class Classfile /D:/project/ike-springboot-carbonzero-v2/springboot-bms…

探索智慧农业精准除草,基于高精度YOLOv5全系列参数【n/s/m/l/x】模型开发构建农田作物场景下杂草作物分割检测识别分析系统

智慧农业是未来的一个新兴赛道&#xff0c;随着科技的普及与落地应用&#xff0c;会有更加广阔的发展空间&#xff0c;关于农田作物场景下的项目开发实践&#xff0c;在我们前面的博文中也有很堵相关的实践&#xff0c;单大都是偏向于目标检测方向的&#xff0c;感兴趣可以自行…

多焦点图像融合文献学习(一)

本文介绍的是一篇明为"A convolutional neural network-based conditional random field model for structured multi-focus image fusion robust to noise."的文献&#xff0c;主要包括文献的摘要、前言摘选、主要贡献、网络结构、实验结果及结论等方面。 文献名称摘…

CorelDRAW25.0.0.230最新2024版本Crack下载安装方法

CorelDRAW (CDR)是一款专业的平面设计软件。本软件是由加拿大Corel公司开发的一款功能强大的专业平面设计软件、矢量设计软件、矢量绘图软件。本矢量图形制作工具软件广泛应用于商标设计、标志制作、封面设计、CIS设计、产品包装设计、模型绘制、插画绘制、时装/服装设计、印刷…

Linux——信号的保存与处理

目录 前言 一、信号的常见概念 1.信号递达 2.信号未决 3.信号阻塞 二、Linux中的递达未决阻塞 三、信号集 四、信号集的处理 1.sig相关函数 2.sigprocmask()函数 3.sigpending()函数 五、信号的处理时机 六、信号处理函数 前言 在之前&#xff0c;我们学习了信号…

最近Sentinel-2下载网站好像有点问题

最近Sentinel-2下载网站好像有点点问题&#xff0c;基本属于打不开的状态&#xff01; 这也难怪&#xff0c;Sentinel提供了全世界最好的免费遥感资源。其受欢迎程度可以想象的到&#xff01;这么多人访问网站&#xff0c;网站压力可以说是巨大的。这可是全世界的并发访问&…

C/C++语言学习路线: 嵌入式开发、底层软件、操作系统方向(持续更新)

初级&#xff1a;用好手上的锤子 1 【感性】认识 C 系编程语言开发调试过程 1.1 视频教程点到为止 1.2 炫技视频看看就行 1.3 编程游戏不玩也罢 有些游戏的主题任务就是编程&#xff0c;游戏和实际应用环境有一定差异&#xff08;工具、操作流程&#xff09;&#xff0c;在…

Haproxy2.8.1+Lua5.1.4部署,haproxy.cfg配置文件详解和演示

目录 一.快速安装lua和haproxy 二.配置haproxy的配置文件 三.配置haproxy的全局日志 四.测试负载均衡、监控和日志效果 五.server常用可选项 1.check 2.weight 3.backup 4.disabled 5.redirect prefix和redir 6.maxconn 六.调度算法 1.静态 2.动态 一.快速安装lu…

Excel 打开后提示:MicrosoftExcel无法计算某个公式。在打开的工作簿中有一个循环引用...

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 MicrosoftExcel无法计算某个公式。在打开的工作簿中有一个循环引用&#xff0c;但无法列出导致循环的引I用。请尝试编辑上次输入的公式&#xff0c;或利用“撤消”命令删除该公式&#xff0c;如下图&…

利用R语言和curl库实现网页爬虫的技术要点解析

R语言简介 R语言是一种自由、跨平台的编程语言和软件环境&#xff0c;专门用于统计计算和数据可视化。它具有丰富的数据处理、统计分析和图形展示功能&#xff0c;被广泛应用于数据科学、机器学习、统计建模等领域。 R语言技术优势 丰富的数据处理功能&#xff1a; R语言拥有…

comfyui 插件

Stable Diffusion ComfyUI 基础教程&#xff08;一&#xff09; ComfyUI安装与常用插件 - 知乎最近发现很多人在搬运我的文章&#xff0c;&#xff0c;&#xff0c;&#xff0c;那我也发 前言&#xff1a;相信大家玩 Stable Diffusion&#xff08;以下简称SD&#xff09;都是用…

【有芯职说】数字芯片BES工程师

一、 数字芯片BES工程师简介 今天来聊聊数字芯片BES工程师&#xff0c;其中BES是Back End Support的缩写&#xff0c;就是后端支持的意思。其实这个岗位是数字IC前端设计和数字IC后端设计之间的一座桥&#xff0c;完成从寄存器传输级设计到具体工艺的mapping和实现。这个岗位在…