C # en utilisant des stream

Les stream sont un peu mystérieux pour moi. Je ne sais pas quand utiliser quel stream et comment les utiliser. Quelqu’un peut-il m’expliquer comment les stream sont utilisés?

Si je comprends bien, il existe trois types de stream:

  • stream
  • read stream
  • write stream

Est-ce correct? Et, par exemple, quelle est la différence entre un Memorystream et un FileStream ?

Un stream est un object utilisé pour transférer des données. Il existe une classe de stream générique System.IO.Stream , à partir de laquelle toutes les autres classes de stream de .NET sont dérivées. La classe Stream traite les octets.

Les classes de stream concrètes sont utilisées pour traiter d’autres types de données que les octets. Par exemple:

  • La classe FileStream est utilisée lorsque la source externe est un fichier
  • MemoryStream est utilisé pour stocker des données en mémoire
  • System.Net.Sockets.NetworkStream gère les données réseau

Les stream de lecture / écriture tels que StreamWriter et StreamWriter ne sont pas des stream – ils ne sont pas dérivés de System.IO.Stream , ils sont conçus pour aider à écrire et à lire des données depuis et vers des stream!

Pour développer un peu les autres réponses ici, et aider à expliquer une grande partie du code exemple que vous verrez en pointillé, la plupart du temps, vous ne lisez ni n’écrivez directement sur un stream. Les stream sont un moyen de bas niveau de transférer des données.

Vous remarquerez que les fonctions de lecture et d’écriture sont toutes orientées octets, par exemple WriteByte (). Il n’y a pas de fonctions pour traiter les entiers, les chaînes de caractères, etc. Cela rend le stream très général, mais il est moins simple de travailler si, par exemple, vous voulez simplement transférer du texte.

Cependant, .NET fournit des classes qui convertissent entre les types natifs et l’interface de stream de bas niveau, et transfère les données vers ou depuis le stream pour vous. Quelques classes notables sont:

 StreamWriter // Badly named. Should be TextWriter. StreamReader // Badly named. Should be TextReader. BinaryWriter BinaryReader 

Pour les utiliser, vous devez d’abord acquérir votre stream, puis créer l’une des classes ci-dessus et l’associer au stream. Par exemple

 MemoryStream memoryStream = new MemoryStream(); StreamWriter myStreamWriter = new StreamWriter(memoryStream); 

StreamReader et StreamWriter convertissent entre les types natifs et leurs représentations sous forme de chaîne, puis transfèrent les chaînes vers et depuis le stream sous forme d’octets. Alors

 myStreamWriter.Write(123); 

va écrire “123” (trois caractères “1”, “2” puis “3”) dans le stream. Si vous traitez des fichiers texte (par exemple html), StreamReader et StreamWriter sont les classes que vous utiliseriez.

Tandis que

 myBinaryWriter.Write(123); 

écrira quatre octets représentant la valeur entière de 32 bits 123 (0x7B, 0x00, 0x00, 0x00). Si vous traitez avec des fichiers binarys ou des protocoles réseau, BinaryReader et BinaryWriter sont ce que vous pourriez utiliser. (Si vous échangez des données avec des réseaux ou d’autres systèmes, vous devez être attentif au problème , mais c’est un autre message.)

Les stream permettent de gérer de grandes quantités de données. Lorsqu’il est impossible de charger toutes les données en mémoire en même temps, vous pouvez l’ouvrir en tant que stream et travailler avec de petits morceaux.

Je commencerais par lire sur les stream sur MSDN: http://msdn.microsoft.com/en-us/library/system.io.stream.aspx

Memorystream et FileStream sont des stream utilisés avec la mémoire brute et les fichiers respectivement …

Il n’y a qu’un seul type de base de Stream . Cependant, dans certaines circonstances, certains membres lancent une exception lorsqu’ils sont appelés car, dans ce contexte, l’opération n’était pas disponible.

Par exemple, un MemoryStream est simplement un moyen de déplacer des octets dans un morceau de mémoire. Par conséquent, vous pouvez appeler Read et Write sur celui-ci.

D’autre part, FileStream vous permet de lire ou d’écrire (ou les deux) depuis / vers un fichier. Si vous pouvez réellement lire ou écrire dépend de la façon dont le fichier a été ouvert. Vous ne pouvez pas écrire dans un fichier si vous l’avez seulement ouvert pour l’access en lecture.

Stream est simplement une abstraction (ou un wrapper) sur un stream physical d’octets. Ce stream physical est appelé base stream . Il y a donc toujours un stream de base sur lequel un wrapper de stream est créé et le wrapper est ainsi nommé d’après le type de stream de base, à savoir FileStream , MemoryStream etc.

L’avantage du wrapper de stream est que vous obtenez une API unifiée pour interagir avec les stream de n’importe quel type usb, file etc.

Pourquoi traiteriez-vous les données comme un stream ? Parce que les blocs de données sont chargés à la demande, nous pouvons inspecter / traiter les données sous forme de blocs plutôt que de charger toutes les données en mémoire. C’est ainsi que la plupart des programmes traitent les gros fichiers, par exemple pour chiffrer un fichier image du système d’exploitation.

Je n’appellerais pas ces différents types de stream. La classe Stream a les propriétés CanRead et CanWrite qui vous indiquent si le stream particulier peut être lu et écrit.

La principale différence entre les différentes classes de stream (telles que MemoryStream vs FileStream) est le magasin de sauvegarde – où les données sont lues ou écrites. C’est assez évident du nom. Un MemoryStream stocke les données uniquement en mémoire, un FileStream est sauvegardé par un fichier sur le disque, un NetworkStream lit les données du réseau, etc.

Eh bien, vous pouvez à la fois lire et écrire dans un stream, un stream de mémoire est quelque chose que vous pouvez déclarer pour que vous puissiez travailler avec des données en mémoire et un stream de fichiers est un stream pointé vers un fichier. former un stream de fichiers alors vous lisez / écrivez le fichier.