ストリームは私には神秘的です。私はいつどのストリームを使用するのか、どのストリームを使用するのか分かりません。誰かがストリームがどのように使われているか私に説明することはできますか私が正しく理解していればC#ストリームを使用する
、3つのストリームの種類があります。
stream
read stream
write stream
これは正しいですか?たとえば、Memorystream
とFileStream
の違いは何ですか?
ストリームは私には神秘的です。私はいつどのストリームを使用するのか、どのストリームを使用するのか分かりません。誰かがストリームがどのように使われているか私に説明することはできますか私が正しく理解していればC#ストリームを使用する
、3つのストリームの種類があります。
stream
read stream
write stream
これは正しいですか?たとえば、Memorystream
とFileStream
の違いは何ですか?
ストリームは、データの転送に使用されるオブジェクトです。ジェネリックストリームクラスSystem.IO.Stream
があり、そこから.NETの他のすべてのストリームクラスが派生しています。 Stream
クラスはバイトを処理します。
具体的なストリームクラスは、バイト以外の種類のデータを処理するために使用されます。例えば:
MemoryStream
ときFileStream
クラスが使用されるが System.Net.Sockets.NetworkStream
メモリリーダ/ライタは、ストリームをネットワーク・データを処理StreamReader
とStreamWriter
はストリームではありません。System.IO.Stream
から派生したものではありません。これらのストリームは、データの書き込みやストリームの読み込みを支援するように設計されています。
私は正しく理解しているので、ストリームにはデータが入っていて、何もしません。リーダーとライターの「ヘルパー」クラスは、ストリーム内のデータを処理(操作)できますか? – Martijn
いいえ、ストリームはデータコンテナではなく、データ転送に使用します。たとえば、FileStreamはバイト[]からフィジカルファイルにデータを転送し、NetworkStreamはbyte []をソケットで転送します。 Reader Writerクラスは、ストリームからの書き込みと読み取りを行うヘルパークラスです。たとえば、StreamReaderを使用して、byte []以外のStream文字列を読み取ることができます。 FileStreamにパラメータを渡すと、NetworkStreamがソケットからFileの場合は読み込みます。 –
さらに、StreamReaderとStreamWriterは、TEXT(文字)ストリームを読み書きするためのものです。 – 1c1cle
ほとんどの場合、ストリームに読み書きすることができます。メモリストリームは、メモリ内のデータを処理できるように宣言できるもので、ファイルストリームはファイルを指すストリームなので、あなたはファイルストリームを書いたり読んだりすると、そのファイルを読み書きしています。
私は、MSDNのストリーム上に読むことから始めます: http://msdn.microsoft.com/en-us/library/system.io.stream.aspx
のMemoryStreamとFileStreamは、それぞれ生のメモリとファイルを操作するために使用ストリームである...
リンクありがとうございます。 「ソースコードをオンラインで参照したり、オフラインで参照できるようにリファレンスをダウンロードしたり、デバッグ中にソース(パッチや更新を含む)を実行したりすることができました。この機能により、新しいレベルの洞察が得られます。 – David
をStream
の唯一の基本的なタイプがあります。しかし、様々な状況では、そのコンテキストで操作が利用できなかったため、一部のメンバーは呼び出されたときに例外をスローします。
たとえば、MemoryStream
は、単純にメモリのチャンク内外にバイトを移動する方法です。したがって、その上でReadとWriteを呼び出すことができます。
一方、FileStream
は、ファイルの読み書き(またはその両方)を可能にします。実際に読み書きできるかどうかは、ファイルのオープン方法によって異なります。読み取りアクセス用にファイルを開いただけの場合は、ファイルに書き込むことはできません。
私はこれらの種類のストリームを呼び出すことはありません。 Streamクラスには、特定のストリームを読み書きできるかどうかを示すCanReadおよびCanWriteプロパティがあります。
異なるストリームクラス(MemoryStreamとFileStreamなど)の主な違いは、バッキングストアです。バッキングストアは、データの読み取り先または書き込み先です。名前からは明らかなことです。 MemoryStreamはデータをメモリにのみ格納し、FileStreamはディスク上のファイルによってバックアップされ、NetworkStreamはネットワークからデータを読み込みます。
ストリームは大量のデータを処理するのに適しています。同時にすべてのデータをメモリにロードすることは実用的でないときは、ストリームとして開いて、それを小さなチャンクで処理することができます。
あなたはちょうど "それの小さなチャンクで動作する"と言ったものの例を見たいと思うでしょう。 –
ストリームは少量のデータにも適しています。 C#プログラマがファイルの内容を操作したい場合、データの量にかかわらず、ストリームを使用する必要があります。同じ文がネットワークストリームにも当てはまります。たとえプログラマがCのような低レベル言語であるならば、文字やバイトを直接ディスクやソケットに書き込むことは可能ですが、少量のデータであっても時間がかかりやすくなりがちですエラー。 – 1c1cle
ここで他の答えを少し詳しく説明し、多くのサンプルコードについて説明します。ほとんどの場合、ストリームに直接読み書きすることはありません。ストリームは、データを転送するための低レベルの手段です。
読み取りと書き込みの機能はすべてバイト指向です。 WriteByte()。整数、文字列などを扱う関数はありません。これはストリームを非常に汎用的にしますが、テキストを転送したいだけの場合には扱いが簡単ではありません。
ただし、.NETでは、ネイティブタイプと低レベルストリームインターフェイスを変換し、ストリームを使用してストリームを送受信します。いくつかの注目すべきこのようなクラスは以下のとおりです。
StreamWriter // Badly named. Should be TextWriter.
StreamReader // Badly named. Should be TextReader.
BinaryWriter
BinaryReader
、あなたは上記のクラスのいずれかを作成して、ストリームに関連付け、まず、あなたのストリームを取得し、これらを使用します。例えば。
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を表す4バイト書き込みます(0x7Bと、$ 00、$ 00を、$ 00)。バイナリファイルやネットワークプロトコルを扱っている場合は、BinaryReaderとBinaryWriterを使用することができます。 (あなたがネットワークまたは他のシステムとのデータのやり取りをしている場合は、endiannessに留意する必要があるが、それは別のポストです。)
ストリームは、ちょうどバイトのphysical
ストリーム以上の抽象化(またはラッパー)です。このphysical
ストリームはbase stream
と呼ばれます。したがって、常にストリームラッパーが作成されるため、ラッパーの名前は基本ストリームタイプの名前になります。つまり、FileStream
,MemoryStream
などです。
ストリームラッパーの利点は、統合されたAPIを使用して任意の基になる型のストリームとusb, file
あなたはストリームなどのデータを扱いますなぜ
など - データチャンクは、オンデマンドでロードされるためには、我々はむしろに全データをロードするよりも、チャンクとして/プロセスデータを検査することができますメモリ。これは、大部分のプログラムが大きなファイルを処理する方法です(OSイメージファイルの暗号化など)。
を参照してください。http://stackoverflow.com/questions/507747/can-you-explain-the-concept-of-streamsを確認することがあります – Preets
バイトの配列をとり、それにラッパーを作成します( 'Stream' )は、読み書き、位置の変更などの便利な方法を公開しています。これで、 'Stream'から継承したバッキングストア(FileStream、MemoryStream)に基づいてクラスを作成し、特定のバッキングストアに基づいてその機能を構築することができます。 –