web-dev-qa-db-fra.com

C # utilisant des flux

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

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

  • stream
  • read stream
  • write stream

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

104
Martijn

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

Les classes de flux concrètes sont utilisées pour traiter d'autres types de données que des 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 du réseau

Les flux de lecture/écriture tels que StreamReader et StreamWriter ne sont pas des flux - ils ne sont pas dérivés de System.IO.Stream, ils sont conçus pour vous aider à écrire et à lire des données à partir de et pour diffuser!

70
Arsen Mkrtchyan

Pour développer un peu plus les autres réponses ici, et aider à expliquer beaucoup de code d'exemple que vous verrez en pointillés, la plupart du temps, vous ne lisez pas et n'écrivez pas directement dans un flux. Les flux constituent un moyen de bas niveau pour transférer des données.

Vous remarquerez que les fonctions de lecture et d’écriture sont toutes orientées octet, par exemple. WriteByte (). Il n'y a pas de fonctions permettant de gérer les entiers, les chaînes, etc. Cela rend le flux très polyvalent, mais moins simple à utiliser si, par exemple, vous souhaitez simplement transférer du texte.

Cependant, .NET fournit des classes qui effectuent la conversion entre les types natifs et l'interface de flux de bas niveau et transfèrent les données vers ou depuis le flux pour vous. Certaines de ces 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 flux, puis créer l'une des classes ci-dessus et l'associer au flux. Par exemple.

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

StreamReader et StreamWriter effectuent la conversion entre les types natifs et leurs représentations de chaîne, puis transfèrent les chaînes vers et depuis le flux sous forme d'octets. Alors

myStreamWriter.Write(123);

écrira "123" (trois caractères "1", "2" puis "3") dans le flux. Si vous traitez avec 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 sur 32 bits 123 (0x7B, 0x00, 0x00, 0x00). Si vous utilisez des fichiers binaires ou des protocoles réseau, vous pouvez utiliser BinaryReader et BinaryWriter. (Si vous échangez des données avec des réseaux ou d'autres systèmes, vous devez être conscient de endianness , mais c'est un autre article.)

51
Tim Williams

Les flux permettent de traiter de grandes quantités de données. Lorsqu'il n'est pas pratique de charger toutes les données en mémoire en même temps, vous pouvez les ouvrir en tant que flux et travailler avec de petites parties de celui-ci.

21
meatvest

Stream est juste une abstraction (ou un wrapper) sur un flux d'octets physical. Ce flux physical s'appelle le base stream. Donc, il y a toujours un flux de base sur lequel un wrapper de flux est créé et ainsi le wrapper est nommé d'après le type de flux de base c'est-à-dire FileStream, MemoryStream etc.

L'avantage du wrapper de flux est que vous obtenez une API unifiée pour interagir avec les flux de tout type sous-jacent usb, file etc.

Pourquoi traiteriez-vous les données en tant que flux - étant donné que les fragments de données sont chargés à la demande, nous pouvons inspecter/traiter les données comme des morceaux plutôt que de charger la totalité des données en mémoire. C'est ainsi que la plupart des programmes traitent les gros fichiers, par exemple pour chiffrer un fichier image de système d'exploitation.

7
Anwar Husain

Il n'y a qu'un seul type de base de Stream. Cependant, dans diverses circonstances, certains membres liront une exception à l'appel, car l'opération n'était pas disponible.

Par exemple, MemoryStream est simplement un moyen de déplacer des octets dans une partie de la mémoire. Vous pouvez donc appeler lire et écrire dessus.

D'autre part, un FileStream vous permet de lire ou d'écrire (ou les deux) depuis/dans un fichier. Que vous puissiez 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 ne l'avez ouvert que pour un accès en lecture.

4
AnthonyWJones

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

Memorystream et FileStream sont des flux utilisés pour utiliser respectivement la mémoire brute et les fichiers ...

3
Robban

Je n'appellerais pas ces différents types de flux. La classe Stream possède des propriétés CanRead et CanWrite qui vous indiquent si le flux particulier peut être lu et écrit.

La principale différence entre les différentes classes de flux (telles que MemoryStream et FileStream) réside dans le magasin de sauvegarde, à partir duquel les données sont lues ou écrites. C'est assez évident d'après le nom. Un MemoryStream enregistre uniquement les données en mémoire, un FileStream est sauvegardé par un fichier sur disque, un NetworkStream lit les données du réseau, etc.

1
Mattias S