Un flux est une abstraction sur une séquence d’octets. Vous pouvez le considérer comme un tampon continu qui peut être lu ou écrit. Les flux sont souvent utilisés en conjonction avec des tampons pour aider à charger plus efficacement les données en mémoire. L’espace de noms System.IO dans .NET comporte de nombreuses classes qui fonctionnent avec des flux, telles que les classes FileStream, MemoryStream, FileInfo et StreamReader/Writer.

Fondamentalement, les flux sont classés en tant que flux d’octets ou flux de caractères, où les flux d’octets traitent des données représentées sous forme d’octets et les flux de caractères traitent des caractères. Dans .NET, les flux d’octets incluent les classes Stream, FileStream, MemoryStream et BufferedStream. Les flux de caractères .NET incluent TextReader, TextWriter, StreamReader et StreamWriter.

Cet article illustre l’utilisation des classes BufferedStream et MemoryStream en C#, avec des exemples de code pertinents, le cas échéant. Pour travailler avec les exemples de code fournis dans cet article, vous devez avoir installé Visual Studio 2022 sur votre système. Si vous n’en avez pas déjà une copie, vous pouvez télécharger Visual Studio 2022 ici.

Créer un projet d’application console dans Visual Studio

Tout d’abord, créons un projet d’application console .NET Core dans Visual Studio. En supposant que Visual Studio 2022 est installé sur votre système, suivez les étapes décrites ci-dessous pour créer un nouveau projet d’application de console .NET Core dans Visual Studio.

  1. Lancez l’IDE Visual Studio.
  2. Cliquez sur “Créer un nouveau projet”.
  3. Dans la fenêtre “Créer un nouveau projet”, sélectionnez “Application console (.NET Core)” dans la liste des modèles affichés.
  4. Cliquez sur Suivant.
  5. Dans la fenêtre “Configurer votre nouveau projet” illustrée ci-dessous, spécifiez le nom et l’emplacement du nouveau projet.
  6. Cliquez sur Suivant.
  7. Dans la fenêtre “Informations supplémentaires” affichée ensuite, choisissez “.NET 7.0 (Standard Term Support)” comme version de Framework que vous souhaitez utiliser.
  8. Cliquez sur Créer.

Nous utiliserons ce projet d’application console .NET 7 pour travailler avec les classes BufferedStream et MemoryStream dans les sections suivantes de cet article.

Qu’est-ce qu’un tampon ?

Un tampon représente un bloc d’octets en mémoire où vous pouvez temporairement stocker des données transitoires. Un tampon aide à minimiser le nombre d’appels que votre application effectue pour lire et écrire des données depuis et vers le système de fichiers. Les tampons sont utiles lorsque vous avez besoin de stocker des données qui sont transférées d’un système informatique à un autre ou d’un composant de programme à un autre.

Les tampons sont utilisés conjointement avec les flux pour faciliter la lecture et l’écriture efficaces des données par les programmes. Les tampons stockent temporairement les données afin que votre application n’ait pas besoin de relire les données du disque à chaque fois qu’elles sont demandées.

Utiliser la classe BufferedStream en C#

La classe BufferedStream représente un type de flux qui peut mettre en mémoire tampon des données avant de les écrire dans le flux. En d’autres termes, un flux mis en mémoire tampon peut lire ou écrire des données dans une mémoire tampon, ce qui vous permet de lire ou d’écrire de plus gros blocs de données à la fois pour améliorer les performances. Vous pouvez créer des flux mis en mémoire tampon à partir de flux de mémoire et de flux de fichiers.

Lorsque vous créez une instance de la classe BufferedStream, vous pouvez également spécifier la taille de la mémoire tampon. La taille de tampon par défaut est de 4096 octets. La lecture de données à partir d’un flux mis en mémoire tampon implique la lecture à partir de la mémoire tampon lorsque vous appelez la méthode Read. Même si vous appelez Read plusieurs fois, les données ne seront extraites du flux qu’une seule fois.

