Stream Clase

Definición

Proporciona una vista genérica de una secuencia de bytes. Esta es una clase abstracta.

public ref class Stream abstract : IDisposable
public ref class Stream abstract : MarshalByRefObject, IAsyncDisposable, IDisposable
public ref class Stream abstract : MarshalByRefObject, IDisposable
public abstract class Stream : IDisposable
public abstract class Stream : MarshalByRefObject, IAsyncDisposable, IDisposable
public abstract class Stream : MarshalByRefObject, IDisposable
[System.Serializable]
public abstract class Stream : MarshalByRefObject, IDisposable
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class Stream : MarshalByRefObject, IDisposable
type Stream = class
    interface IDisposable
type Stream = class
    inherit MarshalByRefObject
    interface IAsyncDisposable
    interface IDisposable
type Stream = class
    inherit MarshalByRefObject
    interface IDisposable
[<System.Serializable>]
type Stream = class
    inherit MarshalByRefObject
    interface IDisposable
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type Stream = class
    inherit MarshalByRefObject
    interface IDisposable
Public MustInherit Class Stream
Implements IDisposable
Public MustInherit Class Stream
Inherits MarshalByRefObject
Implements IAsyncDisposable, IDisposable
Public MustInherit Class Stream
Inherits MarshalByRefObject
Implements IDisposable
Herencia
Stream
Herencia
Derivado
Atributos
Implementaciones

Ejemplos

En el ejemplo siguiente se muestra cómo usar dos FileStream objetos para copiar de forma asincrónica los archivos de un directorio a otro directorio. La clase FileStream se deriva de la clase Stream . Observe que el controlador de eventos Click para el control Button está marcado con el modificador async porque llama a un método asincrónico.

using System;
using System.Threading.Tasks;
using System.Windows;
using System.IO;

namespace WpfApplication
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            string StartDirectory = @"c:\Users\exampleuser\start";
            string EndDirectory = @"c:\Users\exampleuser\end";

            foreach (string filename in Directory.EnumerateFiles(StartDirectory))
            {
                using (FileStream SourceStream = File.Open(filename, FileMode.Open))
                {
                    using (FileStream DestinationStream = File.Create(EndDirectory + filename.Substring(filename.LastIndexOf('\\'))))
                    {
                        await SourceStream.CopyToAsync(DestinationStream);
                    }
                }
            }
        }
    }
}
Imports System.IO

Class MainWindow

    Private Async Sub Button_Click(sender As Object, e As RoutedEventArgs)
        Dim StartDirectory As String = "c:\Users\exampleuser\start"
        Dim EndDirectory As String = "c:\Users\exampleuser\end"

        For Each filename As String In Directory.EnumerateFiles(StartDirectory)
            Using SourceStream As FileStream = File.Open(filename, FileMode.Open)
                Using DestinationStream As FileStream = File.Create(EndDirectory + filename.Substring(filename.LastIndexOf("\"c)))
                    Await SourceStream.CopyToAsync(DestinationStream)
                End Using

            End Using
        Next
    End Sub

End Class

Comentarios

Stream es la clase base abstracta de todos los flujos. Una secuencia es una abstracción de una secuencia de bytes como, por ejemplo, un archivo, un dispositivo de entrada/salida, una canalización de comunicación entre procesos o un socket TCP/IP. La Stream clase y sus clases derivadas proporcionan una vista genérica de estos diferentes tipos de entrada y salida, y aíslan al programador de los detalles específicos del sistema operativo y los dispositivos subyacentes.

Las secuencias comprenden tres operaciones fundamentales:

  • Puede leer desde secuencias. La lectura es la transferencia de datos de una secuencia a una estructura de datos, como una matriz de bytes.

  • Puede escribir en secuencias. La escritura es la transferencia de datos de una estructura de datos a una secuencia.

  • Secuencias puede admitir la búsqueda. La búsqueda hace referencia a la consulta y modificación de la posición actual dentro de una secuencia. La funcionalidad seek depende del tipo de memoria auxiliar que tiene una secuencia. Por ejemplo, los flujos de red no tienen ningún concepto unificado de una posición actual y, por lo tanto, normalmente no admiten la búsqueda.

Algunas de las secuencias más usadas que heredan de Stream son FileStream, y MemoryStream.

Según el origen de datos o el repositorio subyacentes, los flujos pueden admitir solo algunas de estas funcionalidades. Puede consultar una secuencia para sus funcionalidades mediante las CanReadpropiedades , CanWritey CanSeek de la Stream clase .

Los Read métodos y Write leen y escriben datos en diversos formatos. Para las secuencias que admiten la búsqueda, use los Seek métodos y y SetLength las Position propiedades y Length para consultar y modificar la posición y longitud actuales de una secuencia.

Este tipo implementa la interfaz IDisposable. Cuando haya terminado de utilizar el tipo, debe desecharlo directa o indirectamente. Para eliminar el tipo directamente, llame a su método Dispose en un bloque try/catch. Para deshacerse de él indirectamente, use una construcción de lenguaje como using (en C#) o Using (en Visual Basic). Para más información, vea la sección "Uso de objetos que implementan IDisposable" en el tema de la interfaz IDisposable.

La eliminación de un Stream objeto vacía los datos almacenados en búfer y, básicamente, llama al Flush método por usted. Dispose también libera recursos del sistema operativo, como identificadores de archivos, conexiones de red o memoria usadas para cualquier almacenamiento en búfer interno. La BufferedStream clase proporciona la funcionalidad de encapsular un flujo almacenado en búfer alrededor de otro flujo para mejorar el rendimiento de lectura y escritura.

A partir de .NET Framework 4.5, la Stream clase incluye métodos asincrónicos para simplificar las operaciones asincrónicas. Un método asincrónico contiene Async en su nombre, como ReadAsync, WriteAsync, CopyToAsyncy FlushAsync. Estos métodos permiten realizar operaciones de E/S intensivas en recursos sin bloquear el subproceso principal. Esta consideración de rendimiento es especialmente importante en una aplicación de la Tienda Windows 8.x o una aplicación de escritorio en que una operación de streaming prolongada puede bloquear el subproceso de interfaz de usuario y hacer que parezca que una aplicación ha dejado de responder. Los métodos asincrónicos se usan junto con las async palabras clave y await en Visual Basic y C#.

Cuando se usa en una aplicación de la Tienda Windows 8.x, Stream incluye dos métodos de extensión: AsInputStream y AsOutputStream. Estos métodos convierten un Stream objeto en una secuencia del Windows Runtime. También puede convertir una secuencia en el Windows Runtime en un Stream objeto mediante los AsStreamForRead métodos y AsStreamForWrite . Para obtener más información, vea How to: Convert Between .NET Framework Secuencias and Windows Runtime Secuencias

Algunas implementaciones de flujo realizan el almacenamiento en búfer local de los datos subyacentes para mejorar el rendimiento. Para estas secuencias, puede usar el Flush método o FlushAsync para borrar los búferes internos y asegurarse de que todos los datos se han escrito en el origen de datos o el repositorio subyacentes.

Si necesita una secuencia sin memoria auxiliar (también conocida como cubo de bits), use el Null campo para recuperar una instancia de una secuencia diseñada para este fin.

Notas a los implementadores

Al implementar una clase derivada de Stream, debe proporcionar implementaciones para los Read(Byte[], Int32, Int32) métodos y Write(Byte[], Int32, Int32) . Los métodos asincrónicos ReadAsync(Byte[], Int32, Int32), WriteAsync(Byte[], Int32, Int32)y CopyToAsync(Stream) usan los métodos sincrónicos Read(Byte[], Int32, Int32) y Write(Byte[], Int32, Int32) en sus implementaciones. Por lo tanto, las implementaciones de Read(Byte[], Int32, Int32) y Write(Byte[], Int32, Int32) funcionarán correctamente con los métodos asincrónicos. Las implementaciones predeterminadas de ReadByte() y WriteByte(Byte) crean una nueva matriz de bytes de un solo elemento y, a continuación, llaman a las implementaciones de Read(Byte[], Int32, Int32) y Write(Byte[], Int32, Int32). Al derivar de Stream, se recomienda invalidar estos métodos para acceder al búfer interno, si tiene uno, para mejorar considerablemente el rendimiento. También debe proporcionar implementaciones de CanRead, , CanSeekLengthFlush()PositionCanWrite, Seek(Int64, SeekOrigin), y .SetLength(Int64)

No invalide el Close() método, en su lugar, coloque toda la Stream lógica de limpieza en el Dispose(Boolean) método . Para obtener más información, vea Implementar un método Dispose.

Constructores

Stream()

Inicializa una nueva instancia de la clase Stream.

Campos

Null

Stream sin memoria auxiliar.

Propiedades

CanRead

Cuando se reemplaza en una clase derivada, obtiene un valor que indica si la secuencia actual admite lectura.

CanSeek

Cuando se reemplaza en una clase derivada, obtiene un valor que indica si la secuencia actual admite búsquedas.

CanTimeout

Obtiene un valor que determina si se puede agotar el tiempo de espera de la secuencia actual.

CanWrite

Cuando se reemplaza en una clase derivada, obtiene un valor que indica si la secuencia actual admite escritura.

Length

Cuando se reemplaza en una clase derivada, obtiene la longitud en bytes de la secuencia.

Position

Cuando se reemplaza en una clase derivada, se obtiene o se establece la posición dentro de la secuencia actual.

ReadTimeout

Obtiene o establece un valor, en milisegundos, que determina durante cuánto tiempo la secuencia intentará realizar operaciones de lectura antes de que se agote el tiempo de espera.

WriteTimeout

Obtiene o establece un valor, en milisegundos, que determina durante cuánto tiempo la secuencia intentará realizar operaciones de escritura antes de que se agote el tiempo de espera.

Métodos

BeginRead(Byte[], Int32, Int32, AsyncCallback, Object)

Comienza una operación de lectura asincrónica. (Considere usar ReadAsync(Byte[], Int32, Int32) en su lugar).

BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object)

Comienza una operación de escritura asincrónica. (Considere usar WriteAsync(Byte[], Int32, Int32) en su lugar).

Close()

Cierra la secuencia actual y libera todos los recursos (como sockets e identificadores de archivo) asociados a esta. En lugar de llamar a este método, asegúrese de que la secuencia se desecha correctamente.

CopyTo(Stream)

Lee los bytes de la secuencia actual y los escribe en otra secuencia de destino. Ambas posiciones de secuencias están avanzadas por el número de bytes copiados.

CopyTo(Stream, Int32)

Lee todos los bytes de la secuencia actual y los escribe en otra secuencia, usando el tamaño de búfer especificado. Ambas posiciones de secuencias están avanzadas por el número de bytes copiados.

CopyToAsync(Stream)

Lee asincrónicamente los bytes de la secuencia actual y los escribe en otra secuencia. Ambas posiciones de secuencias están avanzadas por el número de bytes copiados.

CopyToAsync(Stream, CancellationToken)

Lee de forma asincrónica los bytes de la secuencia actual y los escribe en otra secuencia mediante un token de cancelación especificado. Ambas posiciones de secuencias están avanzadas por el número de bytes copiados.

CopyToAsync(Stream, Int32)

Lee asincrónicamente los bytes de la secuencia actual y los escribe en otra secuencia, usando el tamaño de búfer especificado. Ambas posiciones de secuencias están avanzadas por el número de bytes copiados.

CopyToAsync(Stream, Int32, CancellationToken)

Lee asincrónicamente los bytes de la secuencia actual y los escribe en otra secuencia, utilizando el tamaño de búfer y el token de cancelación especificados. Ambas posiciones de secuencias están avanzadas por el número de bytes copiados.

CreateObjRef(Type)

Crea un objeto que contiene toda la información relevante necesaria para generar un proxy utilizado para comunicarse con un objeto remoto.

(Heredado de MarshalByRefObject)
CreateWaitHandle()
Obsoleto.
Obsoleto.
Obsoleto.

Asigna un objeto WaitHandle.

Dispose()

Libera todos los recursos que usa Stream.

Dispose(Boolean)

Libera los recursos no administrados que usa Stream y, de forma opcional, libera los recursos administrados.

DisposeAsync()

Libera de forma asincrónica los recursos no administrados usados por Stream.

EndRead(IAsyncResult)

Espera a que se complete la lectura asincrónica que se encuentra pendiente. (Considere usar ReadAsync(Byte[], Int32, Int32) en su lugar).

EndWrite(IAsyncResult)

Finaliza una operación de escritura asincrónica. (Considere usar WriteAsync(Byte[], Int32, Int32) en su lugar).

Equals(Object)

Determina si el objeto especificado es igual que el objeto actual.

(Heredado de Object)
Flush()

Cuando se reemplaza en una clase derivada, borra todos los búferes de esta secuencia y hace que todos los datos almacenados en el búfer se escriban en el dispositivo subyacente.

FlushAsync()

Borra asincrónicamente todos los búferes de esta secuencia y hace que los datos almacenados en búfer se escriban en el dispositivo subyacente.

FlushAsync(CancellationToken)

Borra asincrónicamente todos los búferes de esta secuencia, y hace que todos los datos almacenados en búfer se escriban en el dispositivo subyacente y supervisa las solicitudes de cancelación.

GetHashCode()

Sirve como la función hash predeterminada.

(Heredado de Object)
GetLifetimeService()
Obsoleto.

Recupera el objeto de servicio de duración actual que controla la directiva de duración de esta instancia.

(Heredado de MarshalByRefObject)
GetType()

Obtiene el Type de la instancia actual.

(Heredado de Object)
InitializeLifetimeService()
Obsoleto.

Obtiene un objeto de servicio de duración para controlar la directiva de duración de esta instancia.

(Heredado de MarshalByRefObject)
MemberwiseClone()

Crea una copia superficial del Object actual.

(Heredado de Object)
MemberwiseClone(Boolean)

Crea una copia superficial del objeto MarshalByRefObject actual.

(Heredado de MarshalByRefObject)
ObjectInvariant()
Obsoleto.

Proporciona compatibilidad con una clase Contract.

Read(Byte[], Int32, Int32)

Cuando se reemplaza en una clase derivada, se lee una secuencia de bytes en la secuencia actual y se hace avanzar la posición dentro de la secuencia el número de bytes leídos.

Read(Span<Byte>)

Cuando se reemplaza en una clase derivada, se lee una secuencia de bytes en la secuencia actual y se hace avanzar la posición dentro de la secuencia el número de bytes leídos.

ReadAsync(Byte[], Int32, Int32)

Lee asincrónicamente una secuencia de bytes de la secuencia actual y avanza la posición en esta secuencia según el número de bytes leídos.

ReadAsync(Byte[], Int32, Int32, CancellationToken)

Lee de forma asincrónica una secuencia de bytes en la secuencia actual, se hace avanzar la posición dentro de la secuencia el número de bytes leídos y controla las solicitudes de cancelación.

ReadAsync(Memory<Byte>, CancellationToken)

Lee de forma asincrónica una secuencia de bytes en la secuencia actual, se hace avanzar la posición dentro de la secuencia el número de bytes leídos y controla las solicitudes de cancelación.

ReadByte()

Lee un byte de la secuencia y hace avanzar la posición de la secuencia en un byte, o devuelve -1 si está al final de la secuencia.

Seek(Int64, SeekOrigin)

Cuando se reemplaza en una clase derivada, se establece la posición dentro de la secuencia actual.

SetLength(Int64)

Cuando se reemplaza en una clase derivada, se establece la longitud de la secuencia actual.

Synchronized(Stream)

Crea un contenedor seguro para subprocesos (sincronizado) alrededor del objeto Stream especificado.

ToString()

Devuelve una cadena que representa el objeto actual.

(Heredado de Object)
ValidateBufferArguments(Byte[], Int32, Int32)

Valida los argumentos proporcionados para leer y escribir métodos en Stream.

ValidateCopyToArguments(Stream, Int32)

Valida los argumentos proporcionados a los CopyTo(Stream, Int32) métodos o CopyToAsync(Stream, Int32, CancellationToken) .

Write(Byte[], Int32, Int32)

Cuando se reemplaza en una clase derivada, se escribe una secuencia de bytes en la secuencia actual y se hace avanzar la posición actual dentro de la secuencia el número de bytes escritos.

Write(ReadOnlySpan<Byte>)

Cuando se reemplaza en una clase derivada, se escribe una secuencia de bytes en la secuencia actual y se hace avanzar la posición actual dentro de la secuencia el número de bytes escritos.

WriteAsync(Byte[], Int32, Int32)

Escribe asincrónicamente una secuencia de bytes en la secuencia actual y avanza la posición actual en esta secuencia según el número de bytes escritos.

WriteAsync(Byte[], Int32, Int32, CancellationToken)

Escribe de forma asincrónica una secuencia de bytes en la secuencia actual, se hace avanzar la posición actual dentro de la secuencia el número de bytes escritos y controla las solicitudes de cancelación.

WriteAsync(ReadOnlyMemory<Byte>, CancellationToken)

Escribe de forma asincrónica una secuencia de bytes en la secuencia actual, se hace avanzar la posición actual dentro de la secuencia el número de bytes escritos y controla las solicitudes de cancelación.

WriteByte(Byte)

Escribe un byte a la posición actual en la secuencia y avanza la posición de la secuencia en un byte.

Implementaciones de interfaz explícitas

IDisposable.Dispose()

Libera todos los recursos que usa Stream.

Métodos de extensión

AsInputStream(Stream)

Convierte un flujo administrado de .NET para aplicaciones de Microsoft Store en un flujo de entrada de Windows Runtime.

AsOutputStream(Stream)

Convierte un flujo administrado de .NET para aplicaciones de Microsoft Store en un flujo de salida de Windows Runtime.

AsRandomAccessStream(Stream)

Convierte la secuencia especificada en una secuencia de acceso aleatorio.

ConfigureAwait(IAsyncDisposable, Boolean)

Configura la forma en la que se realizan las expresiones await en las tareas devueltas desde un elemento asincrónico descartable.

Se aplica a

Consulte también