ストリームは私にはちょっと不思議です。どのストリームをいつ使用するか、どのように使用するかはわかりません。誰かがストリームの使用方法を説明できますか?
正しく理解できれば、3つのストリームタイプがあります。
stream
read stream
write stream
これは正しいです?そして、例えば、Memorystream
とFileStream
の違いは何ですか?
ストリームは、データの転送に使用されるオブジェクトです。ジェネリックストリームクラスSystem.IO.Stream
があり、そこから.NETの他のすべてのストリームクラスが派生します。 Stream
クラスはバイトを扱います。
具体的なストリームクラスは、バイト以外の他のタイプのデータを処理するために使用されます。例えば:
FileStream
クラスは、外部ソースがファイルの場合に使用されますMemoryStream
はメモリにデータを保存するために使用されますSystem.Net.Sockets.NetworkStream
はネットワークデータを処理しますStreamReader
やStreamWriter
などのリーダー/ライターストリームはストリームではありません-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を使用できます。 (ネットワークや他のシステムとデータを交換する場合、 エンディアンネス に注意する必要がありますが、それは別の投稿です。)
ストリームは、大量のデータを処理するのに適しています。すべてのデータを同時にメモリにロードするのが実用的でない場合、ストリームとしてそれを開き、小さなチャンクで作業できます。
ストリームは、バイトのphysical
ストリームの単なる抽象化(またはラッパー)です。このphysical
ストリームはbase stream
と呼ばれます。そのため、ストリームラッパーが作成されるベースストリームが常に存在するため、ラッパーにはFileStream
、MemoryStream
などのベースストリームタイプに基づいて名前が付けられます。
ストリームラッパーの利点は、統合されたAPIを取得して、基礎となるタイプusb, file
などのストリームと対話できることです。
なぜデータをストリームとして扱うのか-データチャンクはオンデマンドでロードされるため、データを次のように検査/処理できます。データ全体をメモリにロードするのではなく、チャンク。これが、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はネットワークからデータを読み取ります。