Cet article a fait l'objet d'une traduction manuelle. Déplacez votre pointeur sur les phrases de l'article pour voir la version originale de ce texte.
Traduction
Source
Ce sujet n'a pas encore été évalué - Évaluez ce sujet

BufferedStream, classe

Ajoute une couche de mise en mémoire tampon aux opérations de lecture et d'écriture sur un autre flux. Cette classe ne peut pas être héritée.

System.Object
  System.MarshalByRefObject
    System.IO.Stream
      System.IO.BufferedStream

Espace de noms :  System.IO
Assembly :  mscorlib (dans mscorlib.dll)
[ComVisibleAttribute(true)]
public sealed class BufferedStream : Stream

Le type BufferedStream expose les membres suivants.

  Nom Description
Méthode publique BufferedStream(Stream) Initialise une nouvelle instance de la classe BufferedStream, avec une taille de mémoire tampon par défaut égale à 4 096 octets.
Méthode publique BufferedStream(Stream, Int32) Initialise une nouvelle instance de la classe BufferedStream avec la taille de mémoire tampon spécifiée.
Début
  Nom Description
Propriété publique CanRead Obtient une valeur indiquant si le flux actuel prend en charge la lecture. (Substitue Stream.CanRead.)
Propriété publique CanSeek Obtient une valeur indiquant si le flux actuel prend la recherche en charge. (Substitue Stream.CanSeek.)
Propriété publique CanTimeout Obtient une valeur qui détermine si le flux actuel peut expirer. (Hérité de Stream.)
Propriété publique CanWrite Obtient une valeur indiquant si le flux actuel prend l'écriture en charge. (Substitue Stream.CanWrite.)
Propriété publique Length Obtient la longueur du flux en octets. (Substitue Stream.Length.)
Propriété publique Position Obtient la position dans le flux en cours. (Substitue Stream.Position.)
Propriété publique ReadTimeout Obtient ou définit une valeur exprimée en millisecondes qui définit la durée pendant laquelle le flux tentera d'effectuer la lecture avant d'arriver à expiration. (Hérité de Stream.)
Propriété publique WriteTimeout Obtient ou définit une valeur exprimée en millisecondes qui définit la durée pendant laquelle le flux tentera d'inscrire des données avant d'arriver à expiration. (Hérité de Stream.)
Début
  Nom Description
