【.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
常用一些常用的读取器和编写器类:
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
类读写文件,还提供专门处理文本文件的两个操作类StreamWriter
和StreamReader
。这两个类从底层封装了文件流,读写时不用重新编码,提供了更文件的读写方式。
3.1 StreamReader类
StreamReader
用于读取标准文本文件中的信息,而 Stream 类用于字节输入和输出;StreamReader 除非另外指定,否则默认为 UTF-8 编码。如果使用属性获取当前字符编码,则 CurrentEncoding 该值在第一种方法之后才是可靠的 Read ,因为在首次调用方法之前不会进行编码自动检测 Read 。
StreamReader
不是线程安全的,如果要使线程安全请使用TextReader.Synchronized
。
- StreamReader属性
序号 | 属性名 | 说明 |
---|---|---|
1 | BaseStream | 返回基础流 |
2 | CurrentEncoding | 获取当前 StreamReader 对象正在使用的当前字符编码 |
3 | EndOfStream | 获取一个值,该值指示当前的流位置是否在流结尾。 |
- StreamReader方法
序号 | 方法 | 说明 |
---|---|---|
1 | Close() | 关闭 StreamReader 对象和基础流,并释放与读取器关联的所有系统资源。 |
2 | DiscardBufferedData() | 清除内部缓冲区。 |
3 | Dispose(Boolean) | 关闭基础流,释放 StreamReader 使用的未托管资源,同时还可以根据需要释放托管资源。 |
4 | Peek() | 返回下一个可用字符,但不使用它 |
5 | Read(Char[], Int32, Int32) | 从指定的索引位置开始将来自当前流的指定的最多字符读到缓冲区。 |
6 | ReadLine() | 从当前流中读取一行字符并将数据作为字符串返回。 |
7 | ReadToEnd() | 读取来自流的当前位置到结尾的所有字符。 |
- 示例
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。
序号 | 构造函数 | 说明 |
---|---|---|
1 | StreamWriter(Stream) | 使用 UTF-8 编码及默认的缓冲区大小,为指定的流,初始化 StreamWriter 类的新实例 |
2 | StreamWriter(Stream, Encoding) | 使用指定的编码及默认的缓冲区大小,为指定的流,初始化 StreamWriter 类的新实例 |
3 | StreamWriter(Stream, Encoding, Int32) | 使用指定的编码及缓冲区大小,为指定的流,初始化 StreamWriter 类的新实例 |
4 | StreamWriter(String) | 用默认编码和缓冲区大小,为指定的文件初始化 StreamWriter 类的一个新实例 |
5 | StreamWriter(String, Boolean, Encoding) | 使用指定的编码和默认的缓冲区大小,为指定的文件,初始化 StreamWriter 类的新实例。 如果该文件存在,则可以将其覆盖或向其追加。 如果该文件不存在,此构造函数将创建一个新文件 |
6 | StreamWriter(String, Boolean, Encoding, Int32) | 使用指定编码和缓冲区大小,为指定路径上的指定文件,初始化 StreamWriter 类的新实例。 如果该文件存在,则可以将其覆盖或向其追加。 如果该文件不存在,此构造函数将创建一个新文件。 |
序号 | 属性 | 说明 |
---|---|---|
1 | AutoFlush | 获取或设置一个值,该值指示 StreamWriter 在每次调用 Write(Char) 之后是否都将其缓冲区刷新到基础流 |
2 | BaseStream | 获取同后备存储连接的基础流 |
3 | Encoding | 获取在其中写入输出的 Encoding |
4 | FormatProvider | 获取控制格式设置的对象 |
5 | NewLine | 获取或设置由当前 TextWriter 使用的行结束符字符串 |
序号 | 方法 | 说明 |
---|---|---|
1 | Close | 关闭当前 StreamWriter 对象和基础流 |
2 | Dispose | 使所有缓冲数据写入基础流,释放 StreamWriter 使用的非托管资源,同时还可以根据需要释放受管理资源 |
3 | Flush | 清理当前写入器的所有缓冲区,并使所有缓冲数据写入基础流 |
4 | Write | 清理当前写入器的所有缓冲区,并使所有缓冲数据写入基础流 |
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());
}