C#ストリームの詳細解説(2) ~FileStream、BinaryReader、MemorySream、SreamReaderなどの関係~

【ファイルストリーム】

コンピュータ上には、テキスト ファイル、オーディオ ファイル、ビデオ ファイル、画像ファイルなど、多くのファイルがあります。これらのファイルはディスク上に永続的に保存され、本質的にはバイナリ データの集まりです。

FileStream はバイナリ ファイルの読み取りに使用されます。コンピュータ上のすべてのファイルは、テキスト、オーディオ、ビデオ、その他の形式を問わず、FileStream で読み取ることができます。ただし、読み取られるのはバイナリ データであるため、対応する理解可能な情報を取得するには、それを逆シリアル化する方法を知る必要があります。たとえば、写真の png 形式とビデオの mp4 形式はすべて、公開されている逆シリアル化方法です。

ファイル ストリーム (FileStream) を使用すると、ファイルを 1 つずつ読み取るのではなく、ファイルを部分ごと、またはバイトごとに読み取って、よりきめ細かい方法でファイルを読み取ることができます。

全体的な流れとしては、物事が常にある場所から別の場所に移動しているというプロセスが強調されています。たとえば、高速鉄道の駅に入る人の流れは駅の外から駅の内側へ、ファイルの流れは具体的には、ある場所から別の場所へ、人の流れの基本単位は人、ファイルの流れの基本単位はバイトです。

人数が多い場合は5人ずつグループで駅に入る、これも流れで基本単位は5人です。ファイルが大きく、多数のファイルに分割されている場合、各ファイルの読み取りもストリームとなり、基本単位はファイルになります。

TextReader/TextWriterはテキストファイルの読み書きを効率的に処理するために使用され、基本単位は文字ですが抽象クラスのためインスタンス化できません。StreamReader/StreamWriter は、テキストとバイナリ間の変換に使用されます。(Jsonファイル、cppファイル、csファイル、prefabファイル等は全てテキストファイルです)

BinaryReader/BinaryWriter はバイナリ ファイルの読み取りと書き込みに使用され、基本単位はバイトです。

他のストリーム

FileStream は、ディスクからメモリへの読み取り、およびメモリからディスクへの書き込みを行います。

MemoryStream はメモリ内での読み取りと書き込みに使用され、メモリ内のさまざまなストリームの交換を解決するために使用されます。

NetWorkStream ネットワーク ストリームは、サーバーとクライアント間の通信フローを処理するために使用されます。

BufferedStream :  BufferedStream は、他の Stream からバイトを読み書きして、特定の I/O 操作のパフォーマンスを向上させます。

GZipStream: 圧縮と解凍の実装に使用されるストリーム

Cryptostream: 暗号化と復号化のためのストリーム

ファイルストリームの基本操作 FileMode

  • 開く: ファイルがすでに存在する場合、ファイルを開きます。
  • 作成: ファイルを作成します
  • OpenOrCreate: ファイルを開きます。ファイルが存在しない場合は、ファイルを作成します。
  • 追加: コンテンツを追加します。つまり、新しいコンテンツをファイルに追加します。
  • 切り詰め: ファイルを開くときにファイルの内容をクリアし、ファイルを削除して同じ名前のファイルを作成する手順を簡略化します。

ファイルの読み取りおよび書き込み権限FileAccess

  • 読み取り: 読み取り権限
  • 書き込み:書き込み許可
  • ReadWrite: 読み取りおよび書き込み権限

【ストリームクラス】

ストリームはストリームの抽象クラスです。すべてのストリームはこのクラスを継承する必要があります。C# によって事前定義されたさまざまなストリーム実装があります。これらの実装により、オペレーティング システムと基本デバイス間の対話を気にする必要がなくなります。

ストリームの 3 つの基本操作は読み取り、書き込み、検索であり、それぞれ CanRead、CanWrite、および CanSeek の 3 つの基本プロパティに対応します。

共通のプロパティ

  • 長さ: ストリームの長さ、つまりファイルのサイズです。ファイル自体にサイズに関する情報が記録されます。情報を取得するにはファイル ヘッダーを読み取るだけでよく、ファイル全体を読み取る必要はありません。サイズを知ってください。メモリの配置やその他の理由により、ファイル サイズはメモリ フットプリントと必ずしも一致しないことに注意してください。
  • 位置: 現在の読み取り/書き込みストリームの位置。ファイルの内容を長いバイト配列として扱います。位置はインデックスと同等です。ファイルの先頭では Position=0、ファイルの末尾では Position= Array.Length-1

一般的な方法

  • abstract long Seek(long offset, SeekOriginorigin): 読み取りおよび書き込みストリームの位置を指定します。Stream.Seek(-10,Origin.End); はストリームの最後から 10 番目の位置を意味します; Stream.Seek(0,Origin.Begin); はストリームの先頭を意味します; Stream.Seek(1,Orig` in .Current); ストリームの現在位置からの最初の位置を意味します。
  • abstract int Read (byte[]buffer, int offset, int count); ストリームの現在位置からデータを読み取り、バッファに入れます 読み取りデータの長さは count です バッファに入れる開始位置は offset です. ストリームから読み取られた実際の長さを返します。一般的に、戻り値は count に等しいですが、ストリームの最後にある場合は直接読み取られる可能性があり、戻り値は count より小さくなります。
  • abstract void Write (byte[]buffer, int offset, int count): 現在のストリームの位置からデータを書き込みます。データはバッファから取得され、バッファのオフセット位置から開始して書き込まれます。書き込まれたデータの長さカウントです。
  • Close()とDispose():特に言うことはありませんが、データを読み込んで一連の処理を行った後、呼び出すのを忘れている可能性があります。コードは一定の順序で記述し、ファイルを読み込んだらすぐに close と destroy を記述し、その後中間データの処理プロセスを処理することを推奨します。

おすすめ

転載: blog.csdn.net/enternalstar/article/details/132354443