Méthode publique BeginRead Débute une opération de lecture asynchrone. (Hérité de Stream.)
Méthode publique BeginWrite Débute une opération d'écriture asynchrone. (Hérité de Stream.)
Méthode publique Close Ferme le flux actuel et libère les ressources (telles que les sockets et les handles de fichiers) associées à celui-ci. (Hérité de Stream.)
Méthode publique CopyTo(Stream) Lit les octets à partir du flux actuel et les écrit dans le flux de destination. (Hérité de Stream.)
Méthode publique CopyTo(Stream, Int32) Lit tous les octets du flux actuel et les écrit dans un flux de destination, à l'aide d'une taille de mémoire tampon spécifiée. (Hérité de Stream.)
Méthode publique CreateObjRef Crée un objet contenant toutes les informations appropriées requises pour générer un proxy permettant de communiquer avec un objet distant. (Hérité de MarshalByRefObject.)
Méthode protégée CreateWaitHandle Obsolète. Alloue un objet WaitHandle. (Hérité de Stream.)
Méthode publique Dispose() Libère toutes les ressources utilisées par Stream. (Hérité de Stream.)
Méthode protégée Dispose(Boolean) Libère les ressources non managées utilisées par Stream et libère éventuellement les ressources managées. (Hérité de Stream.)
Méthode publique EndRead Attend que la requête asynchrone en attente se termine. (Hérité de Stream.)
Méthode publique EndWrite Termine une opération d'écriture asynchrone. (Hérité de Stream.)
Méthode publique Equals(Object) Détermine si l'Object spécifié est égal à l'Object en cours. (Hérité de Object.)
Méthode protégée Finalize Autorise un objet à tenter de libérer des ressources et d'exécuter d'autres opérations de netto***ge avant qu'il ne soit récupéré par l'opération garbage collection. (Hérité de Object.)
Méthode publique Flush Efface toutes les mémoires tampons pour ce flux et provoque l'écriture des données mises en mémoire tampon sur le périphérique sous-jacent. (Substitue Stream.Flush().)
Méthode publique GetHashCode Sert de fonction de hachage pour un type particulier. (Hérité de Object.)
Méthode publique GetLifetimeService Récupère l'objet de service de durée de vie en cours qui contrôle la stratégie de durée de vie de cette instance. (Hérité de MarshalByRefObject.)
Méthode publique GetType Obtient le Type de l'instance actuelle. (Hérité de Object.)
Méthode publique InitializeLifetimeService Obtient un objet de service de durée de vie pour contrôler la stratégie de durée de vie de cette instance. (Hérité de MarshalByRefObject.)
Méthode protégée MemberwiseClone() Crée une copie superficielle de l'objet Object actif. (Hérité de Object.)
Méthode protégée MemberwiseClone(Boolean) Crée une copie superficielle de l'objet MarshalByRefObject actuel. (Hérité de MarshalByRefObject.)
Méthode protégée ObjectInvariant Infrastructure. Prend en charge un Contract. (Hérité de Stream.)
Méthode publique Read Copie les octets du flux en cours figurant dans la mémoire tampon dans un tableau. (Substitue Stream.Read(Byte[], Int32, Int32).)
Méthode publique ReadByte Lit un octet dans le flux sous-jacent et retourne un octet casté en int, ou retourne -1 en cas de lecture à partir de la fin du flux. (Substitue Stream.ReadByte().)
Méthode publique Seek Définit la position dans le flux en cours mis en mémoire tampon. (Substitue Stream.Seek(Int64, SeekOrigin).)
Méthode publique SetLength Définit la longueur du flux mis en mémoire tampon. (Substitue Stream.SetLength(Int64).)
Méthode publique ToString Retourne une chaîne qui représente l'objet actuel. (Hérité de Object.)
Méthode publique Write Copie les octets dans le flux mis en mémoire tampon et avance la position actuelle dans ce flux du nombre d'octets écrits. (Substitue Stream.Write(Byte[], Int32, Int32).)
Méthode publique WriteByte Écrit un octet à la position actuelle dans le flux mis en mémoire tampon. (Substitue Stream.WriteByte(Byte).)
Début

Une mémoire tampon est un bloc d'octets en mémoire, utilisé pour mettre des données en cache, afin de réduire le nombre d'appels adressés au système d'exploitation. Les mémoires tampons optimisent les opérations de lecture et d'écriture. Une mémoire tampon peut être utilisée pour la lecture ou l'écriture, mais jamais pour ces deux opérations en même temps. Les méthodes Read et Write de BufferedStream mettent automatiquement à jour la mémoire tampon.

BufferedStream peut être créé à partir de certains types de flux. Il fournit des implémentations pour la lecture et l'écriture d'octets dans une source de données ou un référentiel sous-jacent. Utilisez BinaryReader et BinaryWriter pour lire et écrire d'autres types de données. BufferedStream empêche la mémoire tampon de ralentir l'entrée ou la sortie lorsque la mémoire tampon n'est pas nécessaire. Si la lecture ou l'écriture porte toujours sur des données de taille supérieure à celle de la mémoire tampon interne, BufferedStream risque de ne pas allouer la mémoire tampon interne. BufferedStream met également en mémoire tampon les lectures et les écritures dans une mémoire tampon partagée. Il est supposé que, dans la majorité des cas, vous allez réaliser une série de lectures et d'écritures, mais que vous passerez rarement d'une opération à l'autre.

L'exemple de code suivant montre comment utiliser la classe BufferedStream sur la classe NetworkStream pour améliorer les performances de certaines opérations d'E/S. Démarrez le serveur sur un ordinateur distant avant de démarrer le client. Spécifiez le nom de l'ordinateur distant en tant qu'argument de ligne de commande lors du démarrage du client. Faites varier les constantes dataArraySize et streamBufferSize pour voir leur effet sur les performances.

using System;
using System.IO;
using System.Globalization;
using System.Net;
using System.Net.Sockets;

