バイナリストリーム(つまりbyte[]
配列)を使用する場合、BinaryReader
またはBinaryWriter
を使用する主なポイントは、プリミティブデータ型の読み取り/例えば、ReadBoolean()
のようなメソッドを使用し、エンコーディングを考慮してストリームを生成します。それは全体の話ですか? BinaryReader/BinaryWriter
を使用せずにStream
で直接作業する場合は、固有の利点または不利な点はありますか? Read()
のようなほとんどのメソッドは、両方のクラスで同じように見えますが、私の推測は、それらが同じように下に動作するということです。 バイナリストリームを処理するためにStream.Read()とBinaryReader.Read()を使用する
// Using FileStream directly
using (FileStream stream = new FileStream("file.dat", FileMode.Open))
{
// Read bytes from stream and interpret them as ints
int value = 0;
while ((value = stream.ReadByte()) != -1)
{
Console.WriteLine(value);
}
}
// Using BinaryReader
using (BinaryReader reader = new BinaryReader(FileStream fs = new FileStream("file.dat", FileMode.Open)))
{
// Read bytes and interpret them as ints
byte value = 0;
while (reader.BaseStream.Position < reader.BaseStream.Length)
{
value = reader.ReadByte();
Console.WriteLine(Convert.ToInt32(value));
}
}
出力は以下となります同じですが、内部的には何が起こっていますか(OSの観点から)どの実装が使用されているかは、一般的に言えば重要ですか?彼らが提供する余分な方法を必要としない場合、BinaryReader/BinaryWriter
を使用する目的はありますか?この特定のケースでは 、MSDNはStream.ReadByte()
に関してこれを言う:
ストリーム上のデフォルトの実装は、新しいシングルバイト配列 を作成し、Readを呼び出します。これは正式なものですが、効率的でないのは です。
GC.GetTotalMemory()
を使用
、この第1のアプローチは、第二の一つとして2倍として多くのスペースを割り当てるように見えるんが、より一般的なStream.Read()
方法を使用してチャンクを読み込むために(例えば使用されている場合私の知る限り、これは場合であってはなりませんバッファ)。それでも、これらのメソッド/インターフェイスは簡単に統一されているようです。
Stream.ReadByteのデフォルトの実装は、Streamの具体的な実装では無効になるように意図されています。どの質問に答えられていないのですか?ストリームに頼ることができるのではなく、新しいStreamReaderクラスが必要なのはなぜですか? – yoyo
@yoyo一般的にStreamクラスがひどく設計されているためです。それはあまりにも "一般的"です。すべてのストリームがシークまたはReadByte(効率的)または読み書きをサポートするわけではありません。それはちょうど悪いOOPデザインです。代わりにインターフェイスを使用しているはずです。 –