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

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

一、概述

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


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


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

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


二、BinaryReader和BinaryWriter

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

2.1 BinartReader类

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

  • 常用的方法
序号 方法 说明
1 Close 关闭当前阅读器及基础流
2 Read 从基础流中读取字符,并提升流的当前位置
3 ReadBytes 从当前流将count个字节读入字节数组,并使当前位置提升count个字节
4 ReadInt32 从当前流中读取4个字节有符号整数,并使流的当前位置提升4个字节
5 ReadString 从当前流读取一个字符串。字符串有长度前缀,一次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 类以二进制形式将基元类型写入流,并支持用特定的编码写入字符串

  • 常用的方法
序号 方法 说明
1 Close 关闭当前的BinaryWriter和基础流
2 Seek 设置当前流中的位置
3 Write 将值写入当前流
  • 示例
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属性
序号 属性名 说明
1 BaseStream 返回基础流
2 CurrentEncoding 获取当前 StreamReader 对象正在使用的当前字符编码
3 EndOfStream 获取一个值,该值指示当前的流位置是否在流结尾。
  • StreamReader方法

1717428843172.png

  • 示例
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类构造函数

1717428882906.png

  • StreamWriter类属性

1717428920945.png


  • StreamWriter类常用方法

1717428934610.png

  • 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());
}


目录
相关文章
|
1月前
|
Cloud Native API C#
C#的现代化:.NET Core引领的技术革命
【6月更文挑战第9天】`.NET Core引领C#现代化,实现跨平台革命,提升性能并支持云原生应用。异步编程模型优化体验,统一API简化开发流程。C#应用场景扩展,开发效率提高,技术创新加速,预示其未来在技术领域将持续发挥关键作用。`
32 10
|
5天前
|
开发框架 .NET API
.NET Core 和 .NET 标准类库项目类型有什么区别?
在 Visual Studio 中,可创建三种类库:.NET Framework、.NET Standard 和 .NET Core。.NET Standard 是规范,确保跨.NET实现的API一致性,适用于代码共享。.NET Framework 用于特定技术,如旧版支持。.NET Core 库允许访问更多API但限制兼容性。选择取决于兼容性和所需API:需要广泛兼容性时用.NET Standard,需要更多API时用.NET Core。.NET Standard 替代了 PCL,促进多平台共享代码。
|
11天前
|
开发框架 JSON .NET
|
15天前
|
开发框架 .NET Nacos
使用 Nacos 在 C# (.NET Core) 应用程序中实现高效配置管理和服务发现
使用 Nacos 在 C# (.NET Core) 应用程序中实现高效配置管理和服务发现
36 0
|
15天前
|
Java API Maven
探索Seata Core Context管理:io.seata.core.context.RootContext
探索Seata Core Context管理:io.seata.core.context.RootContext
7 0
|
16天前
|
存储 JSON NoSQL
技术心得记录:在.NETCore中使用CSRedis
技术心得记录:在.NETCore中使用CSRedis
11 0
|
17天前
|
SQL 开发框架 .NET
(20)ASP.NET Core EF创建模型(必需属性和可选属性、最大长度、并发标记、阴影属性)
(20)ASP.NET Core EF创建模型(必需属性和可选属性、最大长度、并发标记、阴影属性)
|
1月前
|
XML 开发框架 人工智能
C#/.NET/.NET Core拾遗补漏合集(24年5月更新)
C#/.NET/.NET Core拾遗补漏合集(24年5月更新)
|
1月前
|
开发框架 .NET API
ASP.NET Core Web中使用AutoMapper进行对象映射
ASP.NET Core Web中使用AutoMapper进行对象映射
|
1月前
|
开发框架 .NET Linux
【.NET Developer】已发布好的.NET Core项目文件如何打包为Docker镜像文件
该文介绍了如何不使用VS2019手动创建ASP.NET Core Blazor项目的Dockerfile并构建Docker镜像。首先,创建名为Dockerfile的文件,并复制提供的Dockerfile内容,该文件指定了基础镜像和工作目录。然后,通过CMD在项目目录下运行`docker build -t 自定义镜像名 .`来生成镜像。最后,使用`docker run`命令启动容器并验证项目运行。此外,文章还提到了将镜像推送到Azure Container Registry (ACR)的步骤。