publicclass Client
{
    constint dataArraySize    =   100;
    constint streamBufferSize =  1000;
    constint numberOfLoops    = 10000;

    staticvoid Main(string[] args)
    {
        // Check that an argument was specified when the// program was invoked.if(args.Length == 0)
        {
            Console.WriteLine("Error: The name of the host computer" +
                " must be specified when the program is invoked.");
            return;
        }

        string remoteName = args[0];

        // Create the underlying socket and connect to the server.
        Socket clientSocket = new Socket(AddressFamily.InterNetwork,
            SocketType.Stream, ProtocolType.Tcp);

        clientSocket.Connect(new IPEndPoint(
            Dns.Resolve(remoteName).AddressList[0], 1800));

        Console.WriteLine("Client is connected.\n");

        // Create a NetworkStream that owns clientSocket and// then create a BufferedStream on top of the NetworkStream.// Both streams are disposed when execution exits the// using statement.using(Stream
            netStream = new NetworkStream(clientSocket, true),
            bufStream =
                  new BufferedStream(netStream, streamBufferSize))
        {
            // Check whether the underlying stream supports seeking.
            Console.WriteLine("NetworkStream {0} seeking.\n",
                bufStream.CanSeek ? "supports" : "does not support");

            // Send and receive data.if(bufStream.CanWrite)
            {
                SendData(netStream, bufStream);
            }
            if(bufStream.CanRead)
            {
                ReceiveData(netStream, bufStream);
            }

            // When bufStream is closed, netStream is in turn// closed, which in turn shuts down the connection// and closes clientSocket.
            Console.WriteLine("\nShutting down the connection.");
            bufStream.Close();
        }
    }

    staticvoid SendData(Stream netStream, Stream bufStream)
    {
        DateTime startTime;
        double networkTime, bufferedTime;

        // Create random data to send to the server.byte[] dataToSend = newbyte[dataArraySize];
        new Random().NextBytes(dataToSend);

        // Send the data using the NetworkStream.
        Console.WriteLine("Sending data using NetworkStream.");
        startTime = DateTime.Now;
        for(int i = 0; i < numberOfLoops; i++)
        {
            netStream.Write(dataToSend, 0, dataToSend.Length);
        }
        networkTime = (DateTime.Now - startTime).TotalSeconds;
        Console.WriteLine("{0} bytes sent in {1} seconds.\n",
            numberOfLoops * dataToSend.Length,
            networkTime.ToString("F1"));

        // Send the data using the BufferedStream.
        Console.WriteLine("Sending data using BufferedStream.");
        startTime = DateTime.Now;
        for(int i = 0; i < numberOfLoops; i++)
        {
            bufStream.Write(dataToSend, 0, dataToSend.Length);
        }
        bufStream.Flush();
        bufferedTime = (DateTime.Now - startTime).TotalSeconds;
        Console.WriteLine("{0} bytes sent in {1} seconds.\n",
            numberOfLoops * dataToSend.Length,
            bufferedTime.ToString("F1"));

        // Print the ratio of write times.
        Console.WriteLine("Sending data using the buffered " +
            "network stream was {0} {1} than using the network " +
            "stream alone.\n",
            (networkTime/bufferedTime).ToString("P0"),
            bufferedTime < networkTime ? "faster" : "slower");
    }

    staticvoid ReceiveData(Stream netStream, Stream bufStream)
    {
        DateTime startTime;
        double networkTime, bufferedTime = 0;
        int bytesReceived = 0;
        byte[] receivedData = newbyte[dataArraySize];

        // Receive data using the NetworkStream.
        Console.WriteLine("Receiving data using NetworkStream.");
        startTime = DateTime.Now;
        while(bytesReceived < numberOfLoops * receivedData.Length)
        {
            bytesReceived += netStream.Read(
                receivedData, 0, receivedData.Length);
        }
        networkTime = (DateTime.Now - startTime).TotalSeconds;
        Console.WriteLine("{0} bytes received in {1} seconds.\n",
            bytesReceived.ToString(),
            networkTime.ToString("F1"));

        // Receive data using the BufferedStream.
        Console.WriteLine("Receiving data using BufferedStream.");
        bytesReceived = 0;
        startTime = DateTime.Now;

        int numBytesToRead = receivedData.Length;

        while (numBytesToRead > 0)
        {
            // Read may return anything from 0 to numBytesToRead.int n = bufStream.Read(receivedData,0, receivedData.Length);
            // The end of the file is reached.if (n == 0)
                break;
            bytesReceived += n;
            numBytesToRead -= n;
        }

        bufferedTime = (DateTime.Now - startTime).TotalSeconds;
        Console.WriteLine("{0} bytes received in {1} seconds.\n",
            bytesReceived.ToString(),
            bufferedTime.ToString("F1"));

        // Print the ratio of read times.
        Console.WriteLine("Receiving data using the buffered network" +
            " stream was {0} {1} than using the network stream alone.",
            (networkTime/bufferedTime).ToString("P0"),
            bufferedTime < networkTime ? "faster" : "slower");
    }
}


