Qu'est ce qu'un flux?
Qu'est ce qu'un flux dans le monde de la programmation? Pourquoi avons-nous besoin?
M'expliquer avec l'aide d'une analogie, si possible.
- C'est un doublon de stackoverflow.com/questions/507747/....
Vous devez vous connecter pour publier un commentaire.
Un flux représente une séquence d'objets (généralement octets, mais pas forcément), qui peut être consulté dans l'ordre séquentiel. Les opérations typiques d'un ruisseau:
Un flux particulier peut prendre en charge la lecture (dans ce cas, c'est un "flux d'entrée"), l'écriture ("flux de sortie") ou les deux. Pas tous les flux sont adressable.
Repousser est assez rare, mais vous pouvez toujours l'ajouter à un flux en enveloppant le réel flux d'entrée dans un autre flux d'entrée qui contient une mémoire tampon interne. Lit venir de la mémoire tampon, et si vous repoussez ensuite les données sont placées dans la mémoire tampon. Si il n'y a rien dans la mémoire tampon, puis la repousser flux en lecture sur le flux réel. C'est un exemple simple d'un "flux " adaptateur": il est assis sur la "fin" d'un flux d'entrée, c'est un flux d'entrée lui-même, et il fait quelque chose de plus que le flux d'origine n'a pas.
Flux est une abstraction utile, car elle peut décrire des fichiers (qui sont vraiment des tableaux, donc cherche, c'est simple), mais aussi de terminal d'entrée/sortie (ce qui n'est pas adressable à moins de tampon), les sockets, les ports série, etc. De sorte que vous pouvez écrire du code qui soit dit "je veux des infos, et je ne me soucie pas d'où il vient ni comment il est arrivé ici", ou "je vais produire certaines données, et il est tout à fait à mon interlocuteur ce qui se passe pour elle". Le premier prend un flux d'entrée de paramètre, ce dernier prend un flux de sortie paramètre.
Meilleure analogie que je peux penser est qu'un flux est un convoyeur à venir vers vous, ou conduisant loin de vous (ou parfois les deux). Vous prenez des trucs à un flux d'entrée, vous vous placez sur un flux de sortie. Certains convoyeurs vous pouvez penser comme venant d'un trou dans le mur, ils ne sont pas adressable, de lecture ou d'écriture est un one-time-seulement traiter. Certains convoyeurs sont disposés en face de vous, et vous pouvez vous déplacer le long de choix de localisation dans le flux que vous voulez de lecture/écriture qui cherche.
Comme IRBMe dit, cependant, il est préférable de penser à un flux en termes d'opérations qu'il propose (qui varient de mise en œuvre de la mise en œuvre, mais qui ont beaucoup en commun), plutôt que par une analogie. Les ruisseaux sont des "choses que vous pouvez lire ou écrire". Lorsque vous démarrez la connexion flux des adaptateurs, vous pouvez y penser comme à une boîte avec un convoyeur, et un convoyeur de sortie, que vous vous connectez à d'autres courants et puis la boîte effectue une transformation sur les données (compression, soit en changeant UNIX des sauts de ligne à DOS, ou quoi que ce soit). Les tuyaux sont un autre test en profondeur de la métaphore: c'est là que vous créez une paire de flux tel que rien de ce que vous écrivez dans un seul peut être lu en dehors de l'autre. Pensez trous de ver 🙂
Un flux de données est déjà une métaphore, analogie, donc il n'y a vraiment pas besoin de povide un autre. Vous pouvez penser qu'il est fondamentalement comme un tuyau avec un débit d'eau où l'eau est en fait de données et la pipe est le flux. Je suppose que c'est un 2-way pipe si le flux est bi-directionnelle. En gros, c'est une commune de l'abstraction qui est placée sur des choses où il y a un flux ou d'une séquence de données dans une ou deux directions.
Dans des langages tels que C#, VB.Net, C++, Java, etc., le flux métaphore est utilisée pour beaucoup de choses. Il y a des flux de fichier, dans lequel vous ouvrez un fichier et peut lire à partir de la rivière ou de l'écrire en permanence; Il y a le réseau des cours d'eau où la lecture et l'écriture dans le flux pour lire et écrire à un sous-jacent établi une connexion réseau. Flux pour l'écriture seulement sont habituellement appelés flux de sortie, comme dans cette exemple, et de la même façon, les flux qui sont en lecture seule sont appelés les flux d'entrée, comme dans cette exemple.
Un flux peut effectuer la transformation ou de l'encodage de données (un SslStream dans .Net, par exemple, manger de la négociation SSL des données et de le cacher de vous; Un TelnetStream pourrait cacher le Telnet négociations de vous, mais de fournir un accès aux données; Un ZipOutputStream en Java permet d'écrire des fichiers dans une archive zip, sans avoir à vous soucier de l'intérieur de l'zip format de fichier.
Une autre chose que vous pourriez trouver est textuelle flux qui vous permettent d'écrire des chaînes au lieu d'octets, ou certaines langues fournir les flux binaires qui vous permettent d'écrire des types primitifs. Une chose commune que vous trouverez dans le flux textuel est un codage de caractères, dont vous devez être conscients de.
Certains cours d'eau également de support à accès aléatoire, comme dans cette exemple. Un flux réseau, d'autre part, pour des raisons évidentes, ne serait pas.
Des systèmes d'exploitation UNIX également en charge le modèle de flux avec le programme d'entrée et de sortie, comme décrit ici.
Les réponses apportées jusqu'à présent sont excellents. Je suis le seul à en fournir une autre de souligner que l'un stream n'est pas une séquence d'octets ou spécifiques à un langage de programmation puisque le concept est universel (alors que sa mise en œuvre peut être unique). Je vois souvent une abondance d'explications en ligne en termes de SQL ou C ou Java, qui font sens comme un filestream traite avec les emplacements de la mémoire et des opérations de bas niveau. Mais ils sont souvent traiter de la façon de créer un filestream et d'exploiter le potentiel de fichier dans leur langue plutôt que de discuter de la notion de flux.
La Métaphore
Comme mentionné précédemment, une
stream
est une métaphore, une abstraction de quelque chose de plus complexe. Pour obtenir votre imagination de travail, je propose quelques autres métaphores:le tuyau est le flux
le tuyau, la buse et les mécanismes associés pour permettre l'écoulement du gaz dans votre réservoir est le flux
l'autoroute est le flux
vos oreilles et les yeux sont des cours d'eau
Espérons que vous remarquez dans ces exemples que le flux des métaphores n'existent que pour permettre à quelque chose de voyager à travers lui (ou sur elle dans le cas de l'autoroute) et de ne pas se pose toujours la chose qu'ils sont le transfert. Une distinction importante. Nous ne renvoient pas à nos oreilles comme une séquence de mots. Un tuyau est toujours un tuyau si pas d'eau qui coule à travers elle, mais nous avons pour le raccorder à un robinet pour faire son travail correctement. Une voiture n'est pas le seul genre de véhicule qui peut traverser une autoroute.
Ainsi un flux peut exister, qui n'a pas de données circulant à travers elle aussi longtemps que c'est connecté à un fichier.
Retrait de l'Abstraction
Ensuite, nous avons besoin de répondre à quelques questions. Je vais utiliser des fichiers pour décrire les flux alors... qu'est Ce qu'un fichier? Et comment pouvons-nous lire un fichier? Je vais tenter de répondre à cette tandis que le maintien d'un certain niveau d'abstraction afin d'éviter les complexité et d'utiliser le concept d'un fichier par rapport à un système d'exploitation linux en raison de sa simplicité et de l'accessibilité.
Qu'est ce qu'un fichier?
Un fichier est une abstraction 🙂
Ou, simplement que je ne peux l'expliquer, un fichier est une partie de la structure de données décrivant le fichier et une partie de données qui est le contenu réel.
La structure de données (dites un inode dans les systèmes UNIX/linux) identités des éléments d'information importants sur le contenu, mais ne comprennent pas le contenu lui-même (ou un nom de fichier pour cette question). L'un des éléments d'informations dont il conserve est une adresse de mémoire à l'endroit où le contenu commence. Donc, avec un nom de fichier (ou un lien en dur sous linux), un descripteur de fichier (un fichier numérique nom du système d'exploitation se soucie) et un emplacement de départ dans la mémoire, nous avons quelque chose que nous pouvons appeler un fichier.
(le déterminant est un "fichier" est défini par le système d'exploitation puisque c'est l'OS qui a finalement de traiter avec elle. et oui, fichiers sont beaucoup plus complexes).
So far So good. Mais comment pouvons-nous obtenir le contenu du fichier, disons une lettre d'amour à votre beau, de sorte que nous pouvons l'imprimer?
La lecture d'un fichier
Si nous commençons par le résultat, et le déplacer vers l'arrière, lorsque l'on ouvre un fichier sur notre ordinateur la totalité de son contenu est éclaboussé sur notre écran pour nous de lire. Mais comment? Très méthodique est la réponse. Le contenu du fichier lui-même est une autre structure de données. Supposons qu'un tableau de caractères. Nous pouvons également penser à cela comme une chaîne de caractères.
Alors, comment faisons-nous de "lire" cette chaîne? Par trouver son emplacement dans la mémoire et d'une itération à travers notre tableau de caractères, un caractère à la fois jusqu'à atteindre un caractère de fin de fichier. En d'autres termes un programme.
Un flux est "créé" lorsque son programme est appelé, et il a un emplacement de mémoire pour joindre à ou se connecter à. Un peu comme notre tuyau d'eau exemple, le tuyau est inefficace s'il n'est pas connecté à un robinet. Dans le cas des cours d'eau, il doit être connecté à un fichier pour qu'il existe.
Flux peut être affinée, e.g, un flux de recevoir des commentaires ou un flux de données pour envoyer des fichiers contenu sur la sortie standard. UNIX/linux se connecte et maintient ouvertes 3 filestreams pour nous, dès le départ, stdin (standard input), stdout (sortie standard) et stderr (erreur standard). Les flux peuvent être construits comme des structures de données eux-mêmes ou des objets qui nous permet d'effectuer des opérations plus complexes de la diffusion des données à travers eux, à l'instar de l'ouverture du flux, de la fermeture du ruisseau ou de la vérification des erreurs au fichier un flux de données est connecté. C++
cin
est un exemple d'un objet de flux de données.Sûrement, si vous le souhaitez, vous pouvez écrire vos propres flux.
Définition
Un flux est une réutilisables morceau de code qui fait abstraction de la complexité de la gestion de données, tout en fournissant utile opérations à effectuer sur les données.
En plus de choses mentionnées ci-dessus, il est un autre type de flux de données tel que défini dans les langages de programmation fonctionnelle comme Régime ou Haskell - éventuellement, un infini de discbased qui est généré par une fonction à la demande.
Une autre analogie: Vous ne pouvez pas nager contre un flux, c'est pourquoi vous ne pouvez tout simplement prendre le prochain bit, octet, d'une chaîne ou d'un objet à partir du flux, alors que le déjà de lire les données sont supprimées. Un billet...ou tout simplement à un file d'attente sans stocker de la persistance.
Ainsi nous devons les files d'attente? À vous de décider.
Le mot "flux" a été choisi parce qu'il représente (dans la vraie vie) très proche du sens à ce que nous voulons transmettre lorsque nous les utilisons.
Commencer à penser à l'analogie avec un jet d'eau. Vous recevez un flux continu de données, tout comme l'eau circule continuellement dans une rivière. Vous ne savent pas forcément où les données proviennent d', et le plus souvent vous n'avez pas besoin d'; que ce soit à partir d'un fichier, d'une douille, ou de toute autre source, il n'est pas (ne devrait pas) vraiment d'importance. Ceci est très similaire à la réception d'un flux de l'eau, par laquelle vous n'avez pas besoin de savoir d'où il vient; il est d'un lac, d'une fontaine, ou de toute autre source, il n'est pas (ne devrait pas) vraiment d'importance. source