【.NET Core】深入理解IO - 读取器和编写器

【.NET Core】深入理解IO - 读取器和编写器

文章目录

  • 【.NET Core】深入理解IO - 读取器和编写器
    • 一、概述
    • 二、BinaryReader和BinaryWriter
      • 2.1 BinartReader类
      • 2.2 BinaryWriter类
    • 三、StreamReader和StreamWriter
      • 3.1 StreamReader类
      • 3.1 StreamWriter类
        • StreamWriter类构造函数
        • StreamWriter类属性
        • StreamWriter类常用方法
        • StreamWriter使用示例

在这里插入图片描述

一、概述

System.IO名空间还提供用于在流中读取和写入已编码字符的类型。 通常,流用于字节输入和输出。 读取器和编写器类型处理编码字符与字节之间的来回转换,以便流可以完成操作。 每个读取器和编写器类都与流关联,可以通过类的 BaseStream 属性进行检索。

System.IO常用一些常用的读取器和编写器类:

  • BinaryReaderBinaryWriter - 用于将基元数据类型作为二进制值进行读取和写入。
  • StreamReaderStreamWriter - 用于通过使用编码值在字符和字节之间来回转换来读取和写入字符。
  • StringReaderStringWriter - 用于从字符串读取字符以及将字符写入字符串中。
  • TextReaderTextWriter - 用作其他读取器和编写器(读取和写入字符和字符串,而不是二进制数据)的抽象基类。

下面的篇幅将详细介绍常用的读取器和编写器。

二、BinaryReader和BinaryWriter

C#提供比较全面对文件读写及其传输功能的类,在我们需要在字节级别上操作文件,却又不是一个字节一个字节的操作,通常是2个、4个或8个字节这样操作,这便有了BinaryReaderBinaryWriter类,它们可以将一个字符或数字按指定个数字节写入,也可以一次读取指定一个字节转为字符或数字。

2.1 BinartReader类

BinartReader类用特定的编码将基元数据类型读作二进制值

  • 常用的方法
序号方法说明
1Close关闭当前阅读器及基础流
2Read从基础流中读取字符,并提升流的当前位置
3ReadBytes从当前流将count个字节读入字节数组,并使当前位置提升count个字节
4ReadInt32从当前流中读取4个字节有符号整数,并使流的当前位置提升4个字节
5ReadString从当前流读取一个字符串。字符串有长度前缀,一次7位地被编码为整数
  • 示例
using (FileStream fs=new FileStream(path,FileMode.Open,FileAccess.Read))
{
   BinaryReader br = new BinaryReader(fs);
   //以二进制方式读取文件中的内容  
   bool b = br.ReadBoolean();
   double d = br.ReadDouble();
   float f = br.ReadSingle();
   int i = br.ReadInt32();
   string s = br.ReadString();
   //打印每个值
   Console.WriteLine("{0},{1},{2},{3},{4}",b,d,f,i,s);
   //关闭流
   br.Close();
   fs.Close();
}

2.2 BinaryWriter类

BinaryWriter 类以二进制形式将基元类型写入流,并支持用特定的编码写入字符串。

  • 常用的方法
序号方法说明
1Close关闭当前的BinaryWriter和基础流
2Seek设置当前流中的位置
3Write将值写入当前流
  • 示例
using (FileStream fs=new FileStream(path,FileMode.OpenOrCreate))
{
    BinaryWriter bw=new BinaryWriter(fs);
    //以二进制方式向创建的文件中写入内容   
    bw.Write(588);              //  整型  
    bw.Write(58.8f);            // 浮点型  
    bw.Write(58.8);             // double型  
    bw.Write(true);             // 布尔型  
    bw.Write("程序人生道可道");  // 字符串型  
    //关闭流
    bw.Close();
    fs.Close();
}

三、StreamReader和StreamWriter

C# 除了使用FileStream类读写文件,还提供专门处理文本文件的两个操作类StreamWriterStreamReader。这两个类从底层封装了文件流,读写时不用重新编码,提供了更文件的读写方式。

