当前位置: 首页 > news >正文

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#教程欢迎订阅!!!
在这里插入图片描述

相关文章:

  • 计算机组成原理 — 指令系统
  • AI颠覆,倒计时
  • Wagtail-基于Python Django的内容管理系统CMS实现公网访问
  • iOS客户端自动化UI自动化airtest+appium从0到1搭建macos+脚本设计demo演示+全网最全最详细保姆级有步骤有图
  • dockers compose up 报no configuration file provided: not found
  • 【Bug-ModuleNotFoundError: No module named ‘models‘】
  • Android Databinding 使用教程
  • SQLite数据库文件损坏的可能几种情况(一)
  • 指针数组的有趣程序【C语言】
  • EasyExcel Converter实现java对象和excel单元格转换
  • postgres12.4安装pg_rman-1.3.16
  • Kafka系列之:Exactly-once support
  • Python操作Sqlite的简单封装
  • JAVA------基础篇
  • 2024年03月CCF-GESP编程能力等级认证C++编程五级真题解析
  • ➹使用webpack配置多页面应用(MPA)
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Android组件 - 收藏集 - 掘金
  • angular学习第一篇-----环境搭建
  • C++入门教程(10):for 语句
  • canvas 绘制双线技巧
  • canvas 五子棋游戏
  • es的写入过程
  • HTTP中GET与POST的区别 99%的错误认识
  • JAVA SE 6 GC调优笔记
  • Javascript基础之Array数组API
  • Laravel Mix运行时关于es2015报错解决方案
  • Vue实战(四)登录/注册页的实现
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 蓝海存储开关机注意事项总结
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 前端js -- this指向总结。
  • 前端代码风格自动化系列(二)之Commitlint
  • 前端之React实战:创建跨平台的项目架构
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 正则表达式小结
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 如何正确理解,内页权重高于首页?
  • ​【已解决】npm install​卡主不动的情况
  • #Lua:Lua调用C++生成的DLL库
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (三)mysql_MYSQL(三)
  • (十一)图像的罗伯特梯度锐化
  • (算法设计与分析)第一章算法概述-习题
  • (一) storm的集群安装与配置
  • (转)可以带来幸福的一本书
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。