web-dev-qa-db-ja.com

ストリームを使用するC#

ストリームは私にはちょっと不思議です。どのストリームをいつ使用するか、どのように使用するかはわかりません。誰かがストリームの使用方法を説明できますか?

正しく理解できれば、3つのストリームタイプがあります。

  • stream
  • read stream
  • write stream

これは正しいです?そして、例えば、MemorystreamFileStreamの違いは何ですか?

104
Martijn

ストリームは、データの転送に使用されるオブジェクトです。ジェネリックストリームクラスSystem.IO.Streamがあり、そこから.NETの他のすべてのストリームクラスが派生します。 Streamクラスはバイトを扱います。

具体的なストリームクラスは、バイト以外の他のタイプのデータを処理するために使用されます。例えば:

  • FileStreamクラスは、外部ソースがファイルの場合に使用されます
  • MemoryStreamはメモリにデータを保存するために使用されます
  • System.Net.Sockets.NetworkStreamはネットワークデータを処理します

StreamReaderStreamWriterなどのリーダー/ライターストリームはストリームではありません-System.IO.Streamから派生したものではなく、データの読み書きを支援するように設計されています。

70
Arsen Mkrtchyan

ここで他の回答を少し拡大し、点線で表示される多くのサンプルコードの説明を支援するために、ほとんどの場合、ストリームを直接読み書きしません。ストリームは、データを転送するための低レベルの手段です。

読み書きのための関数はすべてバイト指向であることに気付くでしょう。 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を使用できます。 (ネットワークや他のシステムとデータを交換する場合、 エンディアンネス に注意する必要がありますが、それは別の投稿です。)

51
Tim Williams

ストリームは、大量のデータを処理するのに適しています。すべてのデータを同時にメモリにロードするのが実用的でない場合、ストリームとしてそれを開き、小さなチャンクで作業できます。

21
meatvest

ストリームは、バイトのphysicalストリームの単なる抽象化(またはラッパー)です。このphysicalストリームはbase streamと呼ばれます。そのため、ストリームラッパーが作成されるベースストリームが常に存在するため、ラッパーにはFileStreamMemoryStreamなどのベースストリームタイプに基づいて名前が付けられます。

ストリームラッパーの利点は、統合されたAPIを取得して、基礎となるタイプusb, fileなどのストリームと対話できることです。

なぜデータをストリームとして扱うのか-データチャンクはオンデマンドでロードされるため、データを次のように検査/処理できます。データ全体をメモリにロードするのではなく、チャンク。これが、OSイメージファイルの暗号化など、ほとんどのプログラムが大きなファイルを処理する方法です。

7
Anwar Husain

Streamの基本タイプは1つだけです。ただし、さまざまな状況で、一部のメンバーは、呼び出されたときに例外をスローします。これは、そのコンテキストでは操作が利用できないためです。

たとえば、MemoryStreamは、単にメモリのチャンクにバイトを出し入れする方法です。したがって、読み取りと書き込みを呼び出すことができます。

一方、FileStreamを使用すると、ファイルの読み取りまたは書き込み(またはその両方)を行うことができます。実際に読み取りまたは書き込みができるかどうかは、ファイルがどのように開かれたかによって異なります。読み取りアクセスのためだけに開いた場合、ファイルに書き込むことはできません。

4
AnthonyWJones

MSDNのストリームを読むことから始めます。 http://msdn.Microsoft.com/en-us/library/system.io.stream.aspx

MemorystreamとFileStreamは、それぞれ生メモリとファイルを操作するために使用されるストリームです...

3
Robban

私はこれらの異なる種類のストリームを呼び出しません。 Streamクラスには、特定のストリームを読み書きできるかどうかを示すCanReadプロパティとCanWriteプロパティがあります。

異なるストリームクラス(MemoryStreamとFileStreamなど)の主な違いは、バッキングストアです-データの読み取り元または書き込み先です。名前から明らかです。 MemoryStreamはデータをメモリのみに保存し、FileStreamはディスク上のファイルによってバックアップされ、NetworkStreamはネットワークからデータを読み取ります。

1
Mattias S