Objetivos El alumno aplicará el concepto de programación
Transcripción
Objetivos El alumno aplicará el concepto de programación
PRÁCTICA PROGRAMACIÓN ORIENTADA A OBJETOS (ARCHIVOS E HILOS) Objetivos El alumno aplicará el concepto de programación orientada a objetos para la realización de programas que involucren el manejo de archivos y creación de hilos. Al final de esta práctica el alumno podrá: Implementar programas orientados a objetos, que manipulen archivos; así como, la creación de hilos dentro de una aplicación. Antecedentes 1. Manejar sentencias de control de flujo en lenguaje de Java. 2. Identificar y relacionar varias clases en la programación orientada a objetos empleando la teoría de diseño de jerarquía de clases 3. Haber utilizado archivos en el almacenamiento de datos 4. Manejar los conceptos de proceso y multitareas Introducción En Java, para lograr la comunicación entre el programa y la información, ya sea de entrada o salida, se hace mediante un flujo, que funge como el intermediario entre el programa y los datos. En la práctica de programación orientada a objetos con manejo de excepciones, se observó que para hacer la lectura de datos desde el teclado, se tiene que generar un flujo de entrada, es decir, una operación InputStreamReader; y el parámetro que recibe es el origen de los datos, en ese caso System.in, pero para realizar la lectura de información contenida en archivos o ficheros, se necesita generar un objeto de tipo File, igual que como se crea un apuntador FILE en C. File f = new File(nombreArchivo); Una vez creado el apuntador, se necesita generar el flujo de datos desde un archivo, es decir, crear un objeto de tipo FileInputStream, que recibe como parámetro el objeto de tipo File. FileInputStream fis = new FileInputStream(f); Con esto, ya se puede crear el InputStreamReader, que permitirá leer los datos que se tengan en un archivo; y el BufferedReader que hará la lectura de los mismos. InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr); Ya con estas cuatro líneas se puede hacer la lectura de un archivo. Elaborada por: Ing. Laura Sandoval Montaño Viridiana del Carmen De Luna Bonilla Virgilio Green Pérez Programación Avanzada y Métodos Numéricos PRÁCTICA PROGRAMACIÓN ORIENTADA A OBJETOS (ARCHIVOS E HILOS) Ejemplo 1 Elaborar un programa que lea la información contenida en un archivo de texto plano. import java.io.*; public class LeeArchivo{ File f; FileInputStream fis; InputStreamReader isr; BufferedReader br; String linea; public static void main(String args[]){ try{ LeeArchivo la = new LeeArchivo(); //Se crea un objeto de tipo File la.f = new File(args[0]); //Se genera el flujo de entrada desde archivo la.fis = new FileInputStream(la.f); //Se crea el flujo de lectura la.isr = new InputStreamReader(la.fis); //Se crea el objeto que permitirá la lectura la.br = new BufferedReader(la.isr); //Se hará la lectura hasta que encuentre una línea nula while((la.linea=la.br.readLine())!=null){ System.out.println(la.linea); } //Se cierran todos los flujos la.br.close(); la.isr.close(); la.fis.close(); } catch(IOException ioe){ System.out.println(ioe.getMessage()); } } } Debido a que todos los flujos de entrada y salida generan una excepción de entrada/salida, es necesario agregar una secuencia de try-catch. Escritura en archivos Ahora, para hacer la escritura en archivos se debe generar, de igual forma que para la lectura, flujos de entrada o salida. En este caso, en lugar de utilizar FileInputStream, debemos generar un flujo de salida, es decir FileOutputStream. FileOutputStream fos = FileOutputStream(f); Elaborada por: Ing. Laura Sandoval Montaño Viridiana del Carmen De Luna Bonilla Virgilio Green Pérez Programación Avanzada y Métodos Numéricos PRÁCTICA PROGRAMACIÓN ORIENTADA A OBJETOS (ARCHIVOS E HILOS) Debido a que ahora la impresión es en un archivo, se deberá utilizar el comando: PrintStream ps = PrintStream(fos); Ejemplo 2 Elaborar un programa que escriba en archivo una línea que se escriba desde línea de comando. import java.io.*; public class EscribeArchivo{ String cadena; File f; FileOutputStream fos; PrintStream ps; public static void main(String args[]){ try{ EscribeArchivo ea = new EscribeArchivo(); //Se obtiene la cadena que se escribirá en el archivo ea.cadena = args[0]; //Se crea un objeto de tipo File ea.f = new File(args[1]); //Se genera el flujo de salida hacia el archivo ea.fos = new FileOutputStream(ea.f); //Se genera el escritor del flujo ea.ps = new PrintStream(ea.fos); //Se escribe la línea dentro del archivo ea.ps.println(ea.cadena); //Se cierran flujos ea.ps.close(); ea.fos.close(); } catch(IOException ioe){ } catch(ArrayIndexOutOfBoundsException aioobe){ System.out.println("ERROR!!!"); System.out.println("Sintaxis: java EscribeArchivo \"cadena\" archivo"); } } } Hilos Cuando se genera un proceso, se crea un hilo primario, que está asociado a un bloque de instrucciones, un conjunto de registros y una pila. Este hilo, puede crear más hilos si es necesario; a estos hilos se les denomina “procesos ligeros” ya que comparten ciertos recursos con el proceso primario que los creó. Elaborada por: Ing. Laura Sandoval Montaño Viridiana del Carmen De Luna Bonilla Virgilio Green Pérez Programación Avanzada y Métodos Numéricos PRÁCTICA PROGRAMACIÓN ORIENTADA A OBJETOS (ARCHIVOS E HILOS) Pero, ¿para qué se necesitan varios hilos? Cuando se hace una aplicación robusta en el que tenga que hacer varias acciones al mismo tiempo, en lugar de crear un proceso completo, es más conveniente crear un hilo que pueda llevar a cabo las acciones correspondientes de una forma rápida y eficaz. Por ejemplo, si se tiene un sistema que está en red, para que múltiples usuarios tengan acceso, si se generara un proceso por cada usuario, saldría bastante caro, hablando de recursos máquina, pero si se genera un hilo, para que haga una consulta, o una actualización de un dato, las acciones se realizan rápidamente. Hay varios estados por los que pasa un hilo, y son: • • • • Preparado.- Cuando se genera un hilo nuevo y está listo para ejecutarse, o cuando ha sido desbloqueado. En ejecución.- Cuando está haciendo uso de los recurso de la CPU. Bloqueado.- Cuando está en espera de que se elimine el bloqueo. o Dormido.- Cuando se bloquea por un cierto tiempo, después del cual despierta, y pasa a preparado. o En espera.- Cuando está esperando a que ocurra algo, recibe un mensaje y pasa a preparado. Muerto.- Cuando ha terminado de ejecutarse. En Java, cuando se trabaja con hilos, se debe indicar que la clase con la que se está trabajando es una subclase de la clase Thread, es decir, que se heredarán todas las propiedades que contiene la clase Thread. Ejemplo 3 Elabore un programa que genere 6 hilos. public class GeneraHilo extends Thread{ //Rutina que se ejecuta cuando se le da start() a un hilo public void run(){ System.out.println("Esta es una instancia de nuestra clase: " +this.getName()); } public static void main(String args[]){ //Se generan 6 hilos GeneraHilo gh1 = new GeneraHilo(); GeneraHilo gh2 = new GeneraHilo(); GeneraHilo gh3 = new GeneraHilo(); GeneraHilo gh4 = new GeneraHilo(); GeneraHilo gh5 = new GeneraHilo(); GeneraHilo gh6 = new GeneraHilo(); //Se les asigna nombre gh1.setName("Hilo1"); gh2.setName("Hilo2"); gh3.setName("Hilo3"); gh4.setName("Hilo4"); gh5.setName("Hilo5"); gh6.setName("Hilo6"); Elaborada por: Ing. Laura Sandoval Montaño Viridiana del Carmen De Luna Bonilla Virgilio Green Pérez Programación Avanzada y Métodos Numéricos PRÁCTICA PROGRAMACIÓN ORIENTADA A OBJETOS (ARCHIVOS E HILOS) //Se "ejecutan" los hilos gh1.start(); gh2.start(); gh3.start(); gh4.start(); gh5.start(); gh6.start(); System.out.println("Hilo Principal:" +Thread.currentThread().getName()); } } Elaborada por: Ing. Laura Sandoval Montaño Viridiana del Carmen De Luna Bonilla Virgilio Green Pérez Programación Avanzada y Métodos Numéricos PRÁCTICA PROGRAMACIÓN ORIENTADA A OBJETOS (ARCHIVOS E HILOS) EJERCICIOS PROPUESTOS 1. El programa del Ejemplo 1, tiene una falla cuando no se le pasan parámetros, arréglelo utilizando un catch. Además, cuando se le da el nombre de un archivo no existente aparece la leyenda (El sistema no puede hallar el archivo especificado) Modifique el programa de tal forma que se indique: ERROR!!! Archivo no válido, favor de verificar el nombre del archivo. TIP: Utilice una excepción para la modificación de archivo no válido. 2. Modifique el programa del Ejemplo 2 de tal forma que ahora se escriba en archivo todo lo que se escriba mientras está en ejecución el programa. 3. Modifique el programa anterior, para que también se pueda agregar información al final del archivo que se indique. 4. Elabore un programa que lea información de un archivo, y lo escriba en otro. 5. Cuando se ejecuta varias veces seguidas el programa del Ejemplo 3, ¿qué pasa? Ahora en el método run(), agregue la instrucción sleep((long)Math.random()*2500), antes de la impresión del nombre del hilo que se está ejecutando. Haga las modificaciones necesarias para que compile y ejecute correctamente el programa. Si se ejecuta varias veces seguidas el programa, ¿Ahora, qué sucede? (OSURIHVRUSRGUiGLVHxDUVXVSURSLRVHMHUFLFLRVVLHPSUH\FXDQGRFXEUDSRUFRPSOHWRHOREMHWLYRGH ODSUiFWLFD Elaborada por: Ing. Laura Sandoval Montaño Viridiana del Carmen De Luna Bonilla Virgilio Green Pérez Programación Avanzada y Métodos Numéricos