ここまでの例で挙げたFileStreamはファイルに対する読み書きを行うためのストリームですが、他にもStreamの一種としてバイト配列をストリームとして扱い読み書きを行うためのMemoryStreamが用意されています。

MemoryStreamとStreamReaderを使ってバイト配列から文字列を読み込む
using System;
using System.IO;
using System.Text;

class Sample {
  static void Main()
  {
    // 何らかのデータが格納されているバイト配列を想定
    byte[] data = new byte[32];

    // バイト配列を読み取り専用のストリームとして扱うMemoryStreamを作成する
    using (MemoryStream stream = new MemoryStream(data, false)) {
      // テキストエンコーディングにUTF-8を用いてstreamの読み込みを行うStreamReaderを作成
      StreamReader reader = new StreamReader(stream, Encoding.UTF8);

      // streamから文字列を一行分読み込み、表示する
      string line = reader.ReadLine();

      Console.WriteLine(line);
    }
  }
}

このように、入力ソースがFileStreamであってもMemoryStreamであっても、実際に読み込みを行う部分のコードはどちらも同じです。 StreamReader・StreamWriterやBinaryReader・BinaryWriterといったユーティリティクラスでは、データがファイルとして存在するのか、バイト配列として存在するのかといった違いがあっても、それらがStreamである限りはいずれも同じように扱うことができます。

StreamReader・StreamWriterやBinaryReader・BinaryWriter以外にもStreamを使った読み取り・書き込みをサポートしているクラスは多数あります。 これらのクラスでは、Streamクラスをサポートすることによりファイルやメモリ以外の入力ソースにも幅広く柔軟に対応できるようになっています。