ストリームについて
ストリーム(英: stream)は、データを小さな単位で連続的に処理する技法です。この技法では、データが上流から下流に「流れる」形で扱われます。ストリームは、途中段階での滞留を最小限に抑え、低遅延でデータの
入出力や送受信を行います。データ処理の内部では、適切なデータ分割やバッファリングが行われ、効率的な情報処理が可能となります。
ストリームには主に二つの種類があります。ひとつは、入力ストリーム(input stream)で、データの読み出しに使用されます。もうひとつは、出力ストリーム(output stream)で、データの書き込みを行います。データ保存の形式としては、ファイルや
データベースが対照的に存在します。
ストリームは、メモリバッファの
入出力やネットワーク通信など、さまざまな用途に利用されています。ファイルの
入出力に関しては、ストリームとの変換メカニズムが整備されています。ストリーム技術の実用例として、
Unixオペレーティングシステムにおける
標準ストリームやパイプライン、リダイレクト機能があります。
オペレーティングシステム(OS)、例えば
Unixでは、標準的な
入出力へのインターフェースを提供するために、特別なストリームが設定されています。
標準ストリームを通じて、キーボードからの入力やディスプレイへの出力が行われ、個別のプログラムはハードウェアを意識する必要がなくなります。これにより、開発者はより簡潔にプログラムを記述できます。
C言語におけるストリーム
C言語では、
Unixから派生した
標準ストリームとして、標準入力(stdin)、標準出力(stdout)、標準エラー出力(stderr)が用意されています。これらはすべてファイルストリームとして扱われ、ファイルポインタ(FILE*)を介して操作されます。
標準Cライブラリの`
`には、ストリーム操作に必要な関数群が定義されており、例えば`printf`関数は標準出力にデータを書き込み、`scanf`関数は標準入力からデータを読み出します。
C++では、標準ライブラリの``ヘッダーファイルで、入出力ストリームとして`cin`、`cout`、`cerr`、`clog`が提供されています。ワイド文字列用には`wcin`、`wcout`、`wcerr`、`wclog`が用意されています。C++は強く型付けされた言語であるため、型を意識せずに入出力が行える機能や、ユーザー定義型からの入出力を可能にする柔軟性を持っています。また、入出力操作子(マニピュレータ)の導入により、さらなる制御が加えられています。
これにより、従来の`printf`関数で生じがちな型の不一致や制御子の不足による問題が大幅に減少しました。しかし、マニピュレータの仕様を覚える必要があるため、記述が増える一方で、これを敬遠するプログラマーも存在しています。
文字列ストリーム
C++の標準ライブラリ``には、文字列に対するストリーム操作を行うためのクラス`istringstream`と`ostringstream`が定義されています。これらを用いることで、文字列に対する入出力操作が容易になります。
その他のプログラミング言語におけるストリーム
JavaやNode.js、.NET Frameworkなど、他のプログラミング言語やフレームワークでもストリームの取り扱いがサポートされています。たとえば、JavaのストリームAPIはデータの処理を可能にし、.NET Frameworkでは低水準のReadおよびWriteメソッドを用いたストリーム操作が提供されます。
関数型言語におけるストリーム
また、関数型言語では無限の再帰的データ構造を指す「遅延ストリーム」が広く利用されます。遅延評価により、必要な部分だけを評価することが可能で、無限のデータを扱う柔軟な仕組みが実現されています。このように、ストリームは様々なプログラミング言語において重要な役割を果たし、効率的なデータ処理を支えています。