using System;
using System.Net;
using System.Net.Sockets;

publicclass Server 
{
    staticvoid Main() 
    {
        // This is a Windows Sockets 2 error code.constint WSAETIMEDOUT = 10060;

        Socket serverSocket;
        int bytesReceived, totalReceived = 0;
        byte[] receivedData = newbyte[2000000];

        // Create random data to send to the client.byte[] dataToSend = newbyte[2000000];
        new Random().NextBytes(dataToSend);

        IPAddress ipAddress =
            Dns.Resolve(Dns.GetHostName()).AddressList[0];

        IPEndPoint ipEndpoint = new IPEndPoint(ipAddress, 1800);

        // Create a socket and listen for incoming connections.using(Socket listenSocket = new Socket(
            AddressFamily.InterNetwork, SocketType.Stream, 
            ProtocolType.Tcp))
        {
            listenSocket.Bind(ipEndpoint);
            listenSocket.Listen(1);

            // Accept a connection and create a socket to handle it.
            serverSocket = listenSocket.Accept();
            Console.WriteLine("Server is connected.\n");
        }

        try
        {
            // Send data to the client.
            Console.Write("Sending data ... ");
            int bytesSent = serverSocket.Send(
                dataToSend, 0, dataToSend.Length, SocketFlags.None);
            Console.WriteLine("{0} bytes sent.\n", 
                bytesSent.ToString());

            // Set the timeout for receiving data to 2 seconds.
            serverSocket.SetSocketOption(SocketOptionLevel.Socket,
                SocketOptionName.ReceiveTimeout, 2000);

            // Receive data from the client.
            Console.Write("Receiving data ... ");
            try
            {
                do
                {
                    bytesReceived = serverSocket.Receive(receivedData,
                        0, receivedData.Length, SocketFlags.None);
                    totalReceived += bytesReceived;
                }
                while(bytesReceived != 0);
            }
            catch(SocketException e)
            {
                if(e.ErrorCode == WSAETIMEDOUT)
                {
                    // Data was not received within the given time.// Assume that the transmission has ended.
                }
                else
                {
                    Console.WriteLine("{0}: {1}\n", 
                        e.GetType().Name, e.Message);
                }
            }
            finally
            {
                Console.WriteLine("{0} bytes received.\n",
                    totalReceived.ToString());
            }
        }
        finally
        {
            serverSocket.Shutdown(SocketShutdown.Both);
            Console.WriteLine("Connection shut down.");
            serverSocket.Close();
        }
    }
}


.NET Framework

Pris en charge dans : 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Pris en charge dans : 4, 3.5 SP1

Windows 7, Windows Vista SP1 ou ultérieur, Windows XP SP3, Windows XP SP2 Édition x64, Windows Server 2008 (installation minimale non prise en charge), Windows Server 2008 R2 (installation minimale prise en charge avec SP1 ou version ultérieure), Windows Server 2003 SP2

Le .NET Framework ne prend pas en charge toutes les versions de chaque plateforme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise du .NET Framework.
Tous les membres static (Shared en Visual Basic) publics de ce type sont thread-safe. Il n'est pas garanti que les membres d'instance soient thread-safe.
Cela vous a-t-il été utile ?
(1500 caractères restants)
Contenu de la communauté Ajouter
Annotations FAQ