You are on page 1of 5

Archivos binarios y de texto en c#

El manejo de archivos en la plataforma .NET se logra mediante la clase Stream que representa un flujo de informacin (Un archivo es considerado un flujo de datos, al igual que los datos transferidos de un dispositivo a otro, o los datos transferidos por la red mediante TCP/IP). La clase Stream, es una clase abstracta, por lo que no es posible utilizarla directamente ya que no se puede crear instancias. Lo que se debe hacer es utilizar una de sus clases derivadas que se especializan en el tratamiento de streams para diferentes destinos como por ejemplo FileStream (para el manejo de archivos), Memorystream (para el manejo de datos en memoria), etc. La primera opcin para escribir y/o leer datos de un archivo de texto es utilizar la clase FileStream. Esta clase se encuentra en el namespace System.IO y es una clase derivada de la clase Stream. El FileStream acta como un intermediario entre el sistema de archivos y nuestra aplicacin, permitiendo realizar de una manera limpia y sencilla operaciones de escritura y lectura en archivos. Para utilizar el FileStream, lo primero que se debe hacer es crear una instancia que apunte al archivo deseado. Para esto se tiene la opcin de utilizar alguno de los constructores ofrecidos, tal y como se muestra a continuacin:

Como se ve en la figura anterior, es un constructor bastante tedioso de utilizar porque recibe una cantidad considerable de parmetros. Para contrarestar esto, tenemos la posibilidad de utilizar alguno de los mtodos ofrecidos por la clase utilitaria File, que nos permite obtener un FileStream con parmetros especficos de acuerdo al mtodo utilizado para obtenerlo. A continuacin se muestra un ejemplo: En el ejemplo anterior se utiliz el mtodo Create el cual crea el archivo en la ruta especificada y en caso de que el archivo exista, es sobrescrito. Estos mtodos ofrecidos por la clase File, facilitan el desarrollo de aplicaciones con manejo de archivos y permite una mejor lectura de cdigo. Para escribir datos en un archivo de texto, se utilizan los mtodos Write y WriteByte. El primero recibe como parmetro un vector de bytes que representa la informacin a almacenar, mientras el segundo recibe como parmetro un solo byte para ser escrito. Elegir cual de los dos mtodos utilizar depende del escenario, ya que cuando se va a escribir gran cantidad de informacin, no es recomendable escribir byte a byte porque se ejecutara muchas veces el mismo ciclo sino que por el contrario, es conveniente escribir varios bytes a la vez. A continuacin se muestra un ejemplo de la operacin de escritura con ambos mtodos:

Se puede observar como se utiliza la clase Encoding para formatear la cadena en UTF8 y obtener el array de bytes que se debe escribir en el archivo. De la misma manera se puede codificar el texto a escribir en otro formato como por ejemplo ASCII, Unicode, etc. Es importante mencionar que todo stream se debe cerrar al finalizar la operacin que se realiza sobre el, ya que de lo contrario el archivo quedara bloqueado y no se liberaran recursos del sistema operativo. Adicionalmente, el mtodo Flush, se utiliza para indicarle a la clase FileStream, que escriba en el archivo fsico lo que se ha escrito con el mtodo WriteByte o con el mtodo Write hasta el momento ya que de lo contrario, dichos cambios se veran reflejados nicamente cuando se cierre el Stream. Este mtodo seria til cuando queremos que se escriba el texto en el archivo y no deseamos cerrar el Stream porque necesitamos seguir haciendo operaciones de escritura, adems de ser una buena prctica siempre utilizarlo aun cuando parezca ser innecesario. La implementacin de la misma funcionalidad con el otro mtodo, seria como se muestra a continuacin.

Como se ve en el ejemplo anterior, con estos mtodos, el programador tiene un control muy preciso sobre la informacin que desea escribir en el archivo, tanto, que hasta puede llegar a ser engorroso en algunas ocasiones. Afortunadamente, la plataforma .NET ofrece otras maneras de administrar Streams para hacerle la vida ms fcil al desarrollador. Una de esas maneras es utilizar la clase StreamWriter para escribir en archivos y StreamReader para leer

desde archivos. Es necesario tener en cuenta que estas clases estn orientadas a obtener caracteres como salida a diferencia de las clases que heredan de Stream que estn orientadas a obtener bytes. Con la clase StreamWriter, solo nos debemos preocupar por utilizar el mtodo Write o WriteLine para escribir datos en un archivo de texto. Estos mtodos reciben tipos de datos nativos del lenguaje como por ejemplo int, bool, decimal, float, string, char, etc. Y utiliza el codificador indicado cuando se instancia la clase para codificar los caracteres de salida al archivo de texto. En caso de utilizar un constructor que no especifique algn Encoding, por defecto esta clase opera con el UTF8.

Como se ve en el ejemplo anterior, las lneas de cdigo son mucho mas sencillas que las vistas en el ejemplo del FileStream. Esto es porque la clase StreamWriter es una clase especializadas para el trabajo de Stream hacia archivos de texto y nos evita el trabajo de tener que obtener la representacin en bytes del valor que queramos escribir. La diferencia entre el mtodo Write y WriteLine, es que el segundo inserta un salto de lnea al final de los datos ingresados, haciendo que la prxima vez que se quiera insertar, se har en la siguiente lnea. Aunque la clase StreamWriter no hereda de la clase Stream, si utiliza en su implementacin un Stream en el cual escribe o lee secuencias de caracteres. Por eso, esta clase en su interior, se encarga de crear y utilizar el Stream necesario para apuntar al archivo de texto representado por la ruta que se utilizo en el constructor del ejemplo. Sin embargo, esta clase tambin tiene otro constructor donde se le puede pasar un Stream que tengamos creado en lugar de la ruta, como se ve a continuacin:

El complemento del objeto StreamWriter es el objeto StreamReader, cuyo principal objetivo es facilitarnos las tareas de lectura de cadenas de caracteres. Con este objeto, nos podemos despreocupar de esas tareas de bajo nivel para poder obtener un cdigo mucho mas limpio y fcilmente legible.

En el ejemplo se ve como fcilmente se puede leer informacin de un archivo de texto utilizando el mtodo ReadLine del objeto StreamReader. Este mtodo, simplemente lee la lnea siguiente teniendo en cuenta la posicin actual del puntero del archivo. Es importante aclarar que utilizando los streams vistos hasta el momento se pueden leer y escribir en archivos de texto cadenas de caracteres, es decir, texto plano. Esto implica que la informacin escrita en los archivos podr ser vista y

entendida por cualquier persona, ya que se guarda tal y como se encuentra en un principio. Lo anterior puede llegar a ser un problema en los casos en que se elige utilizar archivos de texto como repositorio de datos de una aplicacin (aunque esto es poco recomendable, habrn casos en los pueda llegar a ser necesario), y digo que es un problema porque podra haber informacin que no queremos que cualquier persona la pueda ver y mucho menos entender, sino que quisiramos que dicha informacin estuviera almacenada de forma segura. Una posible opcin para esto es almacenando la informacin en formato binario, es decir, que la informacin estar almacenada no en formato de texto plano sino en su representacin binaria (1s y 0s), lo cual permite tener mas privacidad (OJO, solo mas privacidad, no mucha privacidad ni seguridad. Si el punto fuera como obtener una forma segura de almacenar informacin tendramos que mirar los temas de cifrado y hashing). En .NET, el objeto que nos facilita trabajar con Stream de datos binarios es el BinaryWriter y el BinaryReader, los cuales supongo pueden deducir como se utilizan segn lo visto anteriormente. El primero permite escribir datos en un archivo de texto en formato binario mediante el mtodo Write(), el cual.tiene varias sobrecargas entre los cuales acepta varios tipos de dato como por ejemplo int, long, bool, double, decimal, char, string. El segundo permite recuperar informacin almacenada en formato binario por medio del mtodo indicado. Como as que por medio del mtodo indicado?. Lo que sucede con el BinaryReader es que no tiene un mtodo Read genrico, sino que tiene un Read para cada tipo de dato que puede ser escrito, por ejemplo ReadInt32, ReadBoolean, ReadChar, etc. Esto nos obliga a conocer la estructura del archivo con el que estamos trabajando para poder leer el tipo de dato correcto en la posicin correcta. A continuacin se muestra un pequeo ejemplo sobre como utilizar el BinaryReader y el BinaryWriter.

En el ejemplo anterior se observa como se puede escribir varios tipos de dato con el mismo mtodo Write del objeto BinaryWriter ya que tiene varias sobrecargas. A continuacin se muestra como se vera la informacin en el caso de intentar visualizarla con un editor de texto:

Para leer informacin binaria se utiliza el objeto BinaryReader y se utiliza El mtodo indicado.

En el ejemplo anterior se observa como se utiliza el mtodo de lectura segn el tipo de dato que desee leer, lo cual implica que con anterioridad se conozca la estructura del archivo. En este caso, ntese que se ley exactamente en el mismo orden en el que se escribi la informacin con el BinaryWriter. El siguiente es el resultado de la ejecucin del cdigo anterior:

You might also like