Compartir vía


Stream Clase

Definición

Proporciona una vista genérica de una secuencia de bytes. Se trata de 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 objetos FileStream para copiar de forma asincrónica los archivos de un directorio a otro directorio. La clase FileStream 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 un archivo, un dispositivo de entrada y salida, una canalización de comunicación entre procesos o un socket TCP/IP. La clase Stream 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 implican 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. Escribir es la transferencia de datos de una estructura de datos a una secuencia.

  • Las secuencias pueden 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 FileStreamy MemoryStream.

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

Los métodos Read y Write leen y escriben datos en diversos formatos. Para las secuencias que admiten búsquedas, use los métodos Seek y SetLength y las propiedades Position 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 usar el tipo, debe eliminarlo directa o indirectamente. Para eliminar el tipo directamente, llame a su método Dispose en un bloque try/catch. Para eliminarlo indirectamente, use una construcción de lenguaje como using (en C#) o Using (en Visual Basic). Para obtener más información, vea la sección "Using an Object that Implements IDisposable" (Usar un objeto que implementa IDisposable) en el tema IDisposable interfaz.

Al eliminar un objeto Stream se vacían los datos almacenados en búfer y básicamente se llama al método Flush. 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 clase BufferedStream proporciona la capacidad de encapsular una secuencia almacenada en búfer alrededor de otra secuencia para mejorar el rendimiento de lectura y escritura.

A partir de .NET Framework 4.5, la clase Stream 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 la que una operación de secuencia que consume mucho tiempo puede bloquear el subproceso de la interfaz de usuario y hacer que la aplicación aparezca como si no estuviera funcionando. Los métodos asincrónicos se usan junto con las palabras clave async 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 objeto Stream en una secuencia de Windows Runtime. También puedes convertir una secuencia en Windows Runtime en un objeto Stream mediante los métodos AsStreamForRead y AsStreamForWrite. Para obtener más información, consulte Cómo: Convertir entre secuencias de .NET Framework y flujos de Windows Runtime

Algunas implementaciones de flujo realizan el almacenamiento en búfer local de los datos subyacentes para mejorar el rendimiento. Para estos flujos, puede usar el método Flush 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 campo Null para recuperar una instancia de una secuencia diseñada para este propósito.

Notas a los implementadores

Al implementar una clase derivada de Stream, debe proporcionar implementaciones para los métodos Read(Byte[], Int32, Int32) 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, CanSeek, CanWrite, Flush(), Length, Position, Seek(Int64, SeekOrigin)y SetLength(Int64).

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

Constructores

Stream()

Inicializa una nueva instancia de la clase Stream.

Campos

Null

Un Stream sin memoria auxiliar.

Propiedades

CanRead

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

CanSeek

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

CanTimeout

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

CanWrite

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

Length

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

Position

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

ReadTimeout

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

WriteTimeout

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

Métodos

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

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

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

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

Close()

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

CopyTo(Stream)

Lee 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.

CopyTo(Stream, Int32)

Lee los bytes de la secuencia actual y los escribe en otra secuencia mediante un 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 asincrónicamente 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 de forma asincrónica los bytes de la secuencia actual y los escribe en otra secuencia mediante un 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, mediante un tamaño de búfer y un 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 pertinente necesaria para generar un proxy usado para comunicarse con un objeto remoto.

(Heredado de MarshalByRefObject)
CreateWaitHandle()
Obsoletos.
Obsoletos.
Obsoletos.

Asigna un objeto WaitHandle.

Dispose()

Libera todos los recursos usados por el Stream.

Dispose(Boolean)

Libera los recursos no administrados usados por el Stream y, opcionalmente, libera los recursos administrados.

DisposeAsync()

Libera asincrónicamente los recursos no administrados usados por el Stream.

EndRead(IAsyncResult)

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

EndWrite(IAsyncResult)

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

Equals(Object)

Determina si el objeto especificado es igual al objeto actual.

(Heredado de Object)
Flush()

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

FlushAsync()

Borra de forma asincrónica 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 de forma asincrónica todos los búferes de esta secuencia, hace que los datos almacenados en búfer se escriban en el dispositivo subyacente y supervisa las solicitudes de cancelación.

GetHashCode()

Actúa como función hash predeterminada.

(Heredado de Object)
GetLifetimeService()
Obsoletos.

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()
Obsoletos.

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 Objectactual.

(Heredado de Object)
MemberwiseClone(Boolean)

Crea una copia superficial del objeto MarshalByRefObject actual.

(Heredado de MarshalByRefObject)
ObjectInvariant()
Obsoletos.

Proporciona compatibilidad con un Contract.

Read(Byte[], Int32, Int32)

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

Read(Span<Byte>)

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

ReadAsync(Byte[], Int32, Int32)

Lee de forma asincrónica una secuencia de bytes de la secuencia actual y avanza la posición dentro de la secuencia por el número de bytes leídos.

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

Lee de forma asincrónica una secuencia de bytes de la secuencia actual, avanza la posición dentro de la secuencia por el número de bytes leídos y supervisa las solicitudes de cancelación.

ReadAsync(Memory<Byte>, CancellationToken)

Lee de forma asincrónica una secuencia de bytes de la secuencia actual, avanza la posición dentro de la secuencia por el número de bytes leídos y supervisa las solicitudes de cancelación.

ReadAtLeast(Span<Byte>, Int32, Boolean)

Lee al menos un número mínimo de bytes de la secuencia actual y avanza la posición dentro de la secuencia por el número de bytes leídos.

ReadAtLeastAsync(Memory<Byte>, Int32, Boolean, CancellationToken)

Lee de forma asincrónica al menos un número mínimo de bytes de la secuencia actual, avanza la posición dentro de la secuencia por el número de bytes leídos y supervisa las solicitudes de cancelación.

ReadByte()

Lee un byte de la secuencia y avanza la posición dentro de la secuencia por un byte, o devuelve -1 si está al final de la secuencia.

ReadExactly(Byte[], Int32, Int32)

Lee count número de bytes de la secuencia actual y avanza la posición dentro de la secuencia.

ReadExactly(Span<Byte>)

Lee bytes de la secuencia actual y avanza la posición dentro de la secuencia hasta que se rellena el buffer.

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

Lee de forma asincrónica count número de bytes de la secuencia actual, avanza la posición dentro de la secuencia y supervisa las solicitudes de cancelación.

ReadExactlyAsync(Memory<Byte>, CancellationToken)

Lee de forma asincrónica bytes de la secuencia actual, avanza la posición dentro de la secuencia hasta que se rellena el buffer y supervisa las solicitudes de cancelación.

Seek(Int64, SeekOrigin)

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

SetLength(Int64)

Cuando se invalida en una clase derivada, 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 métodos CopyTo(Stream, Int32) o CopyToAsync(Stream, Int32, CancellationToken).

Write(Byte[], Int32, Int32)

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

Write(ReadOnlySpan<Byte>)

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

WriteAsync(Byte[], Int32, Int32)

Escribe de forma asincrónica una secuencia de bytes en la secuencia actual y avanza la posición actual dentro de esta secuencia por el número de bytes escritos.

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

Escribe de forma asincrónica una secuencia de bytes en la secuencia actual, avanza la posición actual dentro de esta secuencia por el número de bytes escritos y supervisa las solicitudes de cancelación.

WriteAsync(ReadOnlyMemory<Byte>, CancellationToken)

Escribe de forma asincrónica una secuencia de bytes en la secuencia actual, avanza la posición actual dentro de esta secuencia por el número de bytes escritos y supervisa las solicitudes de cancelación.

WriteByte(Byte)

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

Implementaciones de interfaz explícitas

IDisposable.Dispose()

Libera todos los recursos usados por el Stream.

Métodos de extensión

CopyToAsync(Stream, PipeWriter, CancellationToken)

Lee asincrónicamente los bytes de la Stream y los escribe en el PipeWriterespecificado mediante un token de cancelación.

AsInputStream(Stream)

Convierte una secuencia administrada en .NET para aplicaciones de la Tienda Windows en un flujo de entrada en Windows Runtime.

AsOutputStream(Stream)

Convierte una secuencia administrada en .NET para aplicaciones de la Tienda Windows en un flujo de salida en Windows Runtime.

AsRandomAccessStream(Stream)

Convierte la secuencia especificada en una secuencia de acceso aleatorio.

ConfigureAwait(IAsyncDisposable, Boolean)

Configura cómo se realizarán las esperas en las tareas devueltas desde un descartable asincrónico.

Se aplica a

Consulte también