C++ et C # utilisent tous les deux le mot stream
pour nommer de nombreuses classes.
iostream
, istream
, ostream
, stringstream
, ostream_iterator
, istream_iterator
...Stream
, FileStream
, MemoryStream
, BufferedStream
...Cela m'a donc rendu curieux de savoir ce que signifie stream
? Quelles sont les caractéristiques d'un stream
? Quand puis-je utiliser ce terme pour nommer mes classes? Est-ce limité aux classes d'E/S de fichiers uniquement?
Fait intéressant, C n'utilise ce mot nulle part, pour autant que je sache.
De nombreuses structures de données (listes, collections, etc.) agissent comme conteneurs - elles contiennent un ensemble d'objets. Mais pas un ruisseau; si une liste est un seau, un flux est un tuyau. Vous pouvez extraire des données d'un flux ou pousser des données dans un flux - mais normalement ne seule fois et uniquement dans ne direction (il y a des exceptions bien sûr). Par exemple, TCP les données sur un réseau sont un flux; vous pouvez envoyer (ou recevoir) des morceaux de données, mais uniquement en connexion avec l'autre ordinateur, et généralement une seule fois - vous ne pouvez pas rembobiner Internet.
Les flux peuvent également manipuler les données qui les traversent; flux de compression, flux de chiffrement, etc. Mais encore une fois - la métaphore sous-jacente est ici un tuyau de données. Un fichier est également généralement accessible (à un certain niveau) en tant que flux; vous pouvez accéder à des blocs de données séquentielles. Bien sûr, la plupart des systèmes de fichiers fournissent également un accès aléatoire, donc les flux offrent des choses comme la recherche, la position, la longueur, etc. - mais toutes les implémentations ne le prennent pas en charge. Cela n'a aucun sens de rechercher des flux ou d'obtenir la longueur d'une socket ouverte.
De I/O Streams (bien qu'en Java, la signification est la même en C++/C #)
Un flux d'E/S représente une source d'entrée ou une destination de sortie. Un flux peut représenter différents types de sources et de destinations, notamment des fichiers disque, des périphériques, d'autres programmes et des matrices de mémoire.
Les flux prennent en charge différents types de données, y compris des octets simples, des types de données primitifs, des caractères localisés et des objets. Certains flux transmettent simplement des données; d'autres manipulent et transforment les données de manière utile.
Peu importe comment ils fonctionnent en interne, tous les flux présentent le même modèle simple aux programmes qui les utilisent: Un flux est une séquence de données. Un programme utilise un flux d'entrée pour lire les données d'une source, un élément à la fois.
En C #, les flux que vous avez mentionnés dérivent de la classe de base abstraite Stream . Chaque implémentation de cette classe de base a un objectif spécifique.
Par exemple, FileStream prend en charge les opérations de lecture/écriture sur un fichier, tandis que MemoryStream fonctionne sur un objet de flux en mémoire. Contrairement aux classes FileStream
et MemoryStream
, la classe BufferedStream permet à l'utilisateur de tamponner les E/S.
En plus des classes ci-dessus, plusieurs autres classes implémentent la classe Stream
. Pour une liste complète, reportez-vous à la documentation MSDN sur la classe Stream
.
Il y a plusieurs significations différentes. # 1 est ce que vous voulez probablement dire, mais vous voudrez peut-être aussi regarder # 2.
Dans les bibliothèques comme celles que vous avez mentionnées, un "flux" n'est qu'une abstraction pour des "données binaires", qui peuvent ou non être à accès aléatoire (par opposition aux données qui sont générées en continu, comme si vous écriviez un flux qui généré des données aléatoires), ou qui peuvent être stockées n'importe où (en RAM, sur le disque dur, sur un réseau, dans le cerveau de l'utilisateur, etc.). Ils sont utiles car ils vous permettent d'éviter les détails et d'écrire du code générique qui ne se soucie pas de la source particulière du flux.
En tant que concept informatique plus général, un "flux" est parfois considéré (vaguement) comme "une quantité finie ou infinie de données". Le concept est un peu difficile à expliquer sans exemple, mais en programmation fonctionnelle (comme dans Scheme), vous pouvez transformer un objet avec état en objet sans état, en traitant l'histoire de l'objet comme un "flux" de changements. (L'idée est que l'état d'un objet peut changer au fil du temps, mais si vous traitez la vie entière de l'objet comme un "flux" de changements, le flux dans son ensemble ne change jamais et vous pouvez faire de la programmation fonctionnelle avec lui.)
Les termes et explications officiels mis à part, le flux Word lui-même a été tiré de la "vie réelle" stream - au lieu de l'eau, les données est transféré d'un endroit à un autre.
En ce qui concerne la question que vous avez posée et qui n'a toujours pas été répondue, vous pouvez nommer vos propres classes dans des noms qui contiennent un flux, mais seulement si vous implémentez une sorte de nouveau flux, il aura une signification correcte.
Dans les fonctions C définies dans <stdio.h>
fonctionne sur les flux.
La section 7.19.2 Streams in C99 explique comment ils se comportent, mais pas ce qu'ils sont, à part "une séquence ordonnée de personnages".
Le justification donne plus de contexte dans la section correspondante, en commençant par:
C a hérité sa notion de flux de texte de l'environnement UNIX dans lequel il est né.
C'est de là que vient le concept.