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