3.1 StreamReader类

StreamReader 用于读取标准文本文件中的信息,而 Stream 类用于字节输入和输出;StreamReader 除非另外指定,否则默认为 UTF-8 编码。如果使用属性获取当前字符编码,则 CurrentEncoding 该值在第一种方法之后才是可靠的 Read ,因为在首次调用方法之前不会进行编码自动检测 Read 。

StreamReader不是线程安全的,如果要使线程安全请使用TextReader.Synchronized

  • StreamReader属性
序号属性名说明
1BaseStream返回基础流
2CurrentEncoding获取当前 StreamReader 对象正在使用的当前字符编码
3EndOfStream获取一个值,该值指示当前的流位置是否在流结尾。
  • StreamReader方法
序号方法说明
1Close()关闭 StreamReader 对象和基础流,并释放与读取器关联的所有系统资源。
2DiscardBufferedData()清除内部缓冲区。
3Dispose(Boolean)关闭基础流,释放 StreamReader 使用的未托管资源,同时还可以根据需要释放托管资源。
4Peek()返回下一个可用字符,但不使用它
5Read(Char[], Int32, Int32)从指定的索引位置开始将来自当前流的指定的最多字符读到缓冲区。
6ReadLine()从当前流中读取一行字符并将数据作为字符串返回。
7ReadToEnd()读取来自流的当前位置到结尾的所有字符。
  • 示例
public async Task ReadAndDisplayFilesAsync()
{
    String filename = "TestFile1.txt";
    Char[] buffer;
    using (var sr = new StreamReader(filename)) {
        buffer = new Char[(int)sr.BaseStream.Length];
        await sr.ReadAsync(buffer, 0, (int)sr.BaseStream.Length);
    }
    Console.WriteLine(new String(buffer));
}

3.1 StreamWriter类

StreamWriter实现一个TextWriter,使其以一种特定的编码向流中写入字符;StreamWrite专用于特定编码的字符输出,而从派生的类 Stream 则设计用于字节输入和输出。StreamWriter 除非另外指定,否则默认为使用实例 UTF8Encoding。

  • StreamWriter类构造函数
序号构造函数说明
1StreamWriter(Stream)使用 UTF-8 编码及默认的缓冲区大小,为指定的流,初始化 StreamWriter 类的新实例
2StreamWriter(Stream, Encoding)使用指定的编码及默认的缓冲区大小,为指定的流,初始化 StreamWriter 类的新实例
3StreamWriter(Stream, Encoding, Int32)使用指定的编码及缓冲区大小,为指定的流,初始化 StreamWriter 类的新实例
4StreamWriter(String)用默认编码和缓冲区大小,为指定的文件初始化 StreamWriter 类的一个新实例
5StreamWriter(String, Boolean, Encoding)使用指定的编码和默认的缓冲区大小,为指定的文件,初始化 StreamWriter 类的新实例。 如果该文件存在,则可以将其覆盖或向其追加。 如果该文件不存在,此构造函数将创建一个新文件
6StreamWriter(String, Boolean, Encoding, Int32)使用指定编码和缓冲区大小,为指定路径上的指定文件,初始化 StreamWriter 类的新实例。 如果该文件存在,则可以将其覆盖或向其追加。 如果该文件不存在,此构造函数将创建一个新文件。
  • StreamWriter类属性
序号属性说明
1AutoFlush获取或设置一个值,该值指示 StreamWriter 在每次调用 Write(Char) 之后是否都将其缓冲区刷新到基础流
2BaseStream获取同后备存储连接的基础流
3Encoding获取在其中写入输出的 Encoding
4FormatProvider获取控制格式设置的对象
5NewLine获取或设置由当前 TextWriter 使用的行结束符字符串
  • StreamWriter类常用方法
