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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NOIP,CSP-J,CSP-S——树

一、树 概念: 节点、深度、路径、边 树的直径 真题: 答案:B 答案:A 一个树的边是n-1 现在是m,所以m-(n-1)=m-n+1

Elasticsearch 向量搜索

目标记录 ["你好&#xff0c;我的爱人","你好&#xff0c;我的爱妻","你好&#xff0c;我的病人","世界真美丽"] 搜索词 爱人 预期返回 ["你好&#xff0c;我的爱人","你好&#xff0c;我的爱妻"] 示例代码…

解决 vue activited 无效问题

当对页面APP.vue组件router-view标签使用了keep-alive之后在组件activated状态时不会发送请求&#xff0c;这时需要使用 keep-alive标签的 exclude属性排除需要重新发送请求的组件。需要注意exclude的值要和组件本身的name值要一致&#xff0c;如果不一致就会不生效。目前我出现…

element-ui checkbox 组件源码分享

简单分享 checkbox 组件&#xff0c;主要从以下三个方面来分享&#xff1a; 1、组件的页面结构 2、组件的属性 3、组件的方法 一、组件的页面结构 二、组件的属性 2.1 value / v-model 属性&#xff0c;绑定的值&#xff0c;类型 string / number / boolean&#xff0c;无…

46.continue语句

目录 一.continue语句 二.视频教程 一.continue语句 continue语句的作用和break语句很像&#xff0c;break语句会跳出当前循环&#xff0c;而continue语句则是跳出本次循环&#xff0c;继续执行下一次循环。 举个例子&#xff1a; #include <stdio.h>void main(void)…

想学网络安全,从哪里开始?网络安全的学习路线

网络安全学习路线&#xff1a; 想学习网络安全专业的知识&#xff0c;想当黑客&#xff0c;但是不知道该从哪里开始学。 我给你一个路线&#xff01; 清晰图片和大纲&#xff1a;https://docs.qq.com/doc/DU1lpVFpSbWVrd2p3

【每周精选资讯 | 第 1 期】2024-03-11 ~ 2024-03-17

前言 大家好&#xff0c;我是翼同学。这里是【每周精选资讯】的第一期内容。 GPT 递给我苹果 Figure展示了与OpenAI合作的最新进展&#xff0c;通过结合先进的神经网络&#xff0c;使机器人能够执行类似人类的快速、灵巧动作。主要功能包括描述周围环境、常识推理、将高层次…

Android ImageView以及实现截图

实现效果 截图前 截图后 代码 package cn.jj.huaweiad;import android.annotation.SuppressLint; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.View; import android.view.ViewGro…

螺旋矩阵的算法刷题

螺旋矩阵的算法刷题 本文主要涉及螺旋矩阵的算法 包括三个题目分别是 59. 螺旋矩阵 II54. 螺旋矩阵 中等LCR 146. 螺旋遍历二维数组 文章目录 螺旋矩阵的算法刷题一 、螺旋矩阵简单1.1 实现一&#xff08;我认为这个方法更巧妙&#xff01;&#xff01;&#xff09;1.2 实现二&…

Redis入门到实战-第十七弹

Redis实战热身t-digest篇 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#xff09;&#xff0c;用作数据库、缓存、消息代理…

2024最新华为OD机试试题库全 -【二叉树计算】- C卷

1. 🌈题目详情 1.1 ⚠️题目 给出一个二叉树如下图所示: 请由该二叉树生成一个新的二叉树,它满足其树中的每个节点将包含原始树中的左子树和右子树的和。 左子树表示该节点左侧叶子节点为根节点的一颗新树;右子树表示该节点右侧叶子节点为根节点的一颗新树。 1.2 �…

自养号测评,补单的五大关键要素

现在很多大卖都是自己管理几百个账号&#xff0c;交给服务商不是特别靠谱 第一 你不知道服务商账号质量怎么样 第二 账号一天下了多少你也不清楚&#xff0c;如果下了很多单万一封号被关联了怎么办 第三 你也不知道服务商用什么卡给你下单&#xff0c;用一些低汇率和黑卡下单…

运用开关量信号远程传输装置实现工厂智能化技改需要分几步走

DTD509H系列开关量信号无线传输器由一个无线信号发射终端和一个无线信号接收终端组成&#xff0c;也可以根据用户现场实现一点对多点或者多点对一点的无线控制。DTD509H系列开关量信号无线传输器可与PLC的IO端口、继电器、二次仪表、传感器等工业设备配套使用&#xff0c;运用无…

【前端Vue】社交信息头条项目完整笔记第2篇:二、登录注册,准备【附代码文档】

社交媒体-信息头条项目完整开发笔记完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;一、项目初始化使用 Vue CLI 创建项目,加入 Git 版本管理,调整初始目录结构,导入图标素材,引入 Vant 组件库,移动端 REM 适配,关于 , 配置文件,封装请求模块。十、用户关…

快速上手Spring Cloud 十四:璀璨物联网之路

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

Java项目:78 springboot学生宿舍管理系统的设计与开发

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统的角色&#xff1a;管理员、宿管、学生 管理员管理宿管员&#xff0c;管理学生&#xff0c;修改密码&#xff0c;维护个人信息。 宿管员管理公寓…

iOS - Runtime-API

文章目录 iOS - Runtime-API1. Runtime应用1.1 字典转模型1.2 替换方法实现1.3 利用关联对象给分类添加属性1.4 利用消息转发机制&#xff0c;解决方法找不到的异常问题 2. Runtime-API2.1 Runtime API01 – 类2.1.1 动态创建一个类&#xff08;参数&#xff1a;父类&#xff0…

轻松赚钱,精彩生活:上班族副业赚钱新攻略大揭秘!

薪水总是捉襟见肘&#xff0c;每月账单总让人倍感压力。你是否曾在静谧的夜晚&#xff0c;躺在床上&#xff0c;思索如何为家庭多赚一分钱&#xff1f;其实&#xff0c;你并不孤单。在这个充满机遇与挑战的时代&#xff0c;越来越多的人开始寻找副业&#xff0c;以期望让生活更…

Appium设备交互API

设备交互API指的是操作设备系统中的一些固有功能&#xff0c;而非被测程序的功能&#xff0c;例如模拟来电&#xff0c;模拟发送短信&#xff0c;设置网络&#xff0c;切换横竖屏&#xff0c;APP操作&#xff0c;打开通知栏&#xff0c;录屏等。 模拟来电 make_gsm_call(phon…

八数码问题

八数码难题 题目描述 在 3 3 3\times 3 33 的棋盘上&#xff0c;摆有八个棋子&#xff0c;每个棋子上标有 1 1 1 至 8 8 8 的某一数字。棋盘中留有一个空格&#xff0c;空格用 0 0 0 来表示。空格周围的棋子可以移到空格中。要求解的问题是&#xff1a;给出一种初始布局…