バイナリ ストリーム (つまりbyte[]
、配列) を操作するBinaryReader
場合、 orを使用する主なポイントは、 やBinaryWriter
などの方法を使用してストリームからプリミティブ データ型を簡単に読み書きできるように思わReadBoolean()
れます。エンコーディングを考慮します。それが全体の話ですか?Stream
を使用せずに を直接操作する場合、固有の利点または欠点はありBinaryReader/BinaryWriter
ますか? などのほとんどのメソッドはRead()
、両方のクラスで同じように見えます。私の推測では、それらは下で同じように機能します。
バイナリ ファイルを 2 つの異なる方法で処理する簡単な例を考えてみましょう (編集: この方法は効果がなく、バッファーを使用できることを認識しています。これは単なるサンプルです)。
// 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()
ます。
Stream の既定の実装では、新しいシングルバイト配列を作成してから、Read を呼び出します。これは正式には正しいですが、非効率的です。
を使用するGC.GetTotalMemory()
と、この最初のアプローチは2番目のアプローチの2倍のスペースを割り当てるように見えますが、より一般的なStream.Read()
方法が使用されている場合(たとえば、バッファを使用してチャンクを読み取る場合)、これは当てはまりません。それでも、これらのメソッド/インターフェースは簡単に統合できるように思えます...