序号方法说明
1Close关闭当前 StreamWriter 对象和基础流
2Dispose使所有缓冲数据写入基础流,释放 StreamWriter 使用的非托管资源,同时还可以根据需要释放受管理资源
3Flush清理当前写入器的所有缓冲区,并使所有缓冲数据写入基础流
4Write清理当前写入器的所有缓冲区,并使所有缓冲数据写入基础流
  • StreamWriter使用示例
string path = @"G:\GoyeerOutput\Version.txt";

using (StreamWriter StrWt = new StreamWriter(path, true))//true的作用是给文件新增字符,不覆盖
{
    StrWt.Write("5)使用StreamWriter写入的字符串");
}
using (StreamReader sr = new StreamReader(path))
{
    // 这允许您执行一次读取操作.
    Console.WriteLine(sr.ReadToEnd());
}

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

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

相关文章

【Datawhale组队学习:Sora原理与技术实战】Attention和LLM

Attention Attention 注意力,从两个不同的主体开始。 论文:https://arxiv.org/pdf/1703.03906.pdf seq2seq代码仓:https://github.com/google/seq2seq 计算方法: 加性Attention,如(Bahdanau attention&…

FL Studio2024中文版全新发布,水果音乐制作软件再升级

随着音乐制作技术的不断发展,FL Studio也在不断升级和完善。近日,备受期待的FL Studio2024中文版终于全新发布!这一版本的推出为广大音乐爱好者带来了更加丰富的音乐制作体验和更多创新功能。 FL Studio2024中文版在继承了之前版本强大功能的…

分享一本好书《大模型应用开发极简入门:基于GPT-4和ChatGPT》

如果问个问题:有哪些产品曾经创造了伟大的奇迹?ChatGPT 应该会当之无愧入选。仅仅发布 5 天,ChatGPT 就吸引了 100 万用户——当然,数据不是关键,关键是其背后的技术开启了新的 AI 狂潮,成为技术变革的点火…

没有硬件基础可以学单片机吗?

没有硬件基础可以学单片机吗? 在开始前我分享下我的经历,我刚入行时遇到一个好公司和师父,给了我机会,一年时间从3k薪资涨到18k的, 我师父给了一些 电气工程师学习方法和资料,让我不断提升自己&#xff0c…

以线缆行业为例,工业智能网关的实际应用及其带来的变革-天拓四方

工业智能网关是一种集数据采集、传输、处理和分析于一体的智能化设备。它能够实现对工业现场各种传感器、执行器等设备的数据进行实时采集,并通过网络传输到云端或本地数据中心进行分析处理。同时,工业智能网关还具备边缘计算能力,能够在本地…

uniapp开发android原生插件

一、下载原生开发SDK Android 离线SDK - 正式版 | uni小程序SDK (dcloud.net.cn)、 https://nativesupport.dcloud.net.cn/AppDocs/download/android.html 将开发uniappa原生android的插件解压到ben本地目录,目录结构如下: 接下就可以使用 UniPlugin-Hel…

Jenkins 的安装(详细教程)

文章目录 一、简介二、安装前准备三、windows 安装与启动1. 方式一2. 方式二3. 方式三 四、创建管理员用户五、常用设置1. 配置镜像地址2. 更改工作目录3. 开启可注册用户4. 全局变量配置 一、简介 官网:https://www.jenkins.io 中文文档:https://www.j…

钉钉h5应用 环境报错Error: Do not support the current environment:notInDingTalk

钉钉h5应用 环境报错 Error: Do not support the current environment:notInDingTalk problem Error: Do not support the current environment:notInDingTalk reason 前端页面运行在普通浏览器 solution 需要将h5页面在后台发布后,在钉…

如何清理Windows的磁盘空间?这里提供常规的和非常规的方法

驱动器越来越大,但无论你有固态硬盘(SSD)还是巨大的机械硬盘,它们似乎总是会装满。这些提示将帮助你释放Windows 10或Windows 11电脑内部存储空间。 运行磁盘清理 Windows包含一个内置工具,可以删除内部存储驱动器上的临时文件和其他不重要的数据。要访问它,右键单击“…

LeetCode.232. 用栈实现队列

题目 232. 用栈实现队列 分析 先了解一下栈和队列的特点: 栈:先进后出队列:先进先出 想用栈实现队列的特点,就需要使用两个栈。因为两个栈就可以将列表倒序。 假设第一个栈 s1 [1,2,3],第二个栈 s2 [] 。若循环…

Git分布式管理-头歌实验分支管理

一、创建本地分支-git branch 任务描述 当你进入一个团队,在获得产品的完整代码之后,你首先要做的就是,在本地创建一个属于自己的分支,然后才能在自己的分支上进行开发。 本关任务:在本地仓库创建一个新的分支&#xf…

面试问答总结之Java进阶

文章目录 🐒个人主页🏅JavaEE系列专栏📖前言:🎀注解Annotaion (java标注)🐕内置注解🐕元注解 🎀对象克隆🐕如何实现克隆🐕如何实现深克…

从零开始学习PX4源码2(PX4姿态误差计算)

目录 文章目录 目录摘要1.源码1.1源码路径1.2源码程序1.3源码功能 2.源码分析 摘要 本节主要记录PX4姿态误差计算过程,欢迎批评指正。 1.源码 1.1源码路径 PX4-Autopilot/src/modules/mc_att_control/AttitudeControl/AttitudeControl.cpp1.2源码程序 matrix::…

[项目设计] 从零实现的高并发内存池(三)

🌈 博客个人主页:Chris在Coding 🎥 本文所属专栏:[高并发内存池] ❤️ 前置学习专栏:[Linux学习] ⏰ 我们仍在旅途 ​ 目录 4.CentralCache实现 4.1 CentralCache整体架构 4.2 围绕Span的相关设计…

STM32CubeIDE基础学习-基础外设初始化配置

STM32CubeIDE基础学习-基础外设初始化配置步骤 前言 前面的文章介绍了基础工程的创建步骤,这篇文章就接着在基础工程的基础上来配置相关外设了,下面以STM32F103C8T6的主芯片为例进行简单配置。 基础工程创建步骤回顾 具体的配置步骤流程如下&#xff1…

使用git的小笔记

平时工作中使用git存储项目代码, 常用的命令 拉取仓库代码 git clone http://100.100.100.100:9080/my_test/test.git 拉取到以后, 先切换到自己的分支 git checkout my_name 一顿魔改代码 然后 add 新增的文件或者修改的文件 git add * 然后提交 并写…

美国和中国互相竞争的计算机(大脑)都由哪些东西组成

计算机基础 本章要点 -> 计算机的发展史 -> 计算机的分类 -> PC系统的组成 一 计算机的发展 1946年2月14日,在美国宾夕法尼亚大学,众所周知的世界上 第一台电子数字计算机ENIAC诞生 计算机发展至今,共经历了以下几个阶…

netlink原理及应用

什么是netlink netlink是一种基于网络的通信机制,允许内核内部、内核与用户态应用之间甚至用户态应用之间进行通信;netlink的主要作用是内核与用户态之间通信;它的思想是,基于BSD的socket使用网络框架在内核和用户态之间进行通信…

docker安装ES和kibana

文章目录 一、安装Elasticsearch1. 安装Elasticsearch2. 安装IK分词器3. elasticsearch-head 监控的插件4. 配置跨域 二、安装kibana 提示:以下是本篇文章正文内容,下面案例可供参考 一、安装Elasticsearch 1. 安装Elasticsearch 安装Elasticsearch参…

揭秘麦肯锡的方法:产品经理解决问题指南

您是否想知道世界上最成功的产品经理如何始终如一地提供不仅满足而且超出预期的解决方案?秘密可能就在于世界上最负盛名的咨询公司之一麦肯锡公司所磨练的方法论。本文深入探讨了麦肯锡的问题解决流程,该流程专为希望提升水平的产品经理量身定制。 01. 麦…