バイナリ I / O

Stream・byte[]・File.ReadAllBytes・MemoryStreamとは

C#でファイルや画像、PDF、Excelファイルなどを扱う際によく登場するのが、Streambyte[]File.ReadAllBytesMemoryStreamです。

これらを理解すると、ファイルアップロード、画像処理、PDF保存、電子署名などの処理が理解しやすくなります。


Streamとは

Stream(ストリーム)は、データの流れを表すクラスです。

イメージとしては、水道管のようなものです。

ファイル
 ↓
Stream
 ↓
プログラム

ファイルやネットワークからデータを読み込んだり、書き込んだりする際に利用します。

Streamを利用する例

using FileStream stream =
    new FileStream(
        "sample.txt",
        FileMode.Open);

この時点では、ファイルそのものではなく、ファイルへの通路(Stream)を取得しています。


byte[]とは

byte[]はバイト配列です。

コンピュータが扱うデータは最終的にすべてバイト列になります。

例えば、

PDF
画像
Excel
ICカードデータ
動画
音声

これらはすべて内部ではbyte[]として扱えます。

byte[]の例

byte[] data =
{
    65,
    66,
    67
};

ASCIIコードとして解釈すると、

ABC

になります。


File.ReadAllBytesとは

File.ReadAllBytesは、ファイルを丸ごとbyte[]として読み込むメソッドです。

サンプル

byte[] pdfData =
    File.ReadAllBytes("sample.pdf");

実行後

sample.pdf
↓
byte[]

へ変換されます。

イメージ

PDFファイル
↓
File.ReadAllBytes
↓
byte[]

電子帳簿保存法システムやWebAPIでは頻繁に利用されます。


MemoryStreamとは

MemoryStreamはメモリ上に存在するStreamです。

通常のStreamはファイルを対象にします。

sample.pdf
↓
FileStream

MemoryStreamはファイルを使いません。

byte[]
↓
MemoryStream

メモリ上だけでデータを扱います。


MemoryStreamの利用例

byte[] data =
    File.ReadAllBytes("sample.pdf");

using MemoryStream ms =
    new MemoryStream(data);

この時、

sample.pdf
↓
byte[]
↓
MemoryStream

という流れになります。


MemoryStreamが活躍する場面

WebAPI

アップロードされたファイルを処理

using MemoryStream ms =
    new MemoryStream(fileBytes);

PDF生成

生成したPDFを一時保存

MemoryStream pdfStream =
    new MemoryStream();

電子署名

署名対象データをメモリ上で処理

byte[]
↓
MemoryStream
↓
署名処理

Stream・byte[]・MemoryStreamの関係

最も重要なのはこの関係です。

sample.pdf
↓
File.ReadAllBytes
↓
byte[]
↓
MemoryStream
↓
署名処理
↓
DB保存
↓
復元
↓
PDF出力

実際の業務システムでは、この流れで処理することがよくあります。


電子帳簿保存法システムの例

PDFファイル
↓
byte[]
↓
電子署名
↓
DB保存
↓
DB取得
↓
byte[]
↓
PDF復元

このような処理では、

  • File.ReadAllBytes
  • byte[]
  • MemoryStream
  • Stream

が頻繁に利用されます。


まとめ

項目役割
Streamデータの通路
FileStreamファイル用のStream
MemoryStreamメモリ上のStream
byte[]バイナリデータ
File.ReadAllBytesファイルをbyte[]へ変換

ファイル処理、画像処理、PDF処理、電子署名、WebAPI開発では、これらの知識は必須です。特に電子帳簿保存法FinTech関連システムでは、byte[]とMemoryStreamの理解が重要になります。