viernes, 10 de julio de 2015

Receta C# No. 5-7: Escritura y Lectura de un Archivo de Texto

Índice

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
3.1 Clase FileStream
3.2 Clase StreamWriter
3.3 Clase StreamReader
3.4 Sistemas de codificación
4. Práctica: Código C#
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

Esta séptima receta C# de la serie de archivos, directorios, lectura y escritura la enfocaremos a conocer varias de las clases disponibles en .NET Framework para permitir la escritura y lectura de archivos de texto plano: FileStream, StreamWriter, StreamReader. También hablaremos de algunos de los sistemas de codificación de caracteres disponibles en el namespace System.Text. El ejemplo al final de la receta comprenderá una aplicación de consola para escribir y leer en y desde un archivo de texto plano.

1. Problema

Requerimos conocer y poner en práctica los artefactos de la libraría BCL para la escritura y la lectura de datos en archivos de texto. Además, distinguir entre los distintos sistemas de codificación de texto disponibles en el nombre de espacio System.Text.

2. Solución

La Base Class Library de .NET provee tres clases para este requerimiento:
  • System.IO.FileStream
  • System.IO.StreamWriter, y 
  • System.IO.StreamReader.

3. Discusión de la Solución

3.1 Clase FileStream

La clase FileStream [2] (namespace System.Text) provee el mecanismo para la manipulación de archivos. En específico, esta clase provee miembros para las siguientes operaciones:
  • lectura, 
  • escritura, 
  • apertura, y
  • cierre
de archivos en un sistema de archivos.

Por otro lado, esta clase opera en dos modos: sincrónico y asincrónico. En el modo sincrónico la operación ejecutada ha de finalizar para continuar con la siguiente, en el modo asincrónico podemos continuar el flujo de ejecución sin tener que esperar a que la operación finalice (o esperar eventualmente en punto determinado).

FileStream implementa la interfaz IDisposable [3], lo que quiere decir que una vez finalicemos todas las operaciones que se requieran, deberíamos llamar el método Dispose en un bloque try/catch para la liberación explícita de recursos.

3.2 Clase StreamWriter

La clase StreamWriter está localizada en el nombre de espacio System.IO. Esta clase se encarga de la escritura de caracters en un flujo; para ello utiliza uno de los sistemas de codificación disponibles en .NET.

Las versiones sobrecargadas del método Write [4] permite la escritura de diferentes tipos de datos con formatos. En la Tabla 1 [4] se muestra una breve descripción de cada uno estos métodos:
Versiones sobrecargadas de StreamWriter.Write
Tabla 1. Versiones sobrecargadas de StreamWriter.Write [4].
Esta clase también implementa la interfaz IDisposable.

3.3 Clase StreamReader

Con StreamReader [5] disponemos de miembros para la lectura de caracteres desde un flujo (stream). Los métodos clave de esta clase son Read y ReadLine.

Con Read [6] se lee el siguiente caracter o un conjunto de caracteres. Este método ofrece dos versiones sobrecargadas: la primera lee el siguiente caracter y pasa a la siguiente posición en el flujo. Mientras que la segunda versión permite leer una cantidad específica de caracteres sobre un búfer.

Por otro lado, con ReadLine [7] se lee una línea completa a partir de la posición actual en el flujo (stream).


Debido a la implementación de IDisposable, un objeto de StreamReader debería invocar al método Dispose para la liberación de recursos máquina ocupados.

3.4 Sistemas de códificación

Internamente una cadena de caracteres puede ser representada en uno de los sistemas de codificación disponibles [1]:
  • ASCII: Codificación usando 7 bits. En .NET la representación basada en este sistema se representa con 1 byte.
  • Unicode UTF-16: representación de cada caracter en 2 bytes.
  • Unicode UTF-7: 7 bits para caracteres ASCII y múltiplos de 7-bits pares para otros caracteres.
  • Unicode UTF-8: 8 bits para caracteres ASCII y mútiplos de 8 bits pares para otros caracteres.
.NET cuenta con las respectivas clases para cada uno de estos sistemas de codificación en el namespace System.Text.

Por defecto las clases StreamWriter y StreamReader utilizan UTF-8 para las operaciones de codificación de caracteres.

4. Práctica: Código C#

Con la adaptación del ejemplo C#, presentado en [1], haremos uso de una aplicación consola para la creaciónn de un archivo de texto que nos permita escribir algunos caracteres y leerlos más adelante.


En la línea 16 instanciamos un objeto FileStream para la creación de un archivo de texto al que llamamos ArchivoTexto.txt. Para empezar la escritura sobre este archivo, instanciamos un objeto StreamWriter sobre la línea 21. Escribimos tres datos:
  • 987.65M
  • "OrtizOL - xCSw", y 
  • '!'
Debido a que el código de escritura sobre el archivo se halla dentro de un bloque using la liberación de recursos ocurre automáticamente.

Más adelante, sobre la línea 34 referenciamos el archivo ArchivoTexto.txt para su apertura(FileMode.Open). Seguidamente, líneas 36-41, leemos el contenido del archivo con un objeto StreamReader, precisamente con el método ReadLine.

Compilación:

  1. csc /target:exe LecturaEscrituraArchivo.cs

Ejecución assembly:

  1. .\LecturaEscrituraArchivo.cs

> Prueba de ejecución (local):
Ejecución assembly LecturaEscrituraArchivo.exe
Figura 1. Ejecución assembly LecturaEscrituraArchivo.exe.

5. Conclusiones

Aprendimos los básicos de las clases FileStream, StreamWriter, y StreamReader para la escritura y lectura de archivos de texto plano. Comprendimos que existen versiones sobrecardas del método StreamWriter.Write para escribir diferentes tipos de datos sobre un archivo. También estudiamos, en breve, los distintas opciones de codificación que se ofrecen para la escritura de flujos basados en caracteres. Al final escribimos un ejemplo de código fuente C# para crear un archivo, escribir sobre él, y leer su contenido.


Para la siguiente receta, consultaremos cómo podemos leer y escribir sobre un archivo binario.

7. Glosario

  • .NET
  • Aplicación consola
  • Archivo
  • Archivo de texto
  • Búfer
  • Dato
  • Flujo
  • Sistema de archivos

8. Literatura & Enlaces

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: FileStream Class (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.filestream(v=vs.110).aspx
[3]: IDisposable Interface (System) -
https://msdn.microsoft.com/en-us/library/system.idisposable(v=vs.110).aspx
[4]: StreamWriter.Write Method (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.streamwriter.write(v=vs.110).aspx
[5]: StreamReader Class (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.streamreader(v=vs.110).aspx
[6]: StreamReader.Read Method (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.streamreader.read(v=vs.110).aspx
[7]: StreamReader.ReadLine Method (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.streamreader.readline(v=vs.110).aspx


M

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.