.NET Core 实战 [No.253~259] 流
流,是输入/输出操作中很常用的一种类型,它表示 数据内容的字节按照顺序进行排列。
内存流(MemoryStream)
内存流,即从内存中划分出一个特定区域,应用程序可以将字节序列存放到这个区域中。内存流很适合用于读写临时数据。
MemoryStream
类封装了一系列操作内存流的方法。
下面的示例代码展示了 MemoryStream
类的如下功能:
- 写入内容至内存流
- Write 方法
- 两种读取内存流内容的方法
- ToArray 方法
- Read 方法
- 重置内存流的当前位置
- Seek 方法
- Position 属性(0 表示流的开始)
csharp
using (MemoryStream stream = new MemoryStream())
{
// 写入内容
byte[] buffer = { 19, 90, 1, 18, 12, 0 };
stream.Write(buffer, 0, buffer.Length);
// 从流中重新提取字节数组
var array = stream.ToArray();
Console.WriteLine(BitConverter.ToString(array)); // 13-5A-01-12-0C-00
// 将读写指针复位
stream.Position = 0L;
buffer = new byte[stream.Length];
// 从流中读取刚刚写入的字节
stream.Read(buffer, 0, buffer.Length);
Console.WriteLine(BitConverter.ToString(buffer)); // 13-5A-01-12-0C-00
// 使用 Seek 方法重新设置流的当前位置
stream.Seek(2, SeekOrigin.Begin);
buffer = new byte[2];
for (int i = 0; i < 2; i++)
{
Console.Write($" ox{stream.ReadByte():x2}"); // ox01 ox12
}
Console.WriteLine();
buffer = new byte[2];
stream.Read(buffer, 0, buffer.Length);
Console.WriteLine(BitConverter.ToString(buffer)); // 0C-00
// 使用 Position 属性也可以更改流的当前位置
stream.Position = 2L;
buffer = new byte[stream.Length - 2];
stream.Read(buffer, 0, buffer.Length);
Console.WriteLine(BitConverter.ToString(buffer)); // 01-12-0C-00
}
StreamWriter & StreamReader
使用 StreamWriter
& StreamReader
写入和读取文本文件
StreamWriter
支持以流的形式将内容写入文件。StreamWriter
默认采用 UTF-8 编码,可以在初始化时指定编码格式。StreamWriter
适用于各种类型的流,如内存流、文件流等。
常用写入方法:
- Write
- WrrteLine:自动在写入的内容后面追加换行符
csharp
// 使用 StreamWriter 类将文本写入文件
using (StreamWriter writer = new StreamWriter("abc.txt"))
{
writer.WriteLine(1990);
writer.Write(1.18M);
writer.Write("test");
writer.WriteLine(false);
writer.Write(DateTime.Today);
}
StreamReader
以文本形式读取流中的内容。
常用的读取方法如下:
- Read:读取一个字符,以
int
类型返回;此方法的其它重载支持读取多个字符,结果储存在char
数组中。 - ReadLine:每次读取一行。
- ReadToEnd:一次性读取所有文本。
如何判断读取指针已经到了流的末尾:
- 调用 Peek 方法。该方法会读取下一个字符,但不会执行读取。如果没有可用字符,方法返回 -1 。
- 检查 Read 或 ReadLine 方法的返回值。
- ReadLine 方法返回值为 null
- Read 方法的返回值为 -1
csharp
// 使用 StreamReader 类读取文本文件
using (StreamReader reader = new StreamReader("abc.txt"))
{
string line = null;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
参考:《.NET Core 实战:手把手教你掌握 380 个精彩案例》 -- 周家安 著