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

news/2024/5/15 4:20:11

文章目录

    • 文本文件的读写探秘
      • 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.mrgr.cn/p/14014728

相关文章

Linux下TCP/IP编程--TCP实战

之前尝试过windows下的简单TCP客户端服务器编写,这次尝试下一下Linux环境下的TCP 客户端代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #incl…

短视频文案提取的简单实现

​过春风十里,尽荠麦青青。春天总是让人舒坦,而今年的三月,也因为与媳妇结婚十年,显得格外不同。两人奢侈的请了一天假,瞒着孩子,重游西湖,去寻找13年前的冰棍店(给当时还是同事的她买了最贵的一个雪糕-8元),去寻找13年前卖红豆钥匙扣的大爷(她送我了一个绿豆的钥匙…

Qt扫盲-QAssisant 集成其他qch帮助文档

QAssisant 集成其他qch帮助文档 一、概述二、Cmake qch例子1. 下载 Cmake.qch2. 添加qch1. 直接放置于Qt 帮助的目录下2. 在 QAssisant中添加 一、概述 QAssisant是一个很好的帮助文档&#xff0c;他提供了供我们在外部添加新的 qch帮助文档的功能接口&#xff0c;一般有两中添…

提高三维模型数据的立体裁剪技术

三维工厂K3DMaker是一款三维模型浏览、分析、轻量化、顶层合并构建、几何校正、格式转换、调色裁切等功能专业处理软件。可以进行三维模型的网格简化、纹理压缩、层级优化等操作,从而实现三维模型轻量化。轻量化压缩比大,模型轻量化效率高,自动化处理能力高;采用多种算法对…

AI与语音识别合成:开启智能交互新时代

引言:随着人工智能(AI)技术的不断发展,语音识别和语音合成成为了人机交互领域的重要组成部分。语音识别技术使得机器能够理解人类的语言,而语音合成则使得机器能够以人类自然的语音形式进行回应。本文将深入探讨AI与语音识别合成的技术原理、应用场景以及未来发展趋势。一…

前端学习-UI框架学习-Bootstrap5-007-图像形状

菜鸟教程链接 圆角效果rounded<img src="./img/537.jpeg" class="rounded" alt="圆角效果" height="236"> 椭圆rounded-circle<img src="./img/537.jpeg" class="rounded-circle" alt="拖延" …

机器学习之决策树现成的模型使用

目录 须知 DecisionTreeClassifier sklearn.tree.plot_tree cost_complexity_pruning_path(X_train, y_train) CART分类树算法 基尼指数 分类树的构建思想 对于离散的数据 对于连续值 剪枝策略 剪枝是什么 剪枝的分类 预剪枝 后剪枝 后剪枝策略体现之威斯康辛州乳…

【Learning eBPF-1】什么是 eBPF?为什么它很吊?

本系列为《Learning eBPF》一书的翻译系列。 (内容并非机翻,部分夹带私货)笔者学习自用,欢迎大家讨论学习。本书中, eBPF 被称为一种 革命性的 内核技术,被广泛应用于网络、观测 和 安全工具中。 这种技术允许你在不重新编译内核的情况下,使能你的自定义工具,与内核数据…

C语言数据输出和输入介绍

在C语言中&#xff0c;数据的输出和输入是程序与用户或外部环境进行交互的重要方式之一。通过数据的输出&#xff0c;程序可以向用户展示信息或结果&#xff1b;通过数据的输入&#xff0c;程序可以获取用户提供的数据或参数。本文将深入介绍C语言中数据输出和输入的相关知识&a…

Fiddler(6)AutoResponder,重定向

Fiddler最实用的功能, 它可以抓取在线页面保存到本地进行调试, 大大减少了在线调试的困难, 可以让我们修改服务器端返回的数据Enable rules 启用规则 Unmatched requests passthrough 没有匹配到的请求予以通过(建议开启;没开启时,规则匹配外的请求将失败,报HTTP 404错…

阿里通义千问Qwen1.5开源MoE模型

介绍 2024年3月28日&#xff0c;阿里团队推出了Qwen系列的首个MoE模型&#xff0c;Qwen1.5-MoE-A2.7B。它仅拥有27亿个激活参数&#xff0c;但其性能却能与当前最先进的70亿参数模型&#xff0c;如Mistral 7B和Qwen1.5-7B相媲美。相较于包含65亿个Non-Embedding参数的Qwen1.5-…

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

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

ChatGPT与传统搜索引擎的区别:智能对话与关键词匹配的差异

引言 随着互联网的快速发展&#xff0c;信息的获取变得比以往任何时候都更加便捷。在数字化时代&#xff0c;人们对于获取准确、及时信息的需求愈发迫切。传统搜索引擎通过关键词匹配的方式为用户提供了大量的信息&#xff0c;然而&#xff0c;这种机械式的检索方式有时候并不…

Day53:WEB攻防-XSS跨站SVGPDFFlashMXSSUXSS配合上传文件添加脚本

目录 MXSS UXSS&#xff1a;Universal Cross-Site Scripting HTML&SVG&PDF&SWF-XSS&上传&反编译(有几率碰到) SVG-XSS PDF-XSS Python生成XSS Flash-XSS 知识点&#xff1a; 1、XSS跨站-MXSS&UXSS 2、XSS跨站-SVG制作&配合上传 3、XSS跨站-…

新零售SaaS架构:客户管理系统的应用架构设计

客户管理系统的应用架构设计应用层定义了软件系统的应用功能,负责接收用户的请求,协调领域层能力来执行任务,并将结果返回给用户,功能模块包括:客户管理:核心功能模块,负责收集和更新客户信息,包括个人资料、联系方式、消费习惯、会员卡、归属信息(比如销售或顾问)和…

53、快速找出不同【ctrl+\】,失败

在英文状态下,按【ctrl+\】,但是这里查找的不精准,只能查找哪一行有不同,但是不能精准查找不同项是什么

基于SpringBoot和Vue的在线视频教育平台的设计与实现

今天要和大家聊的是一款基于SpringBoot和Vue的在线视频教育平台的设计与实现 &#xff01;&#xff01;&#xff01; 有需要的小伙伴可以通过文章末尾名片咨询我哦&#xff01;&#xff01;&#xff01; &#x1f495;&#x1f495;作者&#xff1a;李同学 &#x1f495;&…

从头开始,建立Neo4j图数据库,详细版

1、前提支持:Java的JDK,在使用Neo4j图数据库之前,电脑上首先要有JDK环境;如果没有下载过JDK请参考: (1)https://www.onlinedown.net/soft/10053430.htm(2)现在完成的资源如下所示:(3)通过解压-得到如下所示文件夹:这个文件夹名称很关键;(4)打开-系统属性 - 环境…

查看BAM文件头部信息

注意:里面会有包括参考序列的信息、排序顺序等等内容!