Skip to content

.NET Core 实战 [No.253~259] 流

🏷️ 《.NET Core 实战》

,是输入/输出操作中很常用的一种类型,它表示 数据内容的字节按照顺序进行排列

内存流(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:一次性读取所有文本。

如何判断读取指针已经到了流的末尾:

  1. 调用 Peek 方法。该方法会读取下一个字符,但不会执行读取。如果没有可用字符,方法返回 -1
  2. 检查 ReadReadLine 方法的返回值。
    • 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 个精彩案例》 -- 周家安 著