Lorsque vous écrivez dans un flux mis en mémoire tampon, les données sont écrites dans une mémoire tampon, puis vidées dans le flux lorsque vous appelez la méthode Flush. Cela améliore les performances en évitant d’accéder au flux pour chaque appel Write. Lorsque nous utilisons un tampon, nous n’exécutons pas d’écritures ou de lectures tant qu’un certain nombre d’opérations n’ont pas été demandées.

En stockant une certaine quantité de données dans sa mémoire tampon interne, BufferedStream peut traiter plusieurs opérations sur le même morceau de mémoire sans avoir à allouer de la mémoire encore et encore. Cela permet d’économiser du temps et de la mémoire lors de la création répétée de nouveaux objets.

Notez que vous pouvez utiliser une instance BufferedStream pour lire ou écrire des données, mais vous ne pouvez pas utiliser la même instance pour les deux opérations. BufferedStream est conçu pour empêcher l’entrée et la sortie de ralentir lorsqu’il n’y a pas besoin de tampon. Un flux mis en mémoire tampon peut même ne pas allouer de mémoire tampon interne si la taille de lecture et d’écriture est toujours supérieure à la taille de la mémoire tampon interne.

L’extrait de code suivant montre comment vous pouvez écrire des données dans un fichier à l’aide de BufferedStream.

 
using (FileStream fileStream = new FileStream("D:\\MyTextFile.txt", FileMode.Create, FileAccess.ReadWrite))

      BufferedStream bufferedStream = new BufferedStream(fileStream, 1024);
      byte[] bytes = Encoding.ASCII.GetBytes("This is a sample text.");
      bufferedStream.Write(bytes);
      bufferedStream.Flush();
      bufferedStream.Close();

Quand utiliser BufferedStream ? Utilisez BufferedStream lorsque vous souhaitez ajouter la prise en charge de la mise en mémoire tampon à un flux existant. Ainsi, si le flux d’origine était un flux réseau, les données qui lui étaient envoyées seraient mises en cache dans un petit tampon avant d’être écrites ou extraites du flux réseau.

Utilisation de la classe MemoryStream en C#

La classe MemoryStream représente un flux léger qui vous permet d’écrire ou de lire dans une mémoire tampon. La classe MemoryStream prend en charge les mêmes méthodes et propriétés que celles de la classe Stream. MemoryStream fournit un moyen simple de lire ou d’écrire des données directement à partir de la mémoire, sans avoir à allouer et à libérer de la mémoire chaque fois que vous voulez lire ou écrire quelque chose. Cela le rend plus rapide que d’utiliser d’autres techniques qui vous obligent à réallouer de la mémoire à chaque utilisation.

Un flux mémoire est un flux très rapide et efficace puisque les données résident dans la mémoire. Cependant, cela signifie également qu’il peut être facilement perdu si le programme se bloque ou si l’ordinateur s’arrête brusquement.

La classe MemoryStream fait partie de l’espace de noms System.IO. Il peut être utilisé pour lire et écrire dans des fichiers, des connexions réseau et d’autres périphériques prenant en charge la lecture et l’écriture de données. La classe MemoryStream peut également être utilisée pour sérialiser un objet dans un flux d’octets pour le stockage ou la transmission via une connexion réseau.

L’extrait de code suivant montre comment vous pouvez écrire des données dans un flux de mémoire en C#.

 
byte[] bytes = System.Text.Encoding.ASCII.GetBytes("This is a sample text.");
using (MemoryStream memoryStream = new MemoryStream(50))

     memoryStream.Write(bytes, 0, bytes.Length);

Quand utiliser MemoryStream ? Comme son nom l’indique, MemoryStream est un flux de mémoire uniquement. En tant que tel, il ne doit être utilisé que lorsque la quantité de données à mettre en cache est suffisamment petite pour tenir confortablement dans la mémoire.

Alors que BufferedStream est plus rapide et plus efficace, MemoryStream est bien adapté aux scénarios où votre application nécessite un accès plus rapide aux données. Vous pouvez utiliser les versions asynchrones des méthodes Read et Write des classes BufferedStream et MemoryStream pour des performances et une évolutivité encore meilleures.

Copyright © 2022 IDG Communications, Inc.

Leave a Reply