クラス:
wxWidgets は標準の C++ ストリームを提供していないプラットフォームに対応するためと、標準ライブラリの特定のバージョンに依存することなく、wxWidgets アプリケーションのバイナリ版を提供可能にするために独自のストリームクラス群を提供しています。また、wxWidgets のストリームクラスは標準ライブラリでは利用できない機能をいくつか提供しており、これにはいくつかの圧縮形式への対応や、ソケットやテキストコントロールの利用 (後者は出力のみです) が含まれます。
とは言え、wxWidgets プログラムで標準ストリームクラスを使用することも可能ですし、上記の事項が当てはまらない場合は使用が推奨されています。さらに、ある程度の相互運用性を wxWidgets と 標準ストリームクラスとの間に提供するため、wxStdInputStream クラスと wxStdOutputStream クラスが提供されています。これらのクラスにより、任意の wxWidgets ストリームを標準ストリームとして使用できます。(逆に標準ストリームを wxWidgets ストリームとして使用する機能は将来的に提供する予定です)
wxStream クラスはふたつの主なグループに分けられます:
wxStreamBase はストリームの基底クラスです。このクラスは例えば OnSysRead()、OnSysWrite()、OnSysSeek()、OnSysTell() などの API を定義しています。これらのクラスは実際には "IO" クラスで実装されています。wxInputStream クラスと wxOutputStream クラスは wxStreamBase を継承しており、入出力に関する専用の関数を提供します。
wxStreamBuffer は wxStreamBase 用のキャッシュマネージャです: このクラスはストリームに関連付けられたストリームバッファを管理します。ひとつのストリームは複数のストリームバッファを持つことができますが、ストリームは常にひとつの自動初期化済みのストリームバッファを持ちます。
wxInputStream は読み取り専用ストリームの基底クラスです。このクラスでは Read()、SeekI() (I は Input を表します) と、読み取りや入出力に関するすべての関数を実装しています。wxOutputStream も同じことを行いますが、こちらは書き込み専用のストリーム用です。
wxFilterInputStream と wxFilterOutputStream はフィルタリング用の基底クラスです。ストリームのフィルタリングとは、システムコールは行いませんが、渡されたデータをフィルタリングし、他のストリームへ引き渡すストリームを意味します。例えば、wxZLibInputStream はインラインでストリームを展開します。
"IO" クラスはストリームの特定の部分を実装しています。wxStreamBuffer に基づく wxMemoryInputStream、wxMemoryOutputStream の場合は何も行いません。また、この実装は単純に本当のシステムコール (read(...)、write(...) など) に関連付けられています。
使用方法は単純です。例として wxFileInputStream のサンプルコードを以下に示します:
... // コンストラクタではストリームバッファの初期化と // ファイル名に関連付けられたファイルディスクリプタのオープンが行われる。 wxFileInputStream in_stream("the_file_to_be_read"); // Ok、データを読み込む ... nb_datas はバイト単位で表す。 in_stream.Read(data, nb_datas); if (in_stream.LastError() != wxSTREAM_NOERROR) { // おっと、何か良くないことが起こった。 // 完全な一覧は wxStreamBase のドキュメントを参照のこと。 } // このようにインラインにすることもできる。 if (in_stream.Read(data, nb_datas).LastError() != wxSTREAM_NOERROR) { // 処理を行なう。 } // また、バッファへ実際に書き込んだバイト数を取得することもできる。 size_t really_read = in_stream.LastRead(); // Ok、ストリームの先頭へ移動する。SeekI はストリームの先頭から数えた // 最後の位置を返却する。 off_t old_position = in_stream.SeekI(0, wxFromBeginning); // 現在位置はどこ? off_t position = in_stream.TellI(); // wxFileInputStream はデストラクタでファイルディスクリプタを閉じる。