2007年11月13日
[C#] Streamいろいろ。
有名どころでいうと、ざっとこんな感じ。
System.IO.
System.IO.TextReader
└System.IO.StreamReader
└System.IO.StringReader
System.IO.TextWriter
└System.IO.StreamWriter
└System.IO.StringWriter
System.IO.Stream
└System.IO.FileStream
└System.IO.MemoryStream
└System.IO.BufferedStream
・
・
・
以下解説。
System.IO.
System.IO.TextReader
└System.IO.StreamReader
└System.IO.StringReader
System.IO.TextWriter
└System.IO.StreamWriter
└System.IO.StringWriter
System.IO.Stream
└System.IO.FileStream
└System.IO.MemoryStream
└System.IO.BufferedStream
・
・
・
以下解説。
■Streamクラス
すべてのストリームの基本抽象クラス。
とはいえ、StreamReaderとかStreamWriterはStreamの派生クラスではない。
StreamReaderの基本クラスはTextReader。
TextReaderの派生クラスには他にStringReaderがある。
同じようにStreamWriterはTextWriterを継承。他にStringWriter。
似たような名前のStream/StreamReader/StreamWriterだが、
この3つには
StreamReader/StreamWriterは
特定のエンコーディングの文字を入力する場合に使用するもの。
Streamはバイトの入出力に使用するもの。
という違いがある。
なのでテキストファイルの読み書きにはStreamReader/StreamWriterを使う。
バイナリファイルの読み書きにはStreamを使うが、
こいつは抽象クラスなので、だいたいの場合MemoryStreamなんかかをnewして
Streamにキャストしてしかるべきメソッドに渡す、なんていう使われ方をするようだ。
今の仕事では
XMLファイルを読み込んでデシリアライズ→オブジェクトに格納
という場面でこの方法を使っていた。
ちなみに
Streamクラスの派生クラスで代表的(というか私が知ってる)クラスは
FileStreamとか
MemoryStreamとか
BufferedStreamとか。
[Streamクラスの派生クラス]
http://msdn2.microsoft.com/ja-jp/library/zs551520.aspx
■MemoryStream
Streamクラスは抽象クラスなので、
newしてインスタンス化することができません。
そこでよくコイツが使われたりします。
Stream stream = new MemoryStream();
なんていう具合に。
Streamは読みも書きも両方できます。
そのため(かどうかは知りませんが)Positionというプロパティを使って、
今そのStreamの中のどの位置にいるか、という「ポジション」を
動かすことができます。
例えば、Streamにデータを詰めたあとで
stream.Position = 0;
とするとポジションが先頭に移るので、
そのあとでRead()とかすれば先頭からデータを読めます。
ちなみにこのプロパティはStreamWriterやStreamReaderにはありません。
あれば便利なのに・・・。
■FileStream
Streamクラスを継承。
ファイルシステム上のファイルを読み書きするのに使います。
ここでTipsですが、
Fileクラスには、指定したファイルをオープンしてFileStreamとして返す
staticメソッドがあります。
これを使うと便利。
FileStream fs = File.OpenWrite("ファイルパス");
さらにもうひとつ。
Streamは使い終わったら自分でコードを書いてCloseしなくてはなりませんが、
usingというブロックを使用するとコレを自動化できます。
using(FileStream fs = File.OpenWrite("ファイルパス"))
{
// FileStreamを使ったコード
}
usingブロックを使用すると、
そのブロックの中でのみ、"()"内で宣言した変数が使えます。
さらに、ここで宣言したStreamは、
usingブロックが終わると自動的にCloseされます。
便利でしょ。
usingブロックはIDisposeインターフェイスを実装しているクラスなら
どのクラスのインスタンスでも使えます。
別にStreamに特有のものではありませんので、ガンガン使っちゃって下さい。
[FileStream]
http://msdn2.microsoft.com/ja-jp/library/system.io.filestream.aspx
すべてのストリームの基本抽象クラス。
とはいえ、StreamReaderとかStreamWriterはStreamの派生クラスではない。
StreamReaderの基本クラスはTextReader。
TextReaderの派生クラスには他にStringReaderがある。
同じようにStreamWriterはTextWriterを継承。他にStringWriter。
似たような名前のStream/StreamReader/StreamWriterだが、
この3つには
StreamReader/StreamWriterは
特定のエンコーディングの文字を入力する場合に使用するもの。
Streamはバイトの入出力に使用するもの。
という違いがある。
なのでテキストファイルの読み書きにはStreamReader/StreamWriterを使う。
バイナリファイルの読み書きにはStreamを使うが、
こいつは抽象クラスなので、だいたいの場合MemoryStreamなんかかをnewして
Streamにキャストしてしかるべきメソッドに渡す、なんていう使われ方をするようだ。
今の仕事では
XMLファイルを読み込んでデシリアライズ→オブジェクトに格納
という場面でこの方法を使っていた。
ちなみに
Streamクラスの派生クラスで代表的(というか私が知ってる)クラスは
FileStreamとか
MemoryStreamとか
BufferedStreamとか。
[Streamクラスの派生クラス]
http://msdn2.microsoft.com/ja-jp/library/zs551520.aspx
■MemoryStream
Streamクラスは抽象クラスなので、
newしてインスタンス化することができません。
そこでよくコイツが使われたりします。
Stream stream = new MemoryStream();
なんていう具合に。
Streamは読みも書きも両方できます。
そのため(かどうかは知りませんが)Positionというプロパティを使って、
今そのStreamの中のどの位置にいるか、という「ポジション」を
動かすことができます。
例えば、Streamにデータを詰めたあとで
stream.Position = 0;
とするとポジションが先頭に移るので、
そのあとでRead()とかすれば先頭からデータを読めます。
ちなみにこのプロパティはStreamWriterやStreamReaderにはありません。
あれば便利なのに・・・。
■FileStream
Streamクラスを継承。
ファイルシステム上のファイルを読み書きするのに使います。
ここでTipsですが、
Fileクラスには、指定したファイルをオープンしてFileStreamとして返す
staticメソッドがあります。
これを使うと便利。
FileStream fs = File.OpenWrite("ファイルパス");
さらにもうひとつ。
Streamは使い終わったら自分でコードを書いてCloseしなくてはなりませんが、
usingというブロックを使用するとコレを自動化できます。
using(FileStream fs = File.OpenWrite("ファイルパス"))
{
// FileStreamを使ったコード
}
usingブロックを使用すると、
そのブロックの中でのみ、"()"内で宣言した変数が使えます。
さらに、ここで宣言したStreamは、
usingブロックが終わると自動的にCloseされます。
便利でしょ。
usingブロックはIDisposeインターフェイスを実装しているクラスなら
どのクラスのインスタンスでも使えます。
別にStreamに特有のものではありませんので、ガンガン使っちゃって下さい。
[FileStream]
http://msdn2.microsoft.com/ja-jp/library/system.io.filestream.aspx