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:
- Podemos leer de streams.
- Podemos escribir a streams.
- 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
.
Constante | Descripción |
---|---|
Open | Esta constante se utiliza para abrir un archivo existente. |
Append | Esta constante se utiliza para añadir a un archivo existente. |
Create | Esta 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 propiedad | Descripción |
---|---|
Begin | Posición de referencia de búsqueda del principio de un stream |
Current | Posición de referencia de búsqueda de la posición actual en un stream |
End | Posición de referencia de búsqueda del final de un stream |