Pour obtenir un exemple de création de fichier et d'écriture de texte dans un fichier, consultez Comment : écrire du texte dans un fichier. Pour obtenir un exemple de lecture de texte à partir d'un fichier, consultez Comment : lire du texte dans un fichier. Pour obtenir un exemple de lecture et d'écriture dans un fichier binaire, consultez Comment : lire et écrire dans un fichier de données créé récemment.
Les flux impliquent trois opérations fondamentales :
Vous pouvez lire à partir des flux. La lecture est le transfert de données d'un flux vers une structure de données tel qu'un tableau d'octets.
Vous pouvez écrire dans les flux. L'écriture est le transfert de données d'une structure de données vers un flux.
Les flux peuvent prendre en charge la recherche. La recherche consiste à envoyer une requête concernant la position actuelle dans un flux et à modifier cette dernière. La fonctionnalité de recherche dépend du type de magasin de stockage du flux. Par exemple, les flux de réseau n'ont pas de concept unifié pour une position actuelle et ne prennent donc généralement pas en charge la recherche.
Stream est la classe de base abstraite de tous les flux. Un flux est une abstraction d'une séquence d'octets, telle qu'un fichier, un périphérique d'entrée/sortie, un canal de communication à processus interne, ou un socket TCP/IP. La classe Stream et ses classes dérivées donnent une vue générique de ces différents types d'entrées et de sorties, isolant le programmeur des détails spécifiques au système d'exploitation et aux périphériques sous-jacents.
Selon la source de données sous-jacente ou le référentiel, les flux peuvent prendre en charge certaines de ces fonctionnalités. Une application peut envoyer une requête à un flux concernant ses fonctionnalités en utilisant les propriétés CanRead, CanWrite et CanSeek.
Les méthodes Read et Write lisent et écrivent les données dans divers formats. Pour les flux qui prennent la recherche en charge, utilisez les méthodes Seek et SetLength ainsi que les propriétés Position et Length pour envoyer une requête concernant la position actuelle et la longueur d'un flux et les modifier.
Certaines implémentations de flux effectuent la mise en mémoire tampon locale des données sous-jacentes afin d'améliorer la performance. Pour ces flux, la méthode Flush peut être utilisée pour effacer les mémoires tampons internes et assurer l'écriture de toutes les données dans la source de données sous-jacente ou le référentiel.
Le fait d'appeler Close sur Stream vide les données mises dans la mémoire tampon, en appelant Flush pour vous. Close libère également les ressources du système d'exploitation, telles que les handles de fichiers, les connexions réseau ou la mémoire utilisée pour une mise en mémoire tampon interne. La classe BufferedStream offre la possibilité d'encapsuler un flux mis en mémoire tampon autour d'un autre flux afin d'améliorer la performance de lecture et d'écriture.
Si vous voulez un flux sans magasin de stockage (également appelé compartiment de bits), utilisez Null.
Remarques à l'attention des implémenteurs : Lors de l'implémentation d'une classe dérivée de Stream, vous devez fournir des implémentations pour les méthodes Read et Write. Les méthodes asynchrones BeginRead, EndRead, BeginWrite et EndWrite sont implémentées à l'aide des méthodes synchrones Read et Write. De même, vos implémentations de Read et Write fonctionneront correctement avec les méthodes asynchrones. Les implémentations par défaut de ReadByte et WriteByte créent un nouveau tableau d'octets à un seul élément puis appellent vos implémentations de Read et Write. Si la classe dérive de Stream et que vous avez une mémoire tampon d'octets interne, il est vivement recommandé de substituer ces méthodes pour y accéder afin d'améliorer les performances. Vous devez également fournir des implémentations de CanRead, CanSeek, CanWrite, Flush, Length, Position, Seek et SetLength.
Ne substituez pas la méthode Close ; placez plutôt toute la logique de nettoyage de Stream dans la méthode Dispose. Pour plus d'informations, consultez Implémentation d'une méthode Dispose.