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 a Memorystream
et a FileStream
?
Stream
) qui expose certaines méthodes utiles telles que la lecture, l'écriture et le changement de position. Vous pouvez maintenant créer des classes en fonction de leur magasin de stockage (FileStream, MemoryStream) qui héritent deStream
cette fonctionnalité et s'appuient sur celle-ci en fonction du magasin de stockage particulier.Réponses:
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 dans .NET sont dérivées. LaStream
classe traite des octets.Les classes de flux concrètes sont utilisées pour traiter d'autres types de données que les octets. Par exemple:
FileStream
classe est utilisée lorsque la source externe est un fichierMemoryStream
est utilisé pour stocker des données en mémoireSystem.Net.Sockets.NetworkStream
gère les données du réseauLes flux de lecture / écriture tels que
StreamReader
etStreamWriter
ne sont pas des flux - ils ne sont pas dérivésSystem.IO.Stream
, ils sont conçus pour aider à écrire et à lire des données depuis et à diffuser!la source
Pour développer un peu d'autres réponses ici, et aider à expliquer une grande partie de l'exemple de code que vous verrez en pointillés, la plupart du temps, vous ne lisez et n'écrivez pas directement dans un flux. Les flux sont 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 octets, par exemple WriteByte (). Il n'y a pas de fonctions pour traiter les entiers, les chaînes, etc. Cela rend le flux très polyvalent, mais moins simple à utiliser 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 flux de bas niveau, et transfère les données vers ou depuis le flux pour vous. Certaines de ces classes notables sont:
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
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 flux sous forme d'octets. Alors
écrira «123» (trois caractères «1», «2» puis «3») dans le flux. Si vous avez affaire à des fichiers texte (par exemple html), StreamReader et StreamWriter sont les classes que vous utiliseriez.
Tandis que
écrira quatre octets représentant la valeur entière de 32 bits 123 (0x7B, 0x00, 0x00, 0x00). Si vous avez affaire à des fichiers binaires ou à des protocoles réseau, BinaryReader et BinaryWriter sont ce que vous pouvez utiliser. (Si vous échangez des données avec des réseaux ou d'autres systèmes, vous devez être conscient de l' endianness , mais c'est un autre article.)
la source
Les flux sont utiles pour 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 l'ouvrir en tant que flux et travailler avec de petits morceaux.
la source
Le flux n'est qu'une abstraction (ou un wrapper) sur un
physical
flux d'octets. Cephysical
flux s'appelle lebase stream
. Il y a donc toujours un flux de base sur lequel un wrapper de flux est créé et donc le wrapper est nommé d'après le type de flux de baseFileStream
, c'est -à- dire ,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 comme un flux - 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 crypter un fichier image du système d'exploitation.
la source
Il n'existe qu'un seul type de base
Stream
. Cependant, dans diverses circonstances, certains membres lèveront une exception lorsqu'ils seront appelés car dans ce contexte, l'opération n'était pas disponible.Par exemple, a
MemoryStream
est simplement un moyen de déplacer des octets dans et hors d'un morceau de mémoire. Par conséquent, vous pouvez appeler Read and Write dessus.D'un autre côté, a
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 manière 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.la source
Je commencerais par lire sur les flux sur MSDN: http://msdn.microsoft.com/en-us/library/system.io.stream.aspx
Memorystream et FileStream sont des flux utilisés pour travailler respectivement avec la mémoire brute et les fichiers ...
la source
Je n'appellerais pas ces différents types de flux. La classe Stream a 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 vs FileStream) est le magasin de sauvegarde - où les données sont lues ou où elles sont écrites. C'est assez évident d'après le nom. Un MemoryStream stocke les données en mémoire uniquement, un FileStream est sauvegardé par un fichier sur disque, un NetworkStream lit les données du réseau et ainsi de suite.
la source