FileStreamやMemoryStreamといったクラスは各種データソースからの読み書きを実装・抽象化したものですが、Stream派生クラスの一部には他のStreamのラッパーとして動作するものが存在します。 このようなStream派生クラスでは、データソースとなるStreamをラップし、Streamからの読み書きに際してエンコード/デコードや暗号化/復号化などといったデータフォーマットの変換を行うものや、読み書きするデータのバッファリングを行うなどの機能を追加します。 ラッパーとなるStreamでは、データソースに対する読み書き自体は下位のStreamに行わせ、自身は読み書きする側とデータソースの間に入り追加の処理を行います。
例えば次のコードでは、CryptoStreamを使ってデータをBASE64形式にエンコードした上でFileStreamに書き込んでいます。
CryptoStreamを使ってデータをBASE64エンコードしてFileStreamに書き込む
using System;
using System.IO;
using System.Security.Cryptography;
class Sample {
static void Main()
{
// ファイルsample.datを開き、書き込みアクセスを行うためのFileStreamを作成する
using (var fileStream = new FileStream("sample.dat", FileMode.Create, FileAccess.Write)) {
// BASE64への変換を行った上でfileStreamに書き込みを行うCryptoStreamを作成する
using (var base64Stream = new CryptoStream(fileStream, new ToBase64Transform(), CryptoStreamMode.Write)) {
// 書き込むデータが格納されているバイト配列
var data = new byte[8] {0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48};
// データを書き込む
// CryptoStreamによりデータはBASE64にエンコードされ、次いで
// FileStreamによりエンコードされたデータがファイルに書き込まれる
base64Stream.Write(data, 0, 8);
}
}
}
}
sample.datに書き込まれる内容
QUJDREVGR0g=
このように、CryptoStreamを使うことで他のStreamに対してBASE64エンコードを行う機能を追加することができます。
CryptoStreamはBASE64形式でのエンコード・デコード以外にも、様々な形式での暗号化やフォーマット変換を行うために使われます。