質問
ストリームは私にとっては不思議なものです。どのストリームをいつ使用するか、どのように使用するかはわかりません。誰かがストリームの使用方法を説明できますか?
正しく理解できれば、3つのストリームタイプがあります:
-
stream
-
ストリームを読む
-
書き込みストリーム
これは正しいですか?また、たとえば、 Memorystream
と FileStream
の違いは何ですか?
解決
ストリームは、データの転送に使用されるオブジェクトです。ジェネリックストリームクラス System.IO.Stream
があり、そこから.NETの他のすべてのストリームクラスが派生します。 Stream
クラスはバイトを処理します。
具象ストリームクラスは、バイト以外の他のタイプのデータを処理するために使用されます。例:
-
FileStream
クラスは、外部ソースがファイルの場合に使用されます -
MemoryStream
はメモリにデータを保存するために使用されます -
System.Net.Sockets.NetworkStream
はネットワークデータを処理します
StreamReader
や StreamWriter
などの Reader / writerストリームはストリームではありません- System.IO.Stream
から派生したものではなく、ストリームへのデータの読み書きを支援するように設計されています!
他のヒント
ここで他の答えを少し拡大し、点線で表示されるサンプルコードの多くを説明するために、ほとんどの場合、ストリームを直接読み書きしません。ストリームは、データを転送するための低レベルの手段です。
読み取りと書き込みの関数はすべてバイト指向であることに気付くでしょう。 WriteByte()。整数、文字列などを処理するための関数はありません。これにより、ストリームは非常に汎用的になりますが、たとえばテキストを転送するだけの場合は、操作が簡単ではありません。
ただし、.NETには、ネイティブ型と低レベルストリームインターフェイス間で変換するクラスが用意されており、データをストリームとの間で転送します。注目すべきそのようなクラスは次のとおりです。
StreamWriter // Badly named. Should be TextWriter.
StreamReader // Badly named. Should be TextReader.
BinaryWriter
BinaryReader
これらを使用するには、最初にストリームを取得してから、上記のクラスの1つを作成してストリームに関連付けます。例:
MemoryStream memoryStream = new MemoryStream();
StreamWriter myStreamWriter = new StreamWriter(memoryStream);
StreamReaderおよびStreamWriterは、ネイティブ型とその文字列表現の間で変換を行い、文字列をストリームとの間でバイトとして転送します。だから
myStreamWriter.Write(123);
" 123"と書き込みます。 (3文字の「1」、「2」、「3」)をストリームに追加します。テキストファイル(例:html)を扱う場合、StreamReaderとStreamWriterが使用するクラスです。
理由
myBinaryWriter.Write(123);
は、32ビット整数値123(0x7B、0x00、0x00、0x00)を表す4バイトを書き込みます。バイナリファイルまたはネットワークプロトコルを扱っている場合は、BinaryReaderとBinaryWriterを使用できます。 (ネットワークまたは他のシステムとデータを交換する場合は、エンディアンネスに注意する必要がありますが、それは別の投稿です。)
ストリームは、大量のデータを処理するのに適しています。すべてのデータを同時にメモリにロードするのが実用的でない場合、ストリームとしてそれを開き、小さなチャンクで作業できます。
Streamは、バイトの physical
ストリームの単なる抽象化(またはラッパー)です。この physical
ストリームは、 base stream
と呼ばれます。そのため、常にストリームラッパーが作成されるベースストリームが存在するため、ラッパーにはベースストリームタイプ( FileStream
、 MemoryStream
など)にちなんで名前が付けられます。
ストリームラッパーの利点は、基になる usb、file
などのタイプのストリームと対話するための統合APIを取得できることです
データをストリームとして扱う理由 -データチャンクはオンデマンドで読み込まれるため、データ全体を読み込むのではなく、チャンクとしてデータを検査/処理できますメモリ。これは、OSイメージファイルの暗号化など、ほとんどのプログラムが大きなファイルを処理する方法です。
Stream
の基本タイプは1つだけです。ただし、さまざまな状況で、一部のメンバーは呼び出されたときに例外をスローします。これは、そのコンテキストでは操作が利用できないためです。
たとえば、 MemoryStream
は、メモリのチャンクにバイトを移動する方法です。したがって、読み取りと書き込みを呼び出すことができます。
一方、 FileStream
を使用すると、ファイルの読み取りまたは書き込み(またはその両方)を行うことができます。実際に読み書きできるかどうかは、ファイルがどのように開かれたかによって異なります。読み取りアクセスのためだけに開いた場合、ファイルに書き込むことはできません。
MSDNのストリームを読むことから始めます。 http://msdn.microsoft.com/en-us/ library / system.io.stream.aspx
MemorystreamとFileStreamは、それぞれ生メモリとファイルを操作するために使用されるストリームです...
これらの異なる種類のストリームを呼び出しません。 Streamクラスには、特定のストリームを読み書きできるかどうかを示すCanReadプロパティとCanWriteプロパティがあります。
異なるストリームクラス(MemoryStreamとFileStreamなど)の主な違いは、データの読み取り元または書き込み先のバッキングストアです。名前から明らかです。 MemoryStreamはデータをメモリのみに保存し、FileStreamはディスク上のファイルによってバックアップされ、NetworkStreamはネットワークからデータを読み取ります。