Explorando Streams y Clases de E/S en .NET para el Manejo de Archivos

Enviado por Programa Chuletas y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 12,77 KB

El espacio de nombres System.IO contiene tipos que permiten la lectura y la escritura síncrona y asíncrona desde/a streams de datos y archivos.

Streams

Los streams proporcionan una forma de leer y escribir bytes desde y hacia un repositorio de seguridad. Un repositorio de seguridad es un medio de almacenamiento, como un disquete o una memoria.

Los streams tienen las siguientes capacidades:

  1. Podemos leer de streams.
  2. Podemos escribir a streams.
  3. Los streams pueden soportar búsqueda.

Dependiendo de la fuente de datos, los streams pueden soportar únicamente algunas de estas capacidades: CanRead, CanWrite y CanSeek.

Hay streams que usan buffering local para mejorar el rendimiento. Se usa flush para eliminar buffers internos y asegurar que los datos se han escrito.

El método close en stream hace un flush en datos almacenados en buffer y libera recursos del sistema operativo, como descriptores de archivos o memoria utilizada para el proceso de buffering interno.

Clases Reader y Writer

Como se ha comentado en la sección Streams de este módulo, la clase Stream está diseñada para la entrada/salida de bytes. Podemos utilizar las clases reader y writer para extraer e introducir a streams cadenas que usan otros tipos.

La siguiente tabla describe algunas clases reader y writer utilizadas habitualmente:

BinaryReader y BinaryWriter

Estas clases leen y escriben tipos como valores binarios en una codificación específica a y desde un stream.

TextReader y TextWriter

Las implementaciones de estas clases están diseñadas para introducir y extraer caracteres.

StreamReader y StreamWriter

Estas clases se derivan de las clases TextReader y TextWriter, que leen sus caracteres desde un stream y escriben sus caracteres a un stream respectivamente.

StringReader y StringWriter

Estas clases también derivan de las clases TextReader y TextWriter, pero leen sus caracteres desde una cadena y escriben sus caracteres a una clase StringBuilder respectivamente.

Clases de Streams Adicionales

Clase BufferedStream

La clase BufferedStream se utiliza para invocar el proceso de lectura de buffer desde otro stream, y escritura de buffer a otro stream. Un buffer es un bloque de bytes en memoria que se utiliza para almacenar datos en caché, reduciendo así el número de llamadas al sistema operativo. Los buffers pueden utilizarse para mejorar el rendimiento de la lectura y escritura. Ninguna otra clase puede heredar de la clase BufferedStream.

Clase MemoryStream

La clase MemoryStream proporciona un método de creación de streams que utiliza la memoria (en lugar de un disquete o una conexión a red) como repositorio de seguridad. La clase MemoryStream crea un stream desde una matriz de bytes.

Clase FileStream

La clase FileStream se utiliza tanto para leer de archivos como para escribir a ellos. De forma predeterminada, la clase FileStream abre archivos síncronamente, pero también proporciona un constructor para abrir archivos asíncronamente.

Instancia de Stream Null

En ocasiones, una aplicación simplemente necesita que un stream elimine su salida y no devuelva ninguna entrada. Podemos obtener este tipo de stream que no tiene repositorio de seguridad y que no consumirá ningún recurso operativo, del campo estático público de la clase Stream denominado Null.

Por ejemplo, podemos codificar una aplicación para que siempre escriba su salida al FileStream especificado por el usuario. Cuando el usuario no desea un archivo de salida, la aplicación dirige su salida al stream Null. Cuando se invocan los métodos Write de Stream en este stream Null, la invocación simplemente regresa y no se escribe ningún dato. Cuando se invocan los métodos Read, el stream Null devuelve 0 sin leer datos.

Resumen de Clases Reader y Writer

BinaryReader y BinaryWriter: Estas clases leen y escriben tipos como valores binarios en una codificación específica a y desde un stream.

TextReader y TextWriter: Las implementaciones de estas clases están diseñadas para introducir y extraer caracteres.

StreamReader y StreamWriter: Estas clases se derivan de las clases TextReader y TextWriter, que leen sus caracteres desde un stream y escriben sus caracteres a un stream respectivamente.

StringReader y StringWriter: Estas clases también derivan de las clases TextReader y TextWriter, pero leen sus caracteres desde una cadena y escriben sus caracteres a una clase StringBuilder respectivamente.

Ejemplo de Uso de BinaryWriter y BinaryReader

El siguiente ejemplo muestra cómo escribir datos de tipo Integer y leer datos desde un nuevo stream de archivos vacío denominado Test.data. Una vez creado el archivo de datos en el directorio actual, la clase BinaryWriter se utiliza para escribir enteros de 0 a 10 en Test.data. A continuación, la clase BinaryReader lee el archivo y muestra el contenido del archivo en la consola.

Imports System
Imports System.IO
Class MyStream
    Private Const FILE_NAME As String = "Test.data"
    Shared Sub Main()
        ' Create the new, empty data file.
        If (File.Exists(FILE_NAME)) Then
            Console.WriteLine("{0} already exists!", FILE_NAME)
            Exit Sub
        End If
        Dim fs As New FileStream(FILE_NAME, FileMode.CreateNew)
        ' Create the writer for data.
        Dim w As New BinaryWriter(fs)
        ' Write data to Test.data.
        Dim i As Integer
        For i = 0 To 10
            w.Write(i)
        Next
        w.Close()
        fs.Close()
        ' Create the reader for data.
        fs = New FileStream(FILE_NAME, FileMode.Open, _
        FileAccess.Read)
        Dim r As New BinaryReader(fs)
        ' Read data from Test.data.
        For i = 0 To 10
            Console.WriteLine(r.ReadInt32())
        Next
        w.Close()
    End Sub
End Class

Ejemplo de Uso de StringReader

En el siguiente ejemplo, el código define una cadena y la convierte en una matriz de caracteres. Esta matriz puede leerse utilizando el método StringReader.Read adecuado:

Imports System
Imports System.IO
Class CharsFromStr
    Shared Sub Main()
        ' Create a string to read characters from.
        Dim str As String = "Some number of characters"
        ' Size the array to hold all the characters of the
        ' string, so that they are all accessible.
        Dim b(24) As Char
        ' Create a StringReader and attach it to the string.
        Dim sr As New StringReader(str)
        ' Read 13 characters from the array that holds
        ' the string, starting from the first array member.
        sr.Read(b, 0, 13)
        ' Display the output.
        Console.WriteLine(b)
        ' Close the StringReader.
        sr.Close()
    End Sub
End Class

El ejemplo anterior produce la siguiente salida:

Some number o

Codificación de Texto

System.Text.Encoding: Internamente, el entorno de ejecución representa todos los caracteres en formato Unicode. Sin embargo, Unicode puede resultar ineficaz en la transferencia de datos a través de una red, o cuando persiste en un archivo. Para mejorar la eficacia, la biblioteca de clases del .NET Framework proporciona varios tipos derivados de la clase base abstracta System.Text.Encoding. Estas clases pueden codificar y decodificar caracteres Unicode a ASCII, UTF-7, UTF-8, Unicode y otras páginas de código arbitrarias. Cuando construimos un BinaryReader, BinaryWriter, StreamReader o StreamWriter, podemos escoger cualquiera de estas codificaciones. La codificación predeterminada es UTF-8.

Presentación de FileStream

La clase FileStream se utiliza para leer y escribir de/a archivos. Los tipos FileMode, FileAccess y FileShare se utilizan como parámetros en algunos constructores FileStream.

Parámetros FileMode

Los parámetros FileMode controlan si un archivo se ha sobrescrito, creado o abierto, o sometido a cualquier combinación de estas operaciones. La siguiente tabla describe constantes que se utilizan con la clase de parámetros FileMode.

ConstanteDescripción
OpenEsta constante se utiliza para abrir un archivo existente.
AppendEsta constante se utiliza para añadir a un archivo existente.
CreateEsta constante se utiliza para crear un archivo si el archivo no existe todavía.

La Enumeración FileShare

La enumeración FileShare contiene constantes para controlar el tipo de acceso que otros objetos FileStream pueden tener al mismo archivo. Esta enumeración tiene un atributo FlagsAttribute que permite una combinación de bits de sus valores miembro.

La enumeración FileShare se utiliza típicamente para definir si varios procesos pueden leer simultáneamente desde el mismo archivo. Por ejemplo, si se abre un archivo y está especificado FileShare.Read, otros usuarios podrán abrir el archivo para leerlo pero no para escribir. FileShare.Write especifica que otros usuarios pueden escribir simultáneamente en el mismo archivo. FileShare.None declina toda compartición del archivo.

En el siguiente ejemplo, un constructor FileStream abre un archivo existente para acceder en modo lectura y permite a otros usuarios leer el archivo simultáneamente:

Dim f As New FileStream(name, FileMode.Open, _
FileAccess.Read, FileShare.Read)

Uso del Método Seek para el Acceso Aleatorio a Archivos

Los objetos FileStream soportan el acceso aleatorio a archivos utilizando el método Seek. El método Seek permite mover la posición de lectura/escritura del stream de archivos a cualquier posición del archivo. La posición de lectura/escritura puede moverse utilizando los parámetros del punto de referencia del offset de bytes.

El offset de bytes es relativo al punto de referencia de búsqueda, como se representa con las tres propiedades de la clase SeekOrigin, descritas en la siguiente tabla:

Nombre de la propiedadDescripción
BeginPosición de referencia de búsqueda del principio de un stream
CurrentPosición de referencia de búsqueda de la posición actual en un stream
EndPosición de referencia de búsqueda del final de un stream

Entradas relacionadas: