Funcionalidad Synchronous y Asynchronous, y ...

Siempre se ha escuchado hablar de escritura y lectura, tanto síncrona como asíncrona, de archivos, pero que es lo que se esconde realmente tras estos conceptos tan técnicos?, es la pregunta que, posiblemente a muchos les ronda por la cabeza. Bien, este post trata de resolver estas preguntas y más.

La escritura y lectura de archivos de manera sincronizada se manifiesta cuando, mientras se escribe o lee, la aplicación principal bloquea las entradas al archivo hasta que terminen estas operaciones y luego libera el recurso. En contraste, la funcionalidad asincrona está dada cuando la aplicación puede leer por un momento el archivo, detiene la lectura, y luego escribe en ella (sin liberar el archivo), es decir, inicia el proceso de lectura (BeginRead), luego para de leer (EndRead), y ahora para escribir hace un BeginWrite, luego de escribir ciertos datos cierra este proceso con EndWrite, y así continua este salto de lectura y escritura del archivo (por un rato escribe, por otro rato lee) ... espero haber sido claro.... juas juas!!! ...Todo esta funcionalidad puede conseguirse si se usa aquellas clases derivadas de la clase abstracta Stream, entre ellas tenemos a BufferedStream, FileStream yMemoryStream.

Las escrituras y lecturas, tanto síncronas y asíncronas de datos textuales o binarios que nos brinda el .NET mediante el System.IO,  pueden confundirmos en cuanto a la forma de trabajar, es decir, ¿qué elementos se necesitan para lograr esto?, muy bien, lo primero  a saber es cómo esá organizado estas funcionalidad I/O, la siguiente imagen ilustra esto:

Muy bien, si te das cuenta, verás que está organizado en clases con funcionalidad de escritura y lectura de datos binarios, bytes, y caracteres. Pero esto no termina aquí, en verdad, no es tanto al tipo de archivo que pueda escribirse o leerse, más todo esto se debe a manera de trabajo. Por ejemplo, los del grupo de binary stream son ideales cuando se quiere ahorra espacio disco, mientras que los byte stream cuando se busca disminuir el número de acceso al disco (trabajando con el archivo en el buffer, por ejemplo.).

Algo que se debe entender es la manera en que se crean los objetos a usar, para esto debes contar con un objeto lector de datos (si lo que quieres es leer, como un BinaryReader, StringReader o StreamReader) o un objeto escritor de datos (si lo que quieres es escribir datos como BinaryWriter, StringWriter, StreamWriter), pero no basta esto, también necesitas de un canal  o entrada que sirva para direccionar o nos permitar accesar al archivo (en realidad este objeto representa el fichero), este objeto que se comportará como canal viene a ser un Stream (como el FileStream). Estos dos objetos hacen posible las operacionas I/O. Veamos un ejemplo de como leer un simple archivo en C#.

...y si lo que deseas es escribir y leer archivos binario ps pueder usar un objeto de la clase BinaryWriter y BinaryReader respectivamente. Algo importante es por ejemplo que, BinaryWriter y BinaryReader son mucho más eficientes hablando en términos de aprovechamiento de espacio de disco, pero como todo tiene ventajas y desventajas, la desventaja de esto es que depende del formato del dato, es decir, si un dato se grabó en un determinado formato, entonces tambien debe leerle en este formato, como se ilustra en el ejemplo siguiente. Podemos leer y escribir datos de tipo byte, char, sbyte, ushort, entre otros, como UInt32, UInt16... He aquí un ejemplo.

Otra de las desventajas de usar el modelo de I/O anterior es que el Stream estará enlazado directamente al archivo. Una solución a esto es usar BufferedStream, reduciendo de esta manera el número de accesos al disco. Un ejemplo de esto:

He aquí un ejemplo más práctico del uso de BinaryReader y BinaryWriter. Esta aplicación lo que hace es encriptar y desencriptar un archivo pasándole previamente la clave, y puedes hacer el proceso inverso, es decir, desencriptarlo, ejecutando de nuevo la aplicación.

Ahora si lo que desea es leer un archivo de texto (uso de character I/O streams), o algo más complejo como un archivo XML, puede te invito a leer este artículo que escribí hace un buen tiempo:  http://www.elguille.info/colabora/NET2005/Percynet_Funcionalidad_XmlTextReader.htm

Espero haber dejado un poco más claro este tema, cualquier comentario, será bienvenido. Ahora si me guardo, y si me olvidé de mencionar algo, pues me cuentas de nuevo... juas juas !!!.

Percy Reyes.

Published 6/2/2007 18:53 por Percy Reyes
Comparte este post:
http://geeks.ms/blogs/ozonicco/archive/2007/02/06/funcionalidad-synchronous-y-asynchronous-y.aspx