Question

Les flux 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:

  • flux
  • flux de lecture
  • flux d'écriture

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

Était-ce utile?

La solution

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 de laquelle 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 des types de données autres 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 flux de lecteur / graveur tels que StreamReader et StreamWriter ne sont pas des flux - ils ne sont pas dérivés de System.IO.Stream , ils le sont conçu pour aider à écrire et lire des données à partir de et à diffuser!

Autres conseils

Pour développer un peu plus les autres réponses ici, et aider à expliquer beaucoup de code d'exemple que vous verrez en pointillé, 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’existe pas de fonctions permettant de gérer les entiers, les chaînes, etc. Cela rend le flux très général, mais il est 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. Ex.

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. Donc

myStreamWriter.Write(123);

écrira " 123 " (trois caractères '1', '2' puis '3') au flux. Si vous utilisez des fichiers texte (par exemple, html), StreamReader et StreamWriter sont les classes que vous utiliseriez.

Attendu

myBinaryWriter.Write(123);

écrira quatre octets représentant la valeur entière de 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 garder à l’esprit endianness , mais c'est un autre post.)

Les flux permettent de traiter 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 les ouvrir en tant que flux et travailler avec de petites portions de celui-ci.

Le flux n'est qu'une abstraction (ou un wrapper) sur un flux d'octets physique . Ce flux physique est appelé flux de base . 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, à savoir FileStream , MemoryStream etc.

L'avantage du wrapper de flux réside dans le fait que vous obtenez une API unifiée pour interagir avec les flux de tout type sous-jacent usb, fichier , etc.

Pourquoi voudriez-vous traiter les données comme des flux - étant donné que les fragments de données sont chargés à la demande, nous pouvons inspecter / traiter les données sous forme de fragments plutôt que de charger l'intégralité des données dans 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.

Il existe un seul type de base de Stream . Toutefois, dans certaines circonstances, certains membres liront une exception à l'appel, car l'opération n'était pas disponible.

Par exemple, un MemoryStream constitue 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 / vers 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.

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

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

Je n'appellerais pas ces différents types de flux. La classe Stream possède les 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 le disque, un NetworkStream lit les données du réseau, etc.

.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top