Sie sind auf Seite 1von 172

Profesional en Plataforma Java

Mdulo 2: Java Programming Language

Contenido Mdulo 2: Java Programming Language


Unidad 1. Unidad 2. Unidad 3. Unidad 4. Unidad 5. Unidad 6. Unidad 7. Unidad 8. Unidad 9. Unidad 10. Unidad 11. Unidad 12. Unidad 13. Unidad 14. Unidad 15. Unidad 16. Introduccin Programacin orientada a objetos Identificadores, palabras y tipos Expresiones y control de flujo Arreglos rreglos Diseo de clases Caractersticas avanzadas de clases Excepciones y Aserciones Colecciones y generalidades de infraestructura Fundamentos de Entrada y salida Consola de entrada y salida y ficheros de entrada y salida Construccin de interfaces de usuario Java mediante APIs Manejando eventos Aplicaciones licaciones basadas en GUI Hilos Redes

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

Unidad 1 : Introduccin
Sun Microsystems es la empresa que ha inventado el lenguaje Java, en un intento de resolver simultneamente todos los problemas que se planteaban a los desarrolladores de software por la proliferacin de arquitecturas incompatibles en los siguientes aspectos: aspect Diferentes mquinas desde el punto de vista del hardware. Diferentes sistemas operativos. Diferentes sistemas de ventanas que funcionan sobre una misma mquina.

Estos problemas se han agravado an ms con la expansin de Internet en la cual deben comunicarse nicarse plataformas heterogneas, y dnde las aplicaciones distribuidas son el corazn del sistema. El xito de Java reside en su arquitectura y las caractersticas que esta arquitectura le confiere.

Arquitectura de Java
Introduccin
En la arquitectura de Java es dnde se encuentra la solucin al problema planteado en la introduccin. El siguiente dibujo intenta resumir dicha arquitectura:

Los programas se compilan a un fichero (*.class) intermedio, en un lenguaje creado por Sun (bytecodes). tecodes). Este fichero luego es interpretado por una mquina virtual java (JVM). Por tanto, java es compilable-interpretable. interpretable.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

La mquina virtual Java (JVM).


La Especificacin de la Mquina Virtual Java la define como: Una mquina imaginaria implementada implementada mediante la emulacin por software en una mquina real. El cdigo para la mquina virtual Java se almacena en archivos .class, cada uno de los cuales contiene, al menos, el cdigo para una clase pblica. La especificacin de la mquina virtual java proporciona proporciona las especificaciones de hardware para las que se compila toda la tecnologa java. Esta especificacin permite al software en java ser independiente de la plataforma ya que la compilacin se hace para una mquina genrica conocida como la mquina virtual tual java (JVM). Esta puede ser emulada por software para poder ser ejecutada en los diferentes sistemas informticos existentes, o bien ser implementada en hardware. A partir del cdigo fuente el compilador genera bytecodes. Estos bytecodes son instrucciones instrucci de cdigo mquina para la JVM. Cada intrprete de java tiene una implementacin de la JVM. La especificacin de la JVM proporciona definiciones muy concretas para la implementacin de: Conjunto de instrucciones (equivalente al de la CPU). Registros del sistema. Formato de los archivos de clase. Pila. Garbage-collected heap. rea de memoria.

El Garbage collection
Gran parte de los lenguajes de programacin permiten la reserva de memoria en tiempo de ejecucin. El proceso de reserva de memoria vara segn segn la sintaxis del lenguaje, pero siempre involucra el retorno de un puntero al inicio del bloque de memoria reservado. Una vez la memoria reservada deja de necesitarse (el puntero que la referencia esta "out of scope"), el programa o el entorno de ejecucin cin debera liberar esa memoria. En C, C++, y otros lenguajes, el programador es responsable de la gestin de la liberacin de memoria. Esta es una tarea complicada a veces porque no siempre se sabe a priori cuando se puede liberar la memoria. Los programas que no liberan la memoria utilizada utilizada pueden generar errores de ejecucin cuando ya no queda memoria disponible en el sistema. Se dice que estos programas tienen fugas de memoria ("memory-links"). ("memory Java libera al programador de la responsabilidad de liberar la menoria. El lenguaje java proporciona pr una hebra de ejecucin, o proceso en paralelo, a nivel de sistema que rastrea las operaciones de reserva de memoria. Durante los ciclos muertos de la JVM, la hebra de "garbage collection" verifica qu memoria puede liberarse y realiza dicha operacin. opera El proceso de "Garbage collection" se realiza automticamente durante el ciclo de vida de un programa java, eliminando la necesidad de liberar memoria y evitando las prdidas de memoria. Sin embargo, la implementacin del gestor de "garbage collection" collection" puede variar sustancialmente en las diferentes es implementaciones de la JVM.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

Seguridad del cdigo


Ya hemos visto que el cdigo fuente de Java se compila en el sentido de que se convierten a un conjunto de bytecodes. En el momento de la ejecucin, los diferentes archivos bytecodes que componen el programa a ejecutar se cargan, se verifican y se ejecutan en el intrprete. La funcin del intrprete es doble: Por un lado ejecuta los bytecodes y por otro gestiona las llamadas llamadas al hardware del sistema. El entorno de ejecucin que ejecuta el cdigo compilado para una JVM realiza tres tareas principales: Carga el cdigo: Lo realiza el cargador de clases. Verificacin del cdigo: Lo realiza el verificador de bytecode. Ejecucin n del cdigo: Lo realiza el intrprete de bytecode.

El cargador de clases.
Su funcin es cargar todas las clases necesarias para la ejecucin de un programa. Adems, mantiene separadas aquellas clases cargadas a partir del sistema de archivos local y aquellas ellas otras cargadas a travs de los recursos de la red. Esto permite limitar la accin de posibles aplicaciones dainas, ya que las clases locales son las primeras en ser cargadas. Una vez que todas las clases han sido cargadas, se determina el mapa de memoria m de la aplicacin. En este momento se asigna direcciones de memoria reales a las referencias simblicas del cdigo y se rellena la tabla de asignacin de memoria. Debido a que el proceso de asignacin de memoria se realiza en el momento de la ejecucin, ejecucin, el intrprete de java aade proteccin contra acceso no autorizado a las reas de cdigo.

Verificador de bytecode.
El cdigo de java se verifica mediante diferentes test antes de ejecutarse en la mquina. La JVM verifica el formato de los diferentes fragmentos de bytecode en busca de cdigo ilegal - cdigo que utilice punteros, que viola los permisos de acceso de los objetos o intenta cambiar los tipos de los objetos. Todas las clases importadas por la red pasan obligatoriamente por el verificador de bytecode. En el proceso de verificacin se resuelve si el cdigo cumple las especificaciones de la JVM y no viola la integridad del sistema. Si la verificacin se completa con xito, se puede asegurar lo siguiente: Las clases cumplen con el formato de archivo archivo de clase de la especificacin JVM. No hay violaciones de acceso restringido. El cdigo no provoca desbordamientos de la pila. Los tipos de parmetros para todo el cdigo es correcto y no se modificar durante la ejecucin. Los accesos a los campos de los objetos estn autorizados. No existen conversiones ilegales gales de datos, por ejemplo, convertir enteros a referencias a objetos.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

Caractersticas de Java
Introduccin.
La arquitectura presentada en el punto anterior proporciona unas caractersticas a Java que ningn otro lenguaje de programacin tiene:

Robusto.
Java realiza verificaciones en busca de problemas tanto en tiempo de compilacin como en tiempo de ejecucin. En tiempo de compilacin no tiene ningn misterio porque todos los lenguajes realizan esas verificaciones, sin embargo, en tiempo de ejecucin, la JVM, que realiza la interpretacin de los bytecodes, detecta cuando existe algn problema en la ejecucin del del programa, y lanza excepciones que pueden ser recogidas por el programador con el propsito de recuperarse de dichos errores.

Arquitectura neutral (multiplataforma).


Gracias a que la compilacin se realiza a un cdigo objeto independiente de la arquitectura arquitect de la mquina (bytecodes), tan slo necesitamos utilizar el intrprete adecuado para que nuestro programa funcione sobre cualquier plataforma. El lema de Sun es "escribir una vez, ejecutar en cualquier parte".

Seguro.
Como toda la ejecucin la realiza la JVM, los programas Java pueden ser sometidos a muchas comprobaciones antes de ejecutarse en la mquina. En concreto: El cdigo se pasa a travs de un verificador de ByteCodes que comprueba el formato de los fragmentos de cdigo y detecta fragmentos de cdigo ilegal (cdigo que falsea punteros, viola derechos de acceso sobre objetos, ...). El cargador de clases separa el espacio de nombres del sistema de ficheros local del de los recursos procedentes de la red. Esto limita cualquier aplicacin del tipo Caballo Caballo de Troya, ya que las clases se buscan primero entre las locales y luego entre las procedentes del exterior. Respecto a la seguridad del cdigo fuente, el propio JDK proporciona un desensamblador de ByteCodes, que hace que cualquier programa pueda ser ser convertido a cdigo fuente a partir de sus bytecodes. Utilizando javap no se obtiene el cdigo fuente original, aunque si desmonta el programa mostrando su estructura. Este problema de seguridad del cdigo fuente es algo todava pendiente de subsanar.

Portable.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

Los enteros son de 32 bits en complemento a 2.

Ms all de la portabilidad bsica por ser de arquitectura independiente, Java implementa otros estndares de portabilidad para facilitar el desarrollo.

Java construye sus interfaces de usuario a tr travs avs de un sistema abstracto de ventanas de forma que stas puedan ser implantadas das en entornos UNIX, Mac o Pc.

Desarrollo con Java


Para poder desarrollar software con Java necesitamos una serie de herramientas que nos proporciona Sun a travs de su JDK (Java Development Kit). Al igual que el lenguaje natural que utilizamos para comunicarnos, ya sea de forma oral o por escrito, cualquier ier lenguaje de programacin dispone de unos elementos y reglas que deben conocerse a la hora de programar. Los elementos del lenguaje natural nos permiten designar cosas (nombres), expresar cualidades de esas cosas (adjetivos), expresar acciones (verbos), (verbos etc. Las reglas sintcticas (estructura) y semnticas (significado) permiten el entendimiento entre las partes que forman la comunicacin. En los lenguajes de programacin tambin encontramos unas reglas sintcticas que debemos respetar a la hora de confeccionar nfeccionar los programas y una semntica encargada de resolver el problema que queremos programar.

Elementos y reglas sintcticas de los lenguajes de programacin.


Aunque todos los conceptos que aprenderemos a continuacin aparecen en todos los lenguajes de programacin existen diferencias en la implementacin en cada uno de ellos lo que obliga a un estudio individual en cada uno de ellos.

Comentarios en los programas.


Un aspecto importante a la hora de confeccionar un programa es comentar lo ms detalladamente detall posible lo que significa cada una de las rdenes que forman parte del programa, con el propsito de poder recordar en un futuro la funcin que realiza cada una de ellas, y facilitar su estudio a personas ajenas al programa.

Identificadores.
En todo odo lenguaje de programacin surge la necesidad de utilizar una serie de elementos que debemos designar con algn nombre, por ejemplo:

Elemento Variables Funciones

Descripcin
- Elementos utilizados para referenciar posiciones de memoria dnde podremos almacenar datos necesarios para el programa.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

- Elementos utilizados para referenciar posiciones de memoria dnde reside el cdigo del programa.

Objetos

- Elementos que encapsulan variables (propiedades) y funciones (mtodos) de manera que resulta ms sencillo modelar los problemas que queremos resolver simplificando el diseo de programas complejos. - Conforme avancemos iremos conociendo ms elementos de los lenguajes de programacin.

etc.

A la hora de asignar nombre a todos estos elementos hay que seguir unas reglas.

Tipos de datos bsicos.


El modelo mental ms sencillo que se puede tener de una aplicacin informtica es el de una caja negra que recibe unos datos de entrada, los procesa y entrega unos datos de salida representados de alguna manera. Estos datos de entrada, los cules deben ser ser albergados en memoria y referenciados mediante alguna variable, pueden ser de diferente naturaleza (numricos, alfanumricos, etc.). Cada lenguaje de programacin dispone de unos tipos de datos bsicos a los cules nos tenemos que amoldar a la hora de realizar el anlisis de los datos que necesitamos en nuestra aplicacin.

Variables.
Este elemento juega un papel muy importante en el programa porque es el mecanismo que pone a nuestra disposicin el lenguaje de programacin para gestionar de una manera mane sencilla los datos de la aplicacin. Al declarar una variable en el programa estamos reservando una zona de memoria para posteriormente albergar un dato. Existen lenguajes que necesitan que especifiquemos el tipo de dato que se va a albergar (java) y otros que no lo necesitan (javascript). Al asignar un valor a la variable lo que estamos haciendo es almacenar el dato en la posicin de memoria que se reserv para dicha variable. En todo momento tenemos que tener presente que al usar la variable realmente realme estamos usando el dato al que representa.

Operadores.
Una de las primeras aplicaciones de los ordenadores fue el clculo de matemtico y, aunque ahora ha pasado a un segundo plano, los lenguajes de programacin ofrecen una serie de elementos que permiten miten realizar operaciones con los datos. Estas operaciones no slo se limitan a operaciones aritmticas. Disponemos tambin de operaciones lgicas, comparaciones, etc.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

Sin embargo, la caracterstica que confiere al ordenador su potencia es la capacidad de procesamiento de la que dispone.

Sentencias de control.

Aunque esto nos pueda asustar, el tipo de procesamiento que puede realizar es muy bsico, limitndose a: Tomar decisiones sobre la ejecucin o no de determinadas tareas en base al cumplimiento o no de una o varias condiciones (sentencias de decisin). En dichas condiciones siempre estarn implicados datos (o si se quiere, sus representantes las variables). Alterar el flujo de ejecucin n normal del cdigo del programa (sentencias de salto o bucles). Tambin estas alteraciones estarn controladas por variables. La combinacin adecuada de este tipo de sentencias es la que definir la estructura que resuelve un determinado problema.

Almacenamiento enamiento de datos mediante Arrays.


Hemos visto el uso de variables como mecanismo bsico para almacenar y acceder a datos en memoria. Sin embargo, en la mayora de aplicaciones este tipo de almacenamiento de informacin se queda corto por ser demasiado simple simple y necesitamos a sistemas de almacenamiento ms complejos pero tambin ms potentes. Uno de estos sistemas, que aparece en todos los lenguajes de programacin, es el de los Arrays.

Excepciones.
Todos los lenguajes de programacin avisan de los errores errores que cometamos en tiempo de compilacin, pero pocos son los que han sido diseados para seguir avisando de posibles errores en tiempo de ejecucin. Las aplicaciones Java, gracias a que se ejecutan bajo la supervisin de la mquina virtual (JVM), estn siendo controladas constantemente. En caso de que ocurra algn error de ejecucin, se lanza una excepcin que puede ser recogida y tratada por el programador en su aplicacin. De esta manera, lo que antes sola terminar en una ejecucin anormal del programa, program con java puede ser resuelto.

Objetos.
Java es un lenguaje de programacin orientado a objetos. La importancia de este tema es tal que le dedicamos el siguiente captulo entero.

Unidad 2: Programacin Orientada a Objetos


Introduccin.
El programador debe conocer cul es su situacin respecto a la mquina que va a programar y qu personajes, junto con l, son importantes a la hora de desarrollar una aplicacin. Cada uno de estos personajes tiene un punto de vista diferente que describimos describimos a continuacin: Desarrollador del lenguaje de programacin. Su conocimiento de la mquina es profundo debido a que debe desarrollar la aplicacin que ayudar al programador a realizar su trabajo. En un principio se desarrollaban los lenguajes de programacin programacin utilizando el lenguaje de ensamble del microprocesador. Esto dio lugar a lenguajes como C, Pascal, etc.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

10

Posteriormente, estos lenguajes se han podido utilizar para el desarrollo de tecnologas de programacin ms potentes como C++, y ste a su vez es es el que se ha utilizado en el desarrollo de Java. El lenguaje de programacin proporciona las herramientas necesarias (API, entorno de desarrollo, etc.) al siguiente personaje: el programador de aplicaciones. Programador de aplicaciones. Su conocimiento suele suele centrarse en el lenguaje de programacin que utiliza para el desarrollo de sus aplicaciones. No necesita conocer la mquina tan en profundidad como el desarrollador de lenguajes de programacin, sin embargo, ese conocimiento extra ayuda a comprender lo o que se est realizando y, por tanto, facilita el desarrollo de aplicaciones. Su funcin principal es utilizar todas las herramientas que le ofrece un lenguaje de programacin para desarrollar aplicaciones fciles de usar (usabilidad) destinadas al siguiente siguiente personaje: el usuario. Usuario. Su conocimiento del ordenador suele ser escaso, por no decir nulo, y su funcin es la de utilizar las aplicaciones que ha desarrollado el programador. Un ejemplo puede aclarar todo lo expuesto anteriormente. Veamos cmo realiza el acceso a la hora cada uno de estos personajes. Desarrollador del lenguaje de programacin. Este personaje conoce la manera que se ha diseado en la mquina para contabilizar el tiempo. El reloj de tiempo real (RTC) incorpora un contador dnde se e almacenan los milisegundos que han transcurrido desde el 1-1-1970 1 1970 a las 00:00:00 hasta este momento. Conocido el origen de coordenadas y los milisegundos que han transcurrido, se puede obtener mediante la aplicacin de un algoritmo matemtico el da, mes mes y ao en el que nos encontramos, y la hora con una precisin de milisegundos. Por tanto, el desarrollador de un lenguaje de programacin, para acceder hasta la hora del sistema, tendra que acceder al dato almacenado en el RTC mediante la lectura del puerto puerto dnde est situado e implementar el algoritmo de conversin, lo que requiere un conocimiento del funcionamiento de la mquina determinado. Programador. Aprovechando que el desarrollador del lenguaje de programacin ha implementado el cdigo de ms bajo nivel para acceder a la hora del sistema, puede ofrecer este cdigo al programador para simplificarle la forma de acceso. Una parte fundamental de un lenguaje de programacin es el API que ofrece al programador. En l se encuentra todo el cdigo que ha desarrollado sarrollado el desarrollador del lenguaje de programacin y que puede utilizar el programador en sus aplicaciones. La evolucin de las tecnologas de programacin ha dado lugar a dos tipos de lenguaje de programacin (y por tanto a dos tipos de API). API orientado a funciones. API orientado a objetos. Por ejemplo, el objeto Date es que se debe utilizar para acceder a la hora del sistema. Usuario. Simplemente visualizar la hora del sistema tal y como el programador haya realizado la representacin en la aplicacin. En este tema aprenderemos los conceptos de la programacin orientada a objetos. El desarrollador de lenguajes de programacin debe pensar en facilitar al programador su trabajo, el desarrollo de aplicaciones informticas, ofrecindole unas herramientas herr que le ofrezcan:

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

11

Clases
Las diferentes tecnologas de programacin se diferencian en la manera que ofrecen de estructurar los datos y el cdigo que forman una aplicacin. A la hora de plantear el anlisis del problema que se quiere resolver por software, todas las tecnologas han optado por dividir dicho problema en parte ms pequeas. La estrategia a seguir es conseguir una estructura en la que cada una de esas partes realice realice una tarea nica e indivisible, coordinadas por una parte principal que obtiene la informacin de lo que hay que hacer de su interaccin con el usuario. En la actualidad esta interaccin se realiza a travs de un entorno grfico y las rdenes se generan n mediante eventos. En los lenguajes procedimentales, orientados a funciones, la estructura se realiza tomando como referencia el cdigo. Cada una de esas partes se denomina subrutina, procedimiento o funcin dependiendo del lenguaje en el que nos encontremos. encon En los lenguaje orientados a objetos, la estructura se realiza tomando como referencia los datos. Cada una de esas partes se denomina objeto. En Java una clase se suele representar con la siguiente estructura: public class NombreClase{ // Definicin de propiedades --> > Caractersticas del elemento que describimos con la clase. // Definicin de los mtodos --> > Comportamiento y funcionalidades del elemento. } Analizaremos algunos conceptos bsicos para poder comprender el concepto de propiedad (variables), mtodos (funciones) y lgicas de funcionamiento. En este primer ejemplo podemos observar que creamos una clase coche. Las propiedades de la clase representan caractersticas del coche: estado, velocidad actual, velocidad mxima, Los mtodos os representan acciones que podemos realizar sobre el coche: montar, bajar, salir,... La lgica de funcionamiento se implementa en el cdigo de cada mtodo import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class Coche{ static boolean estado=false; static int velocidad=0; static int VMAXIMA=120; public static void menu(){ System.out.println("1.- Montar en el coche"); System.out.println("2.- Comenzar");

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

12

System.out.println("3.- Parar"); System.out.println("4.- Salir del coche"); System.out.println(""); System.out.println("Introduzca una opcin"); } public static void montar(){ if (estado==false){ System.out.println("Ya ests encima del coche."); estado=true; } else{ System.out.println("Ya estabas arriba, no intentes subir otra vez."); } menu(); } public static void comenzar (){ if(estado==false){ System.out.println("Primero sube al coche"); } else if (velocidad== VMAXIMA){ System.out.println("Ya no puedes acelerar ms"); } else{ ++velocidad; System.out.println("Velocidad actual= "+velocidad); } menu(); } public static void parar(){ if (velocidad==0){ System.out.println("Si ests parado porque frenas"); } else{ System.out.println("El frenado nado se realiza de golpe"); velocidad=0; } menu(); } public static void salirCoche(){ if(estado==false){ System.out.println ("No te has subido y ya te bajas"); } else if(velocidad!=0){ System.out.println("Primero frena y luego baja"); } else { System.out.println("Acabas de bajar del coche.");

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

13

} menu(); } public static void main(String args[])throws IOException{

BufferedReader i=new BufferedReader(new InputStreamReader(System.in)); String opcion; menu(); do{ opcion=i.readLine(); try{ switch(Integer.parseInt(opcion)){ case 1: montar(); break; case 2: comenzar(); break; case 3:parar(); break; case 4: salirCoche (); System.exit(0);

default:System.out.println("No existe la opcin");

} } catch( NumberFormatException e){ System.out.println("La opcin debe ser un nmero"); } }while (true); } }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

14

Tipos de clases.
abstract
Una clase abstract tiene al menos un mtodo abstracto. Una clase abstracta no se instancia, sino que se utiliza como clase base para la herencia.

final
Una clase final se declara como la clase que termina una cadena de herencia. No se puede heredar de una clase final. nal. Por ejemplo, la clase Math es una clase final.

public
Las clases public son accesibles desde otras clases, bien sea directamente o por herencia. Son accesibles dentro del mismo paquete en el que se han declarado. Para acceder desde otros paquetes, primero rimero tienen que ser importadas.

synchronizable
Este modificador especifica que todos los mtodos definidos en la clase son sincronizados, es decir, que no se puede acceder al mismo tiempo a ellos desde distintos threads; el sistema se encarga de colocar r los flags necesarios para evitarlo. Este mecanismo hace que desde threads diferentes se puedan modificar las mismas variables sin que haya problemas de que se sobreescriban.

Variables de instancia.
La declaracin de una variable dentro de la definicin de una clase por defecto es una variable de instancia. Con esto queremos decir que todo objeto que instanciemos de esa clase contiene su propia copia de dicha variable. Se pueden acceder a las variables es de instancia de un objeto de la siguiente manera: Nombreobjeto.nombrevariabledeinstancia Estas variables deben ser declaradas fuera de los mtodos y dentro de la clase, y son del tipo global por lo que las pueden utilizar cualquier mtodo no esttico de de esa clase, pero para acceder desde mtodos estticos es necesario instanciar la clase.

Variables estticas.
Si al definir una variable le anteponemos la palabra static conseguimos que todos los objetos de dicha clase compartan dicha variable. Es decir existe existe una nica copia de dicha variable, por tanto, si algn objeto modifica la variable, quedar modificada para todos los objetos. Si queremos acceder a una variable de clase no es necesario instanciar ningn objeto de dicha clase, basta con usar: Nombredeclase.nombredevariableesttica bredeclase.nombredevariableesttica

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

15

En este ejemplo definimos una variable esttica para la velocidad mxima a la que puede ir un coche, accederemos al valor de la variable sin necesidad de crear una variable de instancia:

public class Coche{ static int VMAXIMA=120;//Velocidad mxima a la que podemos circular. }

public class Conductor {

public static void main(String args[]){ System.out.prinln(Coche.VMAXIMA); }

Variables finales.
En Java se usa la palabra clave final para indicar que una variable debe comportarse como si fuese una constante. Por tanto, no se permitir su modificacin una vez que sea declarada e inicializada. Poniendo la palabra final con una variable o clase esttica, esttica, se crean constantes de clase. Si intentamos modificar el valor de la variable nos dar error. En este ejemplo intentaremos modificar la velocidad mxima a la que puede ir un coche. Como la variable que controla la velocidad mxima es final comprobaremos comprobaremos que nos saltar un error:

public class Coche{ static final int VMAXIMA=120;//Velocidad mxima a la que podemos circular. }

public class Conductor { public static void main(String args[]){ Coche.VMAXIMA=180; System.out.prinln(Coche.VMAXIMA); }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

16

Mtodos de clase.
Los mtodos son funciones que pueden ser llamados dentro de la clase o por otras clases. La implementacin siempre ser de dos partes: la declaracin y el cuerpo:

[ModificadoresAcceso] TipoRetorno nombreMtodo ([lista_de_argumentos]) [excepciones]{


CuerpodelMtodo } La lista de argumentos es opcional. Los parmetros o argumentos se usan para pasar informacin al cuerpo del mtodo. Los parmetros se pararn a la hora de llamarlos. El tipo de retorno o es obligatorio e indica el tipo de dato que devuelve tras realizar su tarea. Si no devuelve nada se indica mediante la palabra void. Lo recibe la aplicacin que realiz la llamada. Para devolver un valor se utiliza la palabra clave return. Si se declara a un mtodo anteponiendo la palabra static, ste se convierte en un mtodo esttico o de clase. Las caractersticas de estos mtodos son: Pueden ser invocados sin necesidad de que haya que instanciar ningn objeto de la clase. NombreClase.nombreMtodo(...) Los mtodos estticos slo tienen acceso a variables de clase o estticas; no tienen acceso a las variables de instancia a no ser que se cree un objeto y se acceda a las variables de instancia a travs de ese objeto.

Sobrecarga de mtodos o polimorfismo. polimorfismo


En Java es posible definir dos o ms mtodos dentro de la misma clase que compartan el mismo nombre pero las declaraciones de sus parmetros deben ser diferentes. A esto es a lo que se conoce como Sobrecarga de Mtodos. La Sobrecarga es uno de los procedimientos procedimientos mediante el cual Java implementa el polimorfismo(en programacin orientada a objetos es la capacidad que tienen los objetos de una clase de responder al mismo mensaje o evento en funcin de los parmetros utilizados durante su invocacin). En este e ejemplo definimos una clase con 3 mtodos sobrecargados: class Principal{ public void Metodo1() { System.out.println(Metodo sin Argumentos); } public void Metodo1(int edad) // Sobrecarga con un parmetro { System.out.print(Metodo con un Argumento:); System.out.println( edad= +edad); } public void Metodo1(double edad, double ao, double mes) //Sobrecarga con tres parmetros {

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

17

System.out.print(Metodo con tres Argumentos:); System.out.println( edad= +edad+ ao= + ao + } } class Prueba{

mes= + mes );

public static void main (String [] var) { Principal objeto= new Principal(); //Se crea un Objeto de nombre Objeto para llamar a los Mtodos Sobrecargados objeto.Metodo1(); objeto.Metodo1a(30); o objeto.Metodo1(30.2,76.0,8.6); } }

Unidad 3 : Identificadores, palabras clave y tipos


Introduccin.
Al igual que el lenguaje natural que utilizamos para comunicarnos, ya sea de forma oral o por escrito, cualquier lenguaje de programacin dispone de unos elementos y reglas que deben conocerse a la hora de programar. Los elementos del lenguaje natural nos permiten designar cosas (nombres), expresar cualidades de esas cosas (adjetivos), expresar acciones (verbos), etc. Las reglas sintcticas (estructura) y semnticas (significado) permiten el entendimiento entre las partes que forman la comunicacin. En los lenguajes de programacin tambin encontramos unas reglas sintcticas que debemos respetar a la hora de confeccionar los programas y una semntica encargada de resolver el problema que queremos programar.

Utilizar comentarios en el cdigo fuente


Comentarios mentarios en los programas
Un aspecto importante a la hora de confeccionar un programa es comentar lo ms detalladamente posible lo que significa cada una de las rdenes que forman parte del programa, con el propsito de poder recordar en un futuro la funcin funcin que realiza cada una de ellas, y facilitar su estudio a personas ajenas al programa. Sintaxis. En java hay tres tipos de comentarios:

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

18

Comentario //.......... /* ........ */ /** ........*/

Descripcin
Comentario para una sola lnea. Comentario de una o ms lneas Comentario de documentacin de una o ms lneas.

Los comentarios de documentacin, colocados inmediatamente antes de una declaracin de variable o funcin, indican que ese comentario ha de ser colocado en la documentacin que se genera ge automticamente cuando se usa la herramienta javadoc.

Identificador Identificadores
En todo lenguaje de programacin surge la necesidad de utilizar una serie de elementos que debemos designar con algn nombre, por ejemplo:

Elemento Variables Funciones

Descripcin
- Elementos utilizados para referenciar posiciones de memoria dnde podremos almacenar datos necesarios para el programa. - Elementos utilizados para referenciar posiciones de memoria dnde reside el cdigo del programa. - Elementos que encapsulan variables (propiedades) y funciones (mtodos) de manera que resulta ms sencillo modelar los problemas que queremos resolver simplificando el diseo de programas complejos. - Conforme avancemos iremos conociendo ms elementos de los lenguajes lengu de programacin.

Objetos

etc.

Los identificadores sirven para asignar nombre a los diferentes elementos que forman un programa: variables, mtodos, clases, objetos, etc.; cualquier cosa que el programador necesite identificar y que est contemplado por el lenguaje lengua de programacin. En la siguiente tabla se muestran las reglas sintcticas que debemos cumplir a la hora de elegir un identificador:

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

19

Primer carcter Siguientes caracteres Longitud Maysculas / Minsculas No se pueden usar

Una letra, subrayado ( _ ) o el smbolo de dlar ($). Pueden ser letras, nmeros o smbolos. No hay una longitud mxima establecida. Se distinguen las maysculas de las minsculas. Palabras clave. Palabras reservadas.

Palabras reservadas
En la siguiente tabla tenemos las palabras claves proporcionadas por la documentacin de SUN. abstract Boolean Break Byte Case Catch Char Class Const * double else extends final finally float for goto * if Int Interface Long Native New Null Package Private static super switch synchronized this throw throws transient

Protected try void volatile while

Continue implements Public Default Do import instanceof Return Short

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

20

Convenios para asignar nombres de las clases, variables y mtodos.


Existe un convenio, no obligatorio, a la hora de nombrar las clases, las variables y mtodos. Es recomendable seguirlo debido a que ayuda a dar claridad a los programas.

Clases e interfaces

- Deberan ser un nombre o una concatenacin de ellos. (FacturaEnero) - Poner en mayscula la primera letra de cada nombre utilizado.

Mtodos

- Deberan ser verbos con nombres. (calcularImporte) - Mismo regla que en clases pero poniendo con minscula la primera letra de verbo. Se aconseja no usar el smbolo de subrayado.

Constantes

- En maysculas. - Si se usan varias palabras se aconseja separarlas mediante el smbolo de subrayado.

Variables

- Deberan ser un nombre o una concatenacin de ellos. (cantidadVariable) (can - El primero de ellos comenzara en minscula y el resto en maysculas.

Tipos de datos
Tipos primitivos
Java utiliza cuatro tipos de elementos para abarcar todos los posibles datos bsicos que podemos necesitar en el desarrollo de una aplicacin. Enteros, reales en coma flotante, booleanos y caracteres. La siguiente tabla lista los tipos de datos primitivos soportados por Java, sus tamaos y su formato. Tipo Tamao/Formato Descripcin

(enteros)
byte short int long

8-bit bit en complemento a 2 16-bit bit en complemento a 2 32-bit bit en complemento a 2 64-bit bit en complemento a 2

Entero con un byte de longitud. Entero corto (de 16 bits)

(reales en coma

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

Entero largo.

21

Entero.

flotante)
float double

32-bit bit IEEE 754 64-bit bit IEEE 754

Coma flotante de simple precisin. Coma flotante de doble precisin.

(Texto) Un nico carcter o carcter aislado. - Un valor tipo char debe ir entre comillas simples.

char

Carcter Unicode de 16 bits sin signo.

String

Cadena de caracteres codificados en Unicode.

- No es un dato primitivo sino una clase pero por su naturaleza lo incluimos como tipo de dato. - Se utiliza para representar secuencias de caracteres y suele traducirse como cadena. - Un dato de este tipo se delimita entre comillas dobles. "Nombre \t Pepe"

(Lgicos)
boolean

true o false

Un valor booleano (true or false).

Variables
En programacin, las variables son estructuras de datos que, como su nombre indica, pueden cambiar de contenido a lo largo de la ejecucin de un programa. Hay varios tipos de variables que requieren distintas cantidades de memoria para guardar datos. Siempre las variables tenemos mos que declararlas antes de usarlas, esta declaracin consiste en una sentencia en la que figura el tipo de dato y el nombre que asignamos a la variable. Despus de declararla ya podemos asignarle un valor. Los tres tipos de variable que podemos utilizar en java son locales, de instancia y de clase. Variables de instancia: Guardan atributos de un objeto. Variables de clase: Son muy parecidos a las variables de instancia, con la excepcin de que los valores que guardan son los mismos para todos los objetos de una determinada clase. En el siguiente ejemplo, VMAXIMA es una variable de clase y Vactual es una variable de instancia. VMAXIMA guarda el mismo valor para todos los objetos de la clase Coches, pero la Velocidad actual de cada coche puede ser diferente

class Coches{ static final int VMAXIMA=120;

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

22

int Vactual; //... } Variables locales: Se utilizan dentro de los mtodos. En el siguiente ejemplo Vactual es una variable local al mtodo mostrarVelocidad en la que guardamos la velocidad actual a la que circula un coche. Una variable local existe desde el momento de su definicin hasta el final del bloque en el que se encuentra. public int mostrarVelocidad(){ int Vactual=velocidad*12; return Vactual; Vactual } En el lenguaje Java, las variables locales se declaran en el momento en el que son necesarias. Es una buena costumbre inicializar las variables en el momento en el que son declaradas.

Operadores
Aritmticos (Suma, resta, multiplicacin, divisin, resto, incremento y decremento).
En la siguiente tabla tenemos las operaciones aritmticas que podemos realizar entre dos operadores.

Actan sobre enteros y nmeros en coma flotante. El operador + tambin se utiliza para concatenar cadenas (strings). En la siguiente tabla tenemos las operaciones aritmticas sobre un solo operando.

Veamos algunos ejemplos que aclaren estos conceptos:

public class Ejoperadores{ public static void main(String args[]) {

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

23

int b=2; int s=5; int div1=s/b; prdida

// Al convertirlos los operandos en double estas operaciones tienen

int resto1=s%b; //de precisin, por tanto, obtenemos errores de compilacin. double div2=s/b; // Sale mal. Si queremos que salga bien, //los v1erandos deben ser tipo float o double. double resto2=s%b; System.out.println("El valor de "+b+"+"+s+"="+(b+s),20,50); System.out.println("El valor de "+b+"-"+s+"="+(b-s),20,70); "+b+" System.out.println("El valor de "+s+"/"+b+"="+div1,20,90); System.out.println("El valor de "+s+"%"+b+"="+resto1,20,110); System.out.println("El valor de "+s+"/"+b+"="+div2,20,130); System.out.println("El valor de "+s+"%"+b+"="+resto2,20,150); System.out.println("El ystem.out.println("El valor de "+b+"*"+s+"="+(b*s),20,170); //Con divisiones es necesario que tanto el resultado como los v1erandos sean datos tipo double o float //con el prposito de no obtener resultados errneos } }

Operadores relacionales.

Operadores condicionales.

Operadores a nivel de bit.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

24

Es interesante observar que la funcin AND a nivel de bits es igual que el operador condicional &. La diferencia est en los tipos de datos con los que se usa (Sobrecarga de operadores). La funcin AND se usa con datos numricos. El operador condicional se usa sobre booleanos. Veamos algunos ejemplos que aclaren estos conceptos: Definimos dos datos tipos short y realizamos operaciones lgicas a nivel de bit con ellos. Tambin se realizan diferentes desplazamientos sobre uno de los datos. public class EjemploOperadores2 { public static void main(String args[]) { byte b1=127; byte b2=1; int i=3; System.out.println("El valor de "+b1+"&"+b2+" es "+(b1&b2),20,50); System.out.println("El valor de "+b1+"|"+b2+" es "+(b1|b2),20,70); System.out.println("El valor de "+b1+"^"+b2+" es "+(b1^b2),20,90); System.out.println("El valor de ~"+b1+" es "+(~b1),20,110); System.out.println("El valor de "+b1+"<<"+i+" es "+(b1<<i),20,130); "+(b1<<i),20,130); System.out.println("El valor de "+b1+">>"+i+" es "+(b1>>i),20,150); System.out.println("El valor de "+b1+">>>"+i+" es "+(b1>>>i),20,170); } } Imprimir en pantalla el cdigo binario de un dato tipo int. Observar que el cdigo sale al revs. Modificar el cdigo para que salga bien.

public class EjemploOperadores3 { public static void main(String args[]) { int i=15; int k=1; int s=320;

for (int j=0;j<32;++j){ System.out.println(""+((i>>j)&k),(20+s),50); s=s-10; }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

25

} }

Operadores de asignacin.
Una forma de ahorrar tiempo a la hora de escribir expresiones pero que muchas veces lan las cosas innecesariamente.

Operador ternario if-then-else. else.


Sintaxis: Expresin ? sentencia 1 : sentencia 2 Si la expresin devuelve como resultado true entonces se ejecuta la sentencia 1, en caso contrario, se ejecuta la sentencia 2.

Precedencia entre operadores.


El orden de precedencia segn SUN se refleja en la siguiente tabla (de ms prioritario a menos).

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

26

Ver Video: Casting Conversion

Laboratorio 1: Definiendo tipos de datos


Objetivo
Comprender el funcionamiento de los tipos primitivos de java.

Enunciado:
Crear una clase definir dos variables, la primera ser float y la segunda double. Imprimir el resultado de las dos variables.

Solucin:
public class Ejemplo { public static void main(String args[]) { float flt=253.7F; double doub=234.56e+34; System.out.println("El valor de f es "+flt); System.out.println("El valor de d es "+doub); } }

Laboratorio 2: Definiendo tipos de datos II


Objetivo
Comprender el funcionamiento de los tipos primitivos de java.

Enunciado:
Imprimir el ascii de los 256 primeros caracteres.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

Solucin:

27

public class Ejemplo { public static void main(String args[]) { System.out.println("Decimal\t\t\t\tCaracter"); System.out.println("Decimal System.out.println(" System.out.println("-------------------------------------"); "); for (int i=0; i<256; ++i){ System.out.println(" "+i+" \t\t\t\t } } } "+(char)i);

Laboratorio 3: Definiendo tipos de datos III


Objetivo
Comprender el funcionamiento de los tipos primitivos de java.

Enunciado
Declarar dos variables de tipo boolean e imprimir el resultado de ambas variables.

Solucin
public class Ejemplo { public static void main(String args[]) { boolean b1=true; b1=tru boolean b2=false; if(b1){ System.out.println("b1 es "+b1); } if(!b2){ System.out.println("b2 es "+b2); } } }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

28

Unidad 4 : Expresiones y control de flujo


Introduccin.
En la siguiente tabla se resumen las sentencias que proporciona Java para controlar el flujo de un programa: Tipos Sentencias

De decisin. if-else, switch-case Bucles


for, while, do-while

Excepciones try-catch-finally, throw Varios


break, continue, label: , return

if-else
Permite seleccionar la ejecucin de distintos fragmentos de cdigo dependiendo del resultado de la valoracin de una expresin booleana. Su sintaxis es la siguiente: if (expresion_booleana) { // La expresin booleana expresa condiciones ... // cdigo que se ejecuta si la expresin devuelve true ... } else { ... // cdigo que se ejecuta si la expresin devuelve false ... } El uso de else es opcional. La expresin booleana puede contener operadores operadores relacionales para encadenar condiciones. Ejemplo: Detectar si este es par o impar public class MostrarPares { public static void main(String args[]) { int dato=13; if (dato%2==0){

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

29

System.out.println("El dato "+dato+" es par"); } else{ System.out.println("El dato "+dato+" es impar"); } } }

switch-case
Se utiliza cuando se quieren analizar muchas posibilidades de una nica variable o expresin. Su sintaxis es la siguiente: switch (expresin) { case valor1: sentencias1; break; case valor2: sentencias2; break; case valor3: sentencias3; break; case valor4: sentencias4; break; case valor5: sentencias5; break; default: sentencias_por_defecto break; } La expresin puede devolver cualquier tipo bsico, y cada uno de los valores especificados en las sentencias case debe ser un tipo compatible. La sentencia default es opcional y se ejecutar en todos los casos en el que el valor devuelto por expresin no coincida con los especificados en los case. La sentencia break (sin etiqueta) hace que se salga del dominio de la sentencia switch. Con ello se evita que se valoren todas las opciones que quedan una vez que se ha encontrado la correcta. Es opcional. Los string tring no pueden analizarse directamente con switch-case switch

Ejemplo que nos devuelve el mes dependiendo del valor de un entero.


public class MostrarMes { public static void main(String[] args) { int mes = 6; switch (mes) { case 1: System.out.println("Enero"); break; case 2: System.out.println("Febrero"); break; case 3: System.out.println("Marzo"); break;

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

30

case case case case case case case case case } } }

4: System.out.println("Abril"); break; 5: System.out.println("Mayo"); m.out.println("Mayo"); break; 6: System.out.println("Junio"); break; 7: System.out.println("Julio"); break; 8: System.out.println("Agosto"); break; 9: System.out.println("Septiembre"); break; 10: System.out.println("Octubre"); break; 11: System.out.println("Noviembre"); break; 12: System.out.println("Diciembre"); break;

for
Este bucle permite establecer la inicializacin de la variable que controla el bucle, su variacin y la condicin de permanencia, en la propia definicin del for. Su sintaxis: for (inicializacin; condicin de permanencia; variacin){ ... sentencias ... } La inicializacin hace referencia a la variable de control del bucle. La condicin de permanencia es una expresin booleana donde debe encontrarse la variable de control. La actualizacin hace referencia a la variable de control.

Ejemplo: o: Imprimir en un bucle for los 10 primeros nmeros naturales.


public class Ejemplo { public static void main(String[] args) throws IOException{ for (short i=0; i<=10; ++i){ System.out.println("i vale "+i); } } }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

31

while
Ejecuta repetidamente un conjunto de sentencias mientras una expresin booleana sea verdadera. Su sintaxis es: while (Expresin_booleana) { //Condicin de permanencia ... sentencias; ... } Dentro del bucle se deber alterar la variable que controla el bucle de lo contrario nunca se dejar de cumplir la condicin. Se puede realizar un bucle infinito pero se debe incluir la salida dentro del bucle.

Ejercicio: Recoger un nmero por teclado e imprimir todos sus divisores.

import java.io.*; public class Ejemplo { public static void main(String[] args) throws IOException{ String numero; BufferedReader teclado=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Introduzca el nmero a analizar:"); numero=teclado.readLine(); eclado.readLine(); int num=Integer.parseInt(numero); int i=Integer.parseInt(numero); while(i>0){ if (num%i==0){ System.out.println(i+" es divisor de "+numero);

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

32

} ---i; } System.out.println("Pulse cualquier tecla para salir..."); teclado.read(); } }

do-while
Igual que el while, pero las sentencias se ejecutan al menos una vez antes de valorar las expresin. Su sintaxis: do { ... sentencias; ... } while (Expresin_booleana);

EJEMPLO: Recoger un nmero por teclado e imprimir imprimir todos sus divisores. Podremos seguir mientras pulsemos la letra s.

import java.io.*;

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

public static void main(String[] args) throws IOException{ String numero; String letra;

33

public class Ejemplo {

BufferedReader teclado=new BufferedReader(new InputStreamReader(System.in)); do{ System.out.println("Introduzca nmero:"); numero=teclado.readLine(); int num=Integer.parseInt(numero); int i=Integer.parseInt(numero); while(i>0){ if (num%i==0){ System.out.println(i+" es divisor de "+numero); System.out.println(i+" } ---i; } System.out.println("Pulse 's' para continuar..."); letra=teclado.readLine(); System.out.println(letra); }while (letra.equals("s")); } }

CONTINUE
Permite volver al inicio del bucle para comenzar una nueva iteracin sin que la iteracin actual se lleve a cabo del todo. Ejemplo

public

class Ejemplo {

public static void main(String[] args) throws IOException{ bf: for ( int i=1; i <5; i++ ) { for ( int j=1; j<5; j++ ) { if ( j>i ) { System.out.println(" "); continue bf;

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

34

} System.out.print( " " + (i*j) ); } } } }

BREAK
Permite salir del bucle aunque la condicin de permanencia todava se cumpla. Ejemplo

public class Ejemplo { public static void main(String[] args) throws IOException{ bf: for( int i=1; i<10; i++ ){ System.out.print(" i="+i); for( int j=1; j<10; j++ ){ if ( j==5 ) break bf; //Con break salimos de los dos bucles System.out.print(" j="+j); } System.out.print("Este mensaje nunca lo imprimir"); } } }

return
Se utiliza en las funciones cuando queremos retornar al cdigo desde el que se llam a la funcin. En el retorno, rno, se puede devolver algn valor. Cuando un mtodo se declara como void se debe usar la forma de return sin indicarle ningn valor Esto se hace para no ejecutar todo el cdigo del programa: Ejemplo: void metodo1(){ if ( condicion == true ) return; }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

35

Laboratorio: Uso del bucle While


Objetivos:
Aprender a utilizar el bucle While de Java

Enunciado:
Abrir un proyecto de tipo aplicacin de Java. Crear un algoritmo que imprima los primos entre 1 y 50.

Solucin:
public class Ejercicio { public static void main(String args[]){ int n, d; for(n=1; n < 50; n += 2){ d=3; while(n % d != 0) d = d + 2; if(d == n) System.out.print(n + ", "); } System.out.println(); } }

Ver Video: SentenciaSwitch Ver Video: SentenciaBreak

Unidad 5: Arrays
Objetivos
Conocer el concepto de coleccin. Aprender el manejo de arrays unidimensionales y bidimensionales.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

36

Introduccin
Un array es una coleccin de elementos del mismo tipo. Los elementos que puede contener un array pueden ser datos de tipos primitivos u objetos.

Concepto de Array
Los arreglos son varios objetos en uno, pero que se accede a cada uno de los objetos almacenados por medio de un ndice. Son un conjunto de elementos elementos accesibles desde un nico objeto a partir de una posicin especfica. Las Matrices o arrays multidimensionales. (llamados tambin arreglos) pueden ser unidimensionales o

Los arreglos son estticos, lo que quiere decir que no podemos redimensionar un array. Si quisiramos redimiensionar un array sera destruido todo su contenido, perdiendo la informacin que tuviramos almanenada en su interior. Los elementos que pondremos en nuestro arreglo de datos deben estar definidos en cantidad, no en valor. Los arreglos tienen una cantidad de elementos especfica, todos comienzan en cero y su lmite superior ser el nmero de elementos totales menos 1. Los Arrays tienen una propiedad d para averiguar el nmero de elementos que contiene en su interior. Es la propiedad length. Esta variable nos devuelve el nmero de elementos que posee el array. Hay que tener en cuenta que es una variable de solo lectura, es por ello que no podremos realizar realizar una asignacin a dicha variable. Tenemos que tener claro el atributo length nos devuelve el nmero de posiciones o huecos que existen en el interior del array, el hecho que hayamos declarado un array con una capacidad determinada, no indica que el contenido ntenido del array est creado, podremos comprobarlo a lo largo del mdulo. Simplemente esto quiere decir que un array puede tener posiciones con contenido y posiciones con valores por defecto en el caso de que sean tipos primitivos y valores nulos en el caso de que sean objetos referenciados.

Arrays Unidimensionales

En Java un arreglo se representa por un objeto que tiene un lmite de elementos al ser definido, o en alguna parte de nuestro programa le asignaremos un objeto arreglo de cierto tipo.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

37

Son el concepto que acabamos de explicar ahora mismo, un objeto compuesto por mltiples elementos, dnde cada uno de los elementos tiene una posicin en el conjunto.

Por ejemplo, imaginemos que deseamos almacenar una lista de 6 textos, deberamos de crearnos un array de 6 elementos, dnde el primer texto estara en la posicin cero y el ltimo texto estara en la posicin 5. Podemos visualizarlo en ste ejemplo grfico:

POSICION 0 1 2 3 4 5

TEXTO ALMACENADO En Un Lugar De La Mancha

De forma que si queremos acceder a alguna posicin del array para acceder a algn elemento en concreto deberamos escribir: Nombrearray[posicin]; En nuestro ejemplo concreto, si nuestro array se llamase textos: Textos[2] Devolvera el valor de Lugar.

Un array puede ser creado para que contenga cualquier tipo de dato, ya sea un conjunto de elementos de tipos primitivos (int, double, string), o un conjunto de objetos referenciados (objetos de clases existentes o creadas por el propio programador). La sintaxis para crear ear un array e indicar al compilador que es un arreglo se realiza mediante corchetes, dnde en la creacin del objeto es dnde indicaramos el nmero de elementos a contener dentro del array. Para declarar una array unidimensional se puede realizar de varias var formas: Creando el array sin contenido: Creando un array, e inicializando el nmero de elementos posteriormente en el cdigo. int numeros[] = new int[5]; int numeros[]; int numeroelementos = 5; numeros = new int[numeroelementos]; Creando un array con contenido e inicializando los valores que deseamos que contenga en su interior. Dos tipos de sintaxis:

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

int numeros[] = new int[] {2,5,6,7,8}; int numeros[] = {2,5,6,7,8};

38

En las dos primeras opciones, los elementos internos del array son inicializados a su valor vaco o null. A diferencia de los objetos simples, cuando utilizamos arrays, los objetos de su interior son inicializados y el compilador nos permite trabajar y ejecutar la aplicacin. Para inicializar los valores de un array, tambin podemos hacer lo posteriormente por cdigo, igualando el nombre del array y de la posicin que deseamos modificar por el valor que necesitamos almacenar.

Nombrearray[posicin] = valor;
Llevado a cdigo sera la siguiente instruccin: int numeros[] = new int[]; numeros[0] = 2; numeros[1] = 5; numeros[2] = 6; numeros[3] = 7; numeros[4] = 8; Veamos la diferencia entre una variable simple y un conjunto de variables simples (array): Si escribimos el siguiente cdigo en una clase, declarndonos una variable nica del tipo int, veremos que el compilador nos muestra una excepcin al querer compilar la clase: public class PruebaArreglos { public static void main(String args[]) { int numero; ero; System.out.println("El valor del numero es "+numero); } }

Vemos que como resultado, el programa de Java, impide al compilador utilizar variables que no hayan sido inicializadas con un valor como hemos visto en temas anteriores. Si ahora en cambio nos declaramos un array del mismo tipo, veremos que el resultado es totalmente distinto, permitindonos compilar sin ningn tipo de excepcin: public class PruebaArreglos { public static void main(String args[]) { int arraynumeros[] = new int[5];

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

39

System.out.println("El valor del numero es "+arraynumeros[2]);

}
}

El compilador nos permite generar el archivo class sin ningn problema, si ahora ejecutsemos el cdigo para visualizar la lgica de la clase veremos lo siguiente:

Lo que sucede ede es que el array al ser declarado como un tipo de datos primitivos (en nuestro ejemplo int), los valores de los objetos internos se inicializan a un valor inicial, en ste ejemplo en concreto al nmero cero. Ahora vamos a visualizar que sucedera en el caso de trabajar con objetos referenciados. Nos vamos a crear la siguiente clase, para posteriormente, crearnos un array con objetos de dicha clase y acceder a sus atributos. public class MiClasePrueba { public int num; public String texto; public MiClasePrueba() { num = 19; texto = "clase de prueba para arrays"; } } Ahora vamos a utilizar el nuevo objeto creado, pero en un array. Primero declararemos una variable simple para manejar un nico objeto referenciado y a continuacin un conjunto de objetos en un array. public class PruebaArreglos { public static void main(String args[]) { MiClasePrueba objetosimple = new MiClasePrueba();

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

40

System.out.println("Valor del Objeto Simple: "+objetosimple.texto);

MiClasePrueba objetos[] = new MiClasePrueba[5]; MiClaseP


System.out.println("Valor del Objeto Compuesto "+objetos[2].texto); } }

Como podemos comprobar, el mensaje del objeto simple es visualizado despus de compilar la clase, pero al llegar a utilizar el objeto compuesto nos ofrece una excepcin excepci de la clase NullPointerException, lo que quiere decir al final de todo es que estamos creando un conjunto de elementos, pero dichos elementos no han sido creados en el interior del array, debemos hacer un new sobre algn objeto del array que deseamos crear. El compilador no detecta sta excepcin, ya que no verifica el interior del contenido del objeto array, sino que solamente detecta la creacin del conjunto por si ha sido creado correctamente e inicializados sus valores para que sean utilizados. La solucin de la excepcin sera creando un objeto en la posicin que deseamos utilizar: public class PruebaArreglos { public static void main(String args[]) { MiClasePrueba objetosimple = new MiClasePrueba(); System.out.println("Valor del Objeto Simple: Simple: "+objetosimple.texto); MiClasePrueba objetos[] = new MiClasePrueba[5]; objetos[2] = new MiClasePrueba(); System.out.println("Valor del Objeto Compuesto "+objetos[2].texto); } } De forma que el valor resultante despus de la compilacin sera totalmente diferente y accederamos al objeto creado:

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

41

Arrays Multidimensionales
Debemos pensar en ellos como una tabla, nos permiten almacenar ms de un ndice por cada elemento. Para entender mejor el concepto, pensemos en un conjunto de personas, cada c persona contiene como dato un nombre y un dni. Son dos valores a almacenar, por un lado el nombre de la persona y por otro el dni. En lugar de crearnos dos arrays, se utiliza un array nico con dos dimensiones o posiciones, pudiendo acceder a cada elemento elemento por su posicin en el conjunto y el dato en cuestin. Para visualizarlo mejor, podemos visualizar la siguiente tabla: Imaginemos un array compuesto por nombres llamado datos.

FILAS 0 1 2

0 NOMBRE Nacho Llanos Andrea Serrano Lucia Gutierrez

1 DNI 12345678N 23451235H 98765432P

COLUMNAS

Segn nuestro cuadro, tenemos dos datos almacenados en cada una de las filas, de forma que accederamos a ellos mediante posicin de fila y posteriormente, posicin de columna.

nombrearray[POSICION FILA] [POSICION [ COLUMNA]


De forma que si desesemos saber el DNI de Luca Gutierrez escribiriamos:

datos [2] [1]

98765432P

Para crearnos arrays multidimensionales sucede lo mismo que con arrays unidimensionales, existen mltiples formas dependiendo de lo que deseemos realizar o almacenar sobre el array: Declaracin y creacin de un array multidimensional sin contenido: int[][] arraymultidimensional = new int[2][3]; Estamos creando un array que contendra dos filas y tres columnas para cada fila.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

42

Declarar un array multidimensional y crearlo posteriormente en el cdigo de la aplicacin: int[][] arraymultidimensional; int numerofilas = 2; int numerocolumnas = 3; arraymultidimensional = new int[numerofilas][numerocolumnas];

Declarar y crear un array multidimensional con elementos en su interior, asignados en la creacin del objeto:

String [ ][ ] datos = { { "Nacho Llanos", "12345678N" }_ , { "Andrea Serrano" , "23451235H" }_ , { "Lucia Gutierrez" , "98765432P" } }; Declarar un array multidimensional y asignar los valores posteriormente:

String [ ][ ] arraymultidimensional = new String[2][2];


arraymultidimensional[0][0] = "Nacho Llanos";_ arraymultidimensional[0][1]

= "12345678N";_ "12345678N";

arraymultidimensional[1][0] = "Andrea Serrano";_ arraymultidimensional[1][1]

= "23451235H";

Vamos a ver un ejemplo para crearnos un recorrido sobre un array multidimensional que contenga datos en su interior y cmo podemos recuperarlos para mostrarlos todos por pantalla:

public class PruebaArreglos


{ public static void main(String args[]) { String [ ][ ] arraymultidimensional = new String[3][2]; arraymultidimensional[0][0] = "Nacho Llanos"; arraymultidimensional[0][1] = "12345678N"; arraymultidimensional[1][0] = "Andrea Serrano";_ arraymultidimensional[1][1] = "23451235H"; arraymultidimensional[2][0] = "Lucia Gutierrez"; arraymultidimensional[2][1] = "98765432P"; //Recorrido por el array multidimensional for (int i = 0; i < arraymultidimensional.length; i++) { //Recorremos las filas for (int z = 0; z < arraymultidimensional[i].length; z++) { //Recorremos las columnas System.out.println("El dato en la fila " + i + ", columna " + z + " es:_ " + arraymultidimensional[i][z]); } } } } Como resultado veremos que hemos recorrido las dos dimensiones dimensiones del array.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

43

Para averiguar la longitud de las filas, bastara con utilizar la propiedad length sobre el objeto array: arraymultidimensional.length Si deseamos saber la longitud de las columnas de una fila, debemos aplicar el atributo length sobre sobr la fila en cuestin y contar el nmero de columnas existentes para esa fila: arraymultidimensional[numerofila].length

Creacin de un array
Un array es una coleccin de elementos del mismo tipo. En principio crearemos arrays de datos de tipos primitivos, pero se pueden crear arrays de objetos. Antes de utilizar un array hay que declararlo. En la declaracin debe especificarse el nombre del array ray y el tipo de datos que se va a almacenar en l. Para crear arrays en Java hay dos mtodos bsicos: int numeros[] = new int[20]; // Define un array de 20 enteros pero sin valores (vaco). int numeros[]={0,1,2,3,4,5,6,7,8,9,10,11}//Define un array de 12 elementos y los inicializa. De alguna forma hay que especificar el tamao del array.

Ejemplo en el que definimos una serie de arrays e imprimimos sus valores.


public class Ejemplo { public static void main(String args[]) throws IOException { int enteros[]=new int[10]; char vocales[]={'a','e','i','o','u'}; String saludos[]={"hola","hello"};

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

44

for (int i=0;i<enteros.length;++i){ enteros[i]=i; } System.out.println(saludos[0]); System.out.print("Los nmeros bsicos son: "); " for (int i=0;i<enteros.length;++i){ System.out.print(enteros[i]); } System.out.println(""); System.out.print("Las vocales son: "); for (int i=0;i<vocales.length;++i){ System.out.print(vocales[i]); } System.out.println(""); System.out.println(saludos[1]); } } Ejemplo en el que definimos una serie de arrays e imprimimos sus valores, al no indicarle un tamao el compilador nos avisar de ello. public class Ejemplo { public static void main(String main(S args[]) throws IOException { int enteros[]=new int[]; char vocales[]={'a','e','i','o','u'}; String saludos[]={"hola","hello"}; for (int i=0;i<enteros.length;++i){ enteros[i]=i; } System.out.println(saludos[0]); System.out.print("Los nmeros bsicos son: "); for (int i=0;i<enteros.length;++i){ System.out.print(enteros[i]); } System.out.println(""); System.out.print("Las vocales son: "); for (int i=0;i<vocales.length;++i){

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

45

System.out.print( System.out.print(vocales[i]); } System.out.println(""); System.out.println(saludos[1]); } }

Los arrays en Java no se pueden redimensionar de forma dinmica. En este ejemplo comprobamos como el compilador nos avisara del error. Java dispone de las colecciones para par redimensionar de forma dinmica. public class Ejemplo { public static void main(String args[]) throws IOException { int enteros[]=new int[10]; char vocales[]={'a','e','i','o','u'}; String saludos[]={"hola","adios"}; enteros[10]=10; for (int i=0;i<enteros.length;++i){ enteros[i]=i; } System.out.println(saludos[0]); System.out.print("Los nmeros bsicos son: "); for (int i=0;i<enteros.length;++i){ System.out.print(enteros[i]); } System.out.println(""); System.out.println( System.out.print("Las vocales son: "); for (int i=0;i<vocales.length;++i){ System.out.print(vocales[i]); } System.out.println(""); System.out.println(saludos[1]); } }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

46

Tambin se pueden crear arrays multidimensionales (arrays de arrays). int valores[][]=new int[10][5]; int valores[][]={{1,2,3},{4,5,6},{7,8,9}} Se puede observar el efecto de intentar acceder a elementos fuera de los lmites de un array. Si declaramos un array de dos dimensiones, no es necesario indicar el tamao de la dimensin secundaria a la hora de la declaracin del array, sino que puede declararse posteriormente el tamao de cada uno de los subarrays. Todos los arrays en Java tienen una funcin miembro: miembro: length(), que se puede utilizar para conocer la longitud del array. int valores[][] = new int[5][2]; valores.length; Nos dar 5 valores [0].length; Nos dar 2

Colecciones
Cuando las caractersticas de un array se quedan incompletas para la lgica del programador es cuando se usan colecciones. Las colecciones son objetos que contienen un conjunto de objetos a su vez, exactamente igual que un array, adems se accede a cada uno de los elementos mediante un ndice para recuperar cada uno de los elementos. La diferencia entre un array una coleccin es simple. Un array es un objeto con una longitud de elementos estticos. Es decir, un array al ser creado se le debe especificar el nmero de elementos que va a contener en su interior, y dicho nmero de elementos elementos no pueden ser modificado. Adems, un array puede contener objetos nulos en su interior y no devolver el nmero real de elementos que existen en su interior, sino solamente su capacidad, es decir, puede contener huecos en algunas posiciones y datos en otras. Una coleccin es un objeto con un conjunto de elementos dinmico. El nmero de elementos de la coleccin puede crecer y decrecer. Una coleccin se dimensiona al nmero de elementos reales que contiene. No puede contener huecos nulos en su interior a no ser que el programador lo haya especificado mediante cdigo. Son objetos creados para una lgica en la que el programador no sabe el nmero de elementos que va a tener que almacenar. Adems, una coleccin siempre devolver el nmero de elementos mentos que contiene, no la capacidad de elementos que puede almacenar en su interior. La librera para trabajar con colecciones est ubicada en el paquete java.util. Los objetos que podemos almacenar en una coleccin son los mismo que en un array, desde tipos ti primitivos hasta objetos referenciados. La gran desventaja en el uso de colecciones de Java es la prdida de la identidad del tipo de datos almacenados cuando se coloca un objeto en su coleccin. Teniendo en cuenta querer hacer un conjunto de elementos lo ms general posible, se hizo de forma que se manejase directamente objetos de la clase object, independientemente del la clase o tipo de objeto almacenado en su interior.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

47

Con la versin de Java 1.5, ste problema se solucion. Se implementaron implementaro colecciones de forma que se pueden declarar objetos de una determinada clase y solamente se pueden almacenar objetos de dicha clase. La gran ventaja es que no tenemos que realizar casting para recuperar cualquier objeto, sino que la referencia al objeto ya est escrita en la propia declaracin de la coleccin. La desventaja radica en que no podemos almacenar cualquier clase de objeto, solamente del mismo tipo, pero para ello existen multiples clases de colecciones que nos pueden solucionar un problema lgico en concreto. Podemos diferenciar las colecciones en dos grandes familias: Coleccin (Collection): Son un grupo de elementos individuales. Es lo ms parecido que existe a un array unidimensional. Mapa (Map): Es un grupo de parejas de elementos, como un array bidimensional. Podriamos realizar la misma accin con una coleccin de parejas, pero el modo de tratarlas dependera de la sincronizacin que tuvisemos a la hora de almacenar los datos en cada ndice para que coincidieran.

Las colecciones y los mapas pueden ser implementados de muy diversas manera, en funcin de las necesidades de la programacin. Dentro de stas dos familias que acabamos de nombrar, existen tres tipos de colecciones: Map, List y Set, y solamente dos o tres implementaciones de cada cada una de ellas, por lo que podemos afirmar que aprender el manejo de una coleccin implica saber el resto de colecciones. Es parecido al mundo real, con saber conducir un coche, podemos conducir cualquier tipo de coche, independientemente del tipo, ya que que las caractersticas bsicas son las mismas para todos. Todas las colecciones pueden producir un objeto Iterator invocando al mtodo Iterator(). Un Iterator es un enumerador que permite recorrer cada uno de los elementos que existen dentro de la coleccin hasta llegar al ltimo. Vamos a visualizar los mtodos ms importantes dentro de las colecciones Set o List: add(object): Incluye un nuevo elemento dentro de la coleccin. addAll(Collection): Inserta todos los elementos que se pasan desde otra coleccin a la coleccin que realiza la llamada. clear(): Elimina todos los elementos de la coleccin, dejando el nmero de elementos a cero. contains(object): Devuelve un boolean indicando si el objeto que se pasa como argumento existe dentro de la coleccin. isEmpty(): Devuelve un boolean indicando si la coleccin tiene algn elemento ya incluido o no. iterator(): Devulve un Iterator que se utiliza para recorrer todos los elementos dentro de la coleccin uno a uno. coleccin, pasando como argumento el propio remove(object): Elimina un objeto de la coleccin, objeto a eliminar. removeAll(Collection): Elimina todos los elementos que estn dentro de la coleccin que se enva como argumento.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

toArray(): Convierte la coleccin en un array y devuelve todos los elementos para poder ser incluidos en ella.

48

size(): Devuelve el nmero de elementos que existen dentro de la coleccin. Debemos de recordar ecordar que siempre una coleccin va a devolver el nmero total de elementos que contiene.

Unidad 6: Diseo de clases


Introduccin
Para poder disear bien un conjunto de clase debemos tener en cuenta los siguientes conceptos: Un API donde el programador encuentre ya desarrolladas unas funcionalidades bsicas que podr utilizar en sus aplicaciones. Un kit de desarrollo donde se encuentren el compilador, compilador, el depurador, el intrprete si es necesario y dems herramientas que permitan la ejecucin de las aplicaciones desarrolladas. Todo este kit puede estar integrado en un entorno de desarrollo. Una tecnologa que permita al programador estructurar su aplicacin de la manera ms sencilla posible de tal forma que su anlisis e implementacin alcancen un nivel de abstraccin tal que su desarrollo sea lo ms ordenado y claro posible.

Constructores
Es un tipo especfico de mtodo que siempre tiene el mismo mismo nombre de la clase y se utiliza para construir objetos de esa clase. No tiene tipo de dato especfico de retorno, ni siquiera void. Esto se debe a que el tipo que debe devolver un constructor de clase es el propio tipo de clase. Los constructores pueden en sobrecargarse. Si el programador no declara un constructor el sistema siempre crea un constructor por defecto. Para inicializar un objeto basta con llamar a su constructor despus de la palabra reservada new y asignarlo a una referencia declarada previamente. previamente. Un constructor es un mtodo que se ejecuta cada vez que se crea un objeto, el propsito de este procedimiento es el de inicializar los datos del objeto. El nombre del constructor siempre es igual al nombre de la clase.

Declaracin
class facturar { int total, importe; facturar () { total=0; importe=0; } // el constructor }

Constructor con parmetros


class facturar { int total, importe; facturar (String cliente) { total=0; importe=0; } }

Varios constructores

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

49

class facturar { int total, importe; facturar () { total=0; importe=0; } // el constructor facturar (String cliente) { total=0; importe=0; } }

Herencia
Java permite el empleo de la herencia, caracterstica muy potente que permite definir una clase tomando como base se a otra clase ya existente. Esto es una de las bases de la reutilizacin de cdigo y especializacin. Dentro de un mismo tipo de objetos (por ejemplo, los empleados), existe una variedad de modelos (administrativos, programador, gerente, etc) que dificulta dificulta la definicin de la clase genrica. Por ejemplo, si defino los mtodos incentivos() y vacacionesNavidad(), estos mtodos slo se podrn aplicar a aquellos empleados que tengan incentivos y vacaciones en navidad. Para resolver este tipo de problemas, la la programacin orientada a objetos hace uso de la herencia. La herencia consiste en definir una clase a partir de otra ya existente. De esta forma podemos definir un empleado genrico y mediante herencia crear otras clases ms especializadas que respondan a las necesidades de cada tipo de empleado. La profundidad en la jerarqua de clases no tiene lmite. La herencia se consigue mediante el uso de extends. Una clase slo puede heredar de una nica superclase directamente (no existe la herencia mltiple). Los interfaces (estudiados ms adelante) permitirn simular la herencia mltiple. public class Empleado { String rut; String nombre; boolean perfil; String colorperfil; Empleado() { } Empleado(String nombre){ this.nombre = nombre; } public String getNombre() { return this.nombre; } public void setNombre(String nombre) { this.nombre = nombre; } } public class Programador extends Empleado{ String apellido;

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

50

public Programador() { super(); } public Programador(String nombre) { super(nombre); } void setApellido(String apellido) { this.apellido = apellido; } public String getNombre() { return this.nombre+" "+this.apellido; } public static void main (String args[]) { Programador Programador = new Programador(); Programador.setNombre("Pepe"); Programador.setApellido("Gmez"); Programador ProgramadorDos = new Programador("Pepe"); ProgramadorDos.setApellido("Pillos"); System.out.println("Programador 1 ->\t"+Programador.getNombre()); System.out.println("Programador 2 ->\t"+ProgramadorDos.getNombre()); Nombre()); }}

Variables y mtodos en las subclases


Las subclases heredan el estado (propiedades) y el comportamiento (mtodos) de d la superclase. Sin embargo, las subclases no estn limitadas al estado y comportamiento de la superclases. Las subclases pueden aadir variables y mtodos que las diferenciaran de las otras subclases. Adems, las subclases pueden sobrescribir los mtodos que heredan de la superclases, superclases si lo necesitan, para especializar ms su funcionalidad. Para sobrescribir un mtodo basta bast con definir en la subclase uno que se llame igual, tenga el mismo tipo de retorno y la misma lista de parmetros.

Clases y Mtodos finales


Las clases que son declaradas como finales no pueden ser derivadas. Los mtodos que son declarados como finales, finales, no pueden ser sobrescritos por las subclases.

Clases abstractas
Pgina
Una clase abstracta es una clase que ha dejado alguno de sus mtodos definido pero no lo ha implementado. La definicin de un mtodo consiste en especificar su nombre, el tipo de retorno y los argumentos de entrada.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

51

public abstract class Empleado{ // variables que heredarn las subclases. //Mtodos comunes que s se implementan en la clase abstracta. //Mtodos abstractos que debern implementar las subclases. // Estamos obligando a que todos los empleados // tengan vacaciones y pagas public abstract void Vacaciones(); public abstract void pagas(); } Otros mtodos si pueden estar implementados. Si una clase tiene un mtodo abstracto, ella tambin tiene que ser ser declarada abstracta. De una clase abstracta no se pueden crear objetos porque el compilador no sabra qu hacer con los mtodos que no estn implementados. Por eso no tiene sentido el constructor. Las clases abstractas no pueden tener mtodos estticos porque hemos visto que estos quedan tal cual en el proceso de herencia y no son sobrescritos. El compilador no da error. No tiene sentido declarar variables privadas en una clase abstracta porque no se podrn usar nunca.

Paquetes
ablecer seguridad, o simplemente cuando el nmero de clases que aparecen Cuando se necesita establecer es muy grande, resulta necesario organizarlas de alguna manera que no sea el puro azar. Java utiliza para ello los paquetes. Un paquete es un conjunto de clases e interfaces relacionados relacion que proporcionan proteccin en el acceso y gestin de nombres. Las clases se agrupan en paquetes por varios motivos: Los programadores pueden determinar fcilmente que clases e interfaces estn relacionados. Se facilita la bsqueda de una clase determinada. det Se evitan conflictos con los nombres de las clases. Se pueden establecer restricciones de seguridad

Sintaxis
Para decirle al compilador que una clase o un interface pertenece a un paquete en concreto, basta con indicarlo al comienzo mediante la sentencia package.

package Empleados
En este ejemplo agrupamos las clases empleado y programador en un paquete llamado empleados. package empleado; public class Empleado { .. } package empleado;

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

52

public class Programador extends Empleado{ }

Modificadores de acceso
Mtodo Propiedad Clase

de instancia (no static).

- Cada objeto creado de - Para poder invocar al una clase tiene su mtodo es necesario - No tiene sentido. propia copia de la crear objeto. propiedad. - Todos los objetos - Se puede invocar al creados a partir de la mtodo a travs del clase comparten las - No se puede usar. nombre de la clase. propiedades declaradas as. - El mtodo puede ser - La variable puede - Se puede extender por sobre escrito en el modificar su valor. herencia dicha clase. proceso de herencia. - El mtodo no puede - La variable es una - La clase no se puede ser sobrescrito en el constante y su valor no extender ms por proceso de herencia. puede ser modificado. herencia. - El acceso al mtodo - El acceso a la variable slo se puede realizar slo se puede realizar - No se puede usar. desde la propia clase. desde la propia clase. - El acceso al mtodo slo se puede realizar desde las clases que se encuentren en el paquete. - El acceso al mtodo se puede realizar desde cualquier otra clase independientemente del paquete en el que se encuentre. El acceso a la propiedad slo se puede realizar desde las clases - No se puede usar. que se encuentre en el paquete. El acceso a la propiedad se puede realizar desde cualquier - El que debe aplicarse otra clase sobre la clase. independientemente del paquete en el que se encuentre. - Se aplica sobre las clases que tienen alguno de sus miembros abstractos.

static

no final

final

private

protected

public

abstract

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

- Este mtodo no tiene cuerpo y deber ser - No est permitido. implementado en las subclases.

53

Interfaces
Un interface declara lo mtodos de una clase sin implementarlos (nombres de mtodos, listas de argumentos, tipos de retorno) los cuales sern implementados por otra clase. La diferencia entre una interface y una clase abstracta es que la interface es simplemente simplem una lista de mtodos no implementados, adems puede incluir la declaracin de constantes. Una clase abstracta puede incluir mtodos implementados y no implementados o abstractos, miembros dato constantes y otros no constantes. Una clase solamente puede e derivar extends de una clase base, pero puede implementar varios interfaces. Los nombres de los interfaces se colocan separados por una coma despus de la palabra reservada implements.

Creacin interface
En este ejemplo creamos una interface con los mtodos que queremos que se implementen. interface InterfazCoche{ public void montar(); public void comenzar(); public void bajar(); public int verVMaxima(); public void cambiarVMaxima(int VMAXIMA); public void bajar(); public void usar() throws IOException; IOExcepti public void menu(); }

Implementacin de la interface
Si una clase quiere implementar un interface debe usar la palabra clave implements. Si queremos heredar e implementar al mismo tiempo, debemos colocar primero extends seguido del nombre de la clase y a continuacin implements seguido del nombre de la clase. Sintaxis: public class NombreClase extends SuperClase implements Interfaz1, Interfaz2,... { //Cuerpo de la clase } Ejemplo: public abstract class Conductor implements InterfazCoches{ .. }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

54

Unidad 7: Caractersticas avanzadas de clases


Introduccin
En java podemos realizar operaciones muy complejas con clases. Podremos realizar acciones ms all de los conceptos bsicos en el diseo de las clases.

this y super
Java incluye un valor de referencia especial llamado this, que se utiliza dentro de cualquier mtodo para referirse al objeto actual. El valor this se refiere al objeto sobre el que ha sido llamado el mtodo actual. Se puede utilizar this siempre que se requiera una referencia a un u objeto del tipo de una clase actual. Si hay dos objetos que utilicen el mismo cdigo, seleccionados a travs de otras instancias, cada uno tiene su propio valor nico de this. Un ejemplo muy habitual es construir un objeto y que este llame a otro constructor. constru

Facturar() { this( 23, Pepe ); }


La palabra reservada super sirve para indicar que una variable o un mtodo es de la superclase. Es decir, que si queremos hacer referencia a una variable o mtodo de la clase que heredamos utilizaremos super. En el siguiente ejemplo vemos como podemos imprimir el valor de la edad del padre y el valor de la edad del hijo:

class Clase1 { int edad; void asignarValor() { edad = 35; } } class Clase2 extends Clase1 { int edad; void asignarValor() { edad = 5; super.asignarValor();

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

55

System.out.println("La variable de la clase actual es " + edad); System.out.println("LEl valor de la variable de la superclase es: " + super.edad); } }
En el siguiente ejemplo tambin podemos apreciar como llamamos llamamos al constructor de la superclase B imprimiendo en pantalla el valor 43.

class A { public String toString() { return "4"; } } class B extends A { public String toString() { return super.toString() + "3"; } } public class Prueba { public static void main(String[] args) { System.out.println(new B()); } }

Destruccin de objetos
La destruccin de los objetos
La destruccin de un objeto se le denomina a la accin que realizamos al destruir un objeto que se deja de utilizar, siempre que un objeto se deja de utilizar el espacio de memoria que utiliza se debe liberar. En aplicaciones Java se puede destruir un objeto objeto de forma automtica o bien personalizada.

Destruccin automtica
En el lenguaje Java no es necesario liberar la memoria reservada, el recolector de basura (garbage collector) se encarga de hacerlo por nosotros, liberando al programador de una de las tareas t que ms quebraderos de cabeza le producen, olvidarse de liberar la memoria reservada. El recolector de basura se encargar de liberar una zona de memoria dinmica que haba sido reservada mediante el operador new, cuando el objeto ya no va a ser utilizado uti ms durante el programa. El sistema de recogida de basura se ejecuta peridicamente, buscando objetos que ya no estn referenciados.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

56

Podramos forzar la ejecucin del recolector de basura para decidir nosotros que lo haga en un determinado momento mediante el mtodo gc de la clase System. System.gc();

Destruccin personalizada
El mtodo finalize es llamado justo antes que el Garbage Collector libere la memoria. En este instante se puede aprovechar para realizar otras operaciones. class Prueba{ Prueba() { // Constructor // Reserva del recurso no Java o recurso compartido } protected void finalize() { // Liberacin del recurso no Java o recurso compartido } } El intrprete de Java llama al mtodo finalize(), si existe cuando vaya a reclamar el espacio de ese objeto, mediante la recogida de basura. Debe observarse que el mtodo finalize() es de tipo protected void y por lo tanto deber siempre lo debemos sobrescribir de la misma manera.

Crear y usar tipos enumerados


Los tipos pos enumerados se incorporaron con la versin 1.5 de java y sirven para restringir la seleccin de valores a algunos previamente definidos. Un ejemplo sera una aplicacin licacin java donde queramos crear jugadores de ftbol. Si queremos que las posiciones de los jugadores sean exclusivamente: PORTERO, DEFENSA, CENTROCAMPISTA y DELANTERO podramos crear un enumerado como el siguiente: import java.util.*; class Enumerados { static public enum posicion{ PORTERO,DEFENSA, CENTROCAMPISTA,DELANTERO }; public static void main(String [] params) { posicion actual = posicion.DEFENSA;

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

57

System.out.println("La posicion es: " + actual ); } }

Importaciones estticas
Las importaciones estticas nos permiten llamar a un mtodo o propiedad esttica sin necesidad de hacer referencia al nombre de su clase. Para acceder a atributos de clase es necesario hacer referencia a la clase en la que se definen. La importacin esttica ha a de usarse cuando sea necesario acceder frecuentemente a atributos de clase (estticos).

Sintaxis
Un solo mtodo o propiedad import static paquete. NombreClase.metodo_o_propiedad_static; Todos los elementos estticos de la clase import static paquete.NombreClase.*;

Ejemplo
El siguiente ejemplo podemos apreciar como no es necesario acceder a las variables estticas predicindolas del nombre de la clase. Supongamos que tenemos una clase llamada Jugador con tres propiedades: nombre, nombre edad y posicin. package ejemplos; class Jugador{ public static String nombre = "Casillas"; public static int edad= 29; public static String posicion= "PORTERO"; } Ahora crearemos una clase llamada impresin que nos permita acceder a los miembros estticos estti de esta clase. import static ejemplos.Jugador.*; public class Impresion{ public Impresion(){ nombre+=" ,Iker"; System.out.println(nombre); } public static void main(String[] args) { new Impresion(); } }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

58

No ha sido necesario acceder a la propiedad nombre anteponiendo el nombre de la clase: Jugador.nombre.

Laboratorio: Clase Objeto cadena


Objetivo
Diseo de clases eficiente

Enunciado
Realizar una clase que contenga algunos mtodos de la clase String, pero esta vez debemos tratarla como un objeto desde otra clase externa. Los mtodos que tendr sern convertirMayusculas, convertirMinusculas, longitud, isNumeric.

Solucin:
CLASE UTILIZARCADENA import java.io.*; public class UtilizarCadena { public static void main(String args[]) { String cad="123a"; CadenaObjeto c=new CadenaObjeto("Hola Mafsundo"); if (c.isNumeric(cad.toCharArray())==true) System.out.println("Es un Numero"); else System.out.println("NO SON Numeros"); System.out.println(c.convertirMayusculas()); System.out.println(c.convertirMinusculas()); } } CLASE CADENAOBJETO import java.lang.*; public class CadenaObjeto { public String palabra;

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

59

public CadenaObjeto(String palabra) { this.palabra=palabra; } public static void menu() { System.out.println(""); System.out.println("1. System.out.println("1.-Convertir a Mayusculas"); System.out.println("2. System.out.println("2.-Longitud"); System.out.println("3. System.out.println("3.-Convertir a Minusculas"); System.out.println("4. System.out.println("4.-Comprobar si son numeros"); System.out.println("5. System.out.println("5.-Salir"); System.out.println(""); stem.out.println(""); } public String convertirMayusculas() { return this.palabra.toUpperCase(); } public String convertirMinusculas() { return this.palabra.toLowerCase(); } public int longitud() { return this.palabra.length(); } public static boolean isNumeric(char letras[]) { int num; try { for (int i=0;i<letras.length;i++) { num=Integer.parseInt(String.valueOf(letras[i])); } return true; } catch (NumberFormatException e) { return false; } }

Ver Video: OrganizandoClases

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

60

Unidad 8: Excepciones y aserciones


Objetivos
Conocer la forma que tiene java de controlar los errores en nuestras aplicaciones. Trabajar con las aserciones de java.

Introduccin
Java implementa excepciones y aserciones con el propsito de conseguir cdigo robusto. En esta unidad veremos los pasos necesarios para poder controlar los posibles errores en nuestra aplicacin en tiempo de diseo y/o programacin. A veces, cuando llamamos os a un mtodo, puede que algo vaya mal dentro del mtodo y no pueda devolvernos un resultado. Por ejemplo, puede que le pasemos parmetros al mtodo que no le gustan, como algn null, algn valor fuera de rango, etc. Es posible que el mtodo quiera acceder accede a un fichero o a una base de datos y tenga problemas porque no existe el fichero, no tiene permisos de lectura, no puede conectarse con la base de datos, etc. Tradicionalmente estos mtodos o funciones, en lenguajes como C, devolvan un valor que se reconoca onoca como no vlido. Poda ser un NULL o ms habitualmente, un -1. 1. Por ejemplo, la funcin open() de C intenta abrir un fichero. Si lo consigue, devuelve un entero que es el descriptor del fichero. Si no lo consigue, devuelve -1. Esta opcin no es la ms s elegante. Muchas veces no podemos devolver un valor para indicar error. Por ejemplo, a la funcin atoi() de C se le pasa una cadena de texto como "123" y devuelve el entero 123. Esta funcin no puede devolver -1 1 para indicar error, puesto que si le pasamos pasam la cadena "-1", 1", debera devolver justamente -1. Por ello, los mtodos en los lenguajes ms modernos como C++ o Java, adems de devolver un valor, pueden "lanzar una excepcin". Por ejemplo, la clase Writer de java, en su mtodo write(), se le pasan unos s bytes para escribir en algn sitio, un fichero por ejemplo. Si hay algn error, "lanza una excepcin" IOException, para indicar que ha habido algn error.

Excepciones
Una excepcin es una condicin que interrumpe el flujo normal de operaciones dentro de un programa. Imagina una excepcin como una condicin de error, un error de programacin inesperado, como una divisin entre cero o un posible error que ocurra en tiempo de ejecucin, como un "disco completo" mientras escribe un archivo. Cuando ocurre una una excepcin, el flujo normal de instrucciones se rompe. En concreto, se lanza la excepcin y el flujo continua en el punto en el que se captur la excepcin. Al arrojarse la excepcin se permite la eliminacin del cdigo controlador de excepciones del flujo flujo regular de operaciones. Si la condicin anormal no se controla adecuadamente, pueden aparecer resultados incorrectos u otras condiciones anormales. El constructor de lenguaje para controlar excepciones en un programa de Java es el bloque trytry catch. Bsicamente, sicamente, las declaraciones que podran arrojar una excepcin se encuentran dentro del

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

61

bloque try. Si se produce una excepcin, se controlar mediante clusulas catch ejecutadas con xito. Si hay varias clusulas catch, se ejecutar el bloque de cdigo para pa el primer tipo de excepcin que concuerde. Este es el aspecto de una estructura try-catch try catch bsica: try { body } catch( ExceptionClassl exceptionvariablel ) { manejador1 } catch ( ExceptionClass2 exceptionvariable2 ) { manejador2 } ExceptionClass1 y ExceptionClass2 del ejemplo anterior seran reemplazadas por los nombres de clase de la excepcin. Las variables exceptionvariable1 y exceptionvariable2 pueden reemplazarse por cualquier nombre de variable vlido, pero no importa el nombre que emplee, cada cad variable es local para su respectivo bloque catch de control de excepciones. El control de flujo en un programa Java puede hacerse mediante las ya conocidas sentencias estructuradas (if, while, return). Pero Java va mucho ms all, mediante una tcnica de programacin denominada gestin de excepciones. Mediante las excepciones se podr evitar repetir continuamente cdigo, en busca de un posible error, y avisar a otros objetos de una condicin anormal de ejecucin durante un programa. Durante este captulo o estudiaremos la gestin de excepciones y errores, sin pretender profundizar demasiado, pero s fijando la base conceptual de lo que este modo de programacin supone. Mediante la gestin de excepciones se prescindir de sentencias de control de errores del de tipo: if ( error == true ) return ERROR;

Tipos de excepciones
Existen dos grandes tipos de excepciones en Java : Checked Exceptions (excepciones controladas). Se corresponden a errores previstos, controlados en el codigo y por tanto permite al sistema recuperarse. Son lo que hemos definido anteriormente como excepciones. El compilador Java es una gran ayuda ya que te obliga a capturarlas en un bloque try - catch - finally o a declarar que el mtodo puede devolver una excepcin (declarando un throws). Unchecked nchecked Exceptions (excepciones no controladas). Son excepciones no previstas ni controladas, y por tanto puede provocar inconsistencia de datos y la finalizacin inesperada del sistema : lo que hemos definido anteriormente como errores en tiempo de ejecucin. ejecucin. En Java se implementan como subclases de java.lang.RuntimeException (que a su vez hereda de java.lang.Exception) y el compilador no nos obliga a capturarlas ni a declarar que nuestros mtodos pueden lanzarlas. NullPointerException o IllegalArgumentException IllegalArgumentException son dos ejemplos de estas excepciones.

Manejo de Excepciones en una arquitectura Java


Al invocar un mtodo deberamos obtener como resultado o bien el resultado normal de la ejecucin o bien no hacer absolutamente nada. Las excepciones nos servirn servirn para comunicar a las capas superiores informacin sobre por qu no se ha hecho nada si fuese necesario.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

62

La utilizacin de bloques try - catch - finally es ms costoso en trminos de tiempo de ejecucin y recursos que la utilizacin de bloques if - else. Por tanto es recomendable utilizar excepciones para controlar el flujo, es mejor utilizar los mecanismos de control de flujo ya existentes que consumen menos y son ms fcilmente mantenibles. Tampoco es recomendable capturar una excepcin en un bloque catch catch y no hacer nada, o no hacer nada ms que lanzarla nuevamente. Es aconsejable que las excepciones no rompan la encapsulacin. Por ejemplo si en una capa inferior se produce una excepcin (por ejemplo una SQLException en la capa de persistencia), a la capa cap superior no le interesa conocer los detalles de implementacin, sino: si se puede recuperar del error, es aconsejable transformar la excepcin original en otra excepcin controlada o checked con la informacin necesaria para recuperar que la capa superiro superir se pueda recuperar. o si no puede recuperarse del error pasamos a la capa superior una excepcin no controlada o unchecked si no se debe continuar el flujo normal, o bien un resultado nulo si no se quiere hacer nada especial. Slo deberamos de crear excepciones propias cuando aporten algo til como informacin extra cuando sean capturadas o comportamientos propios (como un tratamiento especial en un log). Al capturar excepciones tambin capturamos las que heredan de sta. Por tanto al capturar una excepcin epcin del tipo java.lang.Exception tambin estamos capturando todas las unchecked (ya que heredan de java.lang.RuntimeException y sta hereda de java.lang.Exception). Hay que tener cuidado de si esto es realmente lo que queremos.

Jerarqua de clases para el manejo de excepciones en Java

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

63

Clase Throwable
No hay restricciones a lo que la clusula catch de un bloque try-catch try catch puede hacer. Una vez en la clusula catch, sta usar probablemente uno de los siguientes mtodos: getMessage(): Todos los objetos Throwable pueden tener un mensaje de error asociado. Si se invoca este mtodo, devolver el mensaje si encuentra alguno. getLocalizedMessage(): Si el mensaje de error ha sido traducido al idioma del usuario, este mtodo obtiene ene la versin traducida del mensaje. En caso contrario, devuelve lo mismo que getMessage(). printStackTrace(): Este mtodo enva el seguimiento stack a la consola del sistema o a otro punto. Un seguimiento stack es una lista de llamadas de mtodo que conduce cond a la condicin de excepcin. Tambin incluye nmeros de lnea y nombres de archivo, si se encuentran disponibles. El seguimiento stack imprimir el comportamiento predefinido de una excepcin de tiempo de ejecucin cuando no es atrapada de forma explcita explc

try-catch-finally
Cuando ocurre un error en un programa, el cdigo que encuentra el error lanza una excepcin que se puede capturar desde la aplicacin con el propsito de recuperarse de ella. Existen dos modos de tratar las excepciones: No tratarlas rlas de forma detallada dejando a la mquina virtual de Java que realice la tarea que tenga programada por defecto. Esto se realiza mediante la clusula throws.

Tratamiento de la excepcin
No tratando la excepcin public static void main(String args[]) throws IOException,... { Cdigo que puede lanzar las excepciones especificadas; }

Tratando la excepcin
public static void main(String args[]) { try{ Cdigo que puede lanzar las excepciones } catch( Excepcin esperada) { Tratamiento de la excepcin } catch(Otra Excepcion esperada){ Tratamiento de la excepcin } finally{ Cdigo que se ejecuta siempre, aunque se lance la excepcin }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

64

La sentencia finally es opcional.


Ejemplo de excepcin con la sentencia Finally: public class Principal { public static void main(String[] args) { try{ int matriz[]={1,2,3}; for (int i=0; i<4;i++){ System.out.println("Salida"+ matriz[i]); } System.out.println("Despues del for"); System.exit(0); } catch(ArrayIndexOutOfBoundsException rayIndexOutOfBoundsException e) //Asigno la excepcion a la variable e { //Cuando se produzca la excepcion hace esto System.out.println("No hay ms elementos"); } finally{ System.out.println("El Finally se ejecuta siempre"); } } } Se pueden asociar varios catch con un nico try para los casos en el que un mismo cdigo pueda lanzar varias excepciones. Necesidad de conocer las excepciones asociadas a cada clase que utilicemos. Todas las excepciones que se pueden generar, salvo las del del paquete java.lang, sern avisadas por el compilador

Creacin de excepcin propia:


En Java podemos crear una excepcin propia creando una clase que extienda de la clase Exception. En este ejemplo creamos una exception llama OpcionErroneaException que hereda de la clase exception. public class OpcionErroneaException extends Exception{ public OpcionErroneaException(){ } public String mensaje(){ return("OPCION ERRONEA"); } } Podemos crear una clase en Java que lance la excepcin creada por el programador. programador.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

65

public class LeerDatos3{ public static void main(String args[]) throws IOException{ BufferedReader teclado=new BufferedReader(new InputStreamReader(System.in)); String numero=""; String continua=""; try{ do{ System.out.println("Introduzca un numero:"); numero=teclado.readLine(); int num=Integer.parseInt(numero); if (num%2==0){ System.out.println("El numero: "+ num +" es par"); }else{ System.out.println("El numero: "+ num +" es impar"); } System.out.println("Desea continuar (s/n)?"); continua= teclado.readLine(); if(!continua.equals("s") && !continua.equals("n")){ throw new OpcionErroneaException(); } }while (continua.equals("s") inua.equals("s") || continua.equals("S")); //Para compara se pone .equals }catch (NumberFormatException e){ System.out.println("Debe introducir numeros"); }catch (OpcionErroneaException e){ System.out.println(e.mensaje()); teclado.readLine(); } } }

ASERCIONES
Pgina
La tcnica de las aserciones consiste en sembrar el cdigo de chequeos de integridad, de cosas que suponemos, de forma que si algo no es normal, lo detectemos lo antes posible, por s mismo, en vez de tener que estar trazando marcha atrs las causas que han llevado a un fallo.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

66

USO DE LAS ASERCIONES:


Distintas formas de utilizar una asercin: assert dato > 15; afirme dato==x+1; assert Conectar(); Todas estas expresiones deben devolver un boolean. Si la condicin condicin que evaluamos es verdad, la ejecucin contina normalmente, si no se lanza un AssertionError.

ACTIVAR/DESACTIVAR ASERCIONES:
Java no chequea las aserciones salvo que le indiquemos explcitamente que queremos que lo haga: java -ea miPrograma activa las aserciones de mi programa java -da miPrograma las desactiva java -ea:class miPrograma activa las aserciones de mi programa; pero slo en la clase class java -da:class miPrograma desactiva las aserciones de la clase class java -ea:package... miPrograma activa las aserciones de mi programa; pero slo en el paquete package java -da:package... miPrograma desactiva las aserciones del paquete package

EJEMPLO:
public class EjemploAserciones { public static void main(String[] args) { double x= 100.0; double y= x/2; assert x == y*2 : "Traza 1. Error al dividir " + x + " entre 2: " + y; System.out.println("El resultado de n es :"+x); } }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

67

Resultado:

CON ERROR: public class EjemploAserciones { public static void main(String[] args) { double x= 100.0; double y= x/2; assert x == y*3 : "\nTraza nTraza 1. Error al dividir " + x + " entre 2: " + y; System.out.println("El resultado de n es :"+x); } } Resultado:

Ver Video: Excepciones

Unidad 9: API Colecciones y genricos


Introduccin
Como corresponde a un lenguaje tan orientado a objetos, estas clases e interfaces estn estructuradas en una jerarqua. A medida que se va descendiendo a niveles ms especficos aumentan los requerimientos y lo que se le pide a ese objeto que sepa hacer.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

68

Las colecciones en Java de clases e interfaces para guardar colecciones de objetos.

A partir de la versin 5 de Java se implementan los genricos, gracias a los genricos ya no ser necesario io hacer casting de objetos.

Colecciones
En Java las principales interfaces que disponemos para trabajar con colecciones son: Collection, Set, List, Queue y Map. El paquete Java Collections Framework (JCF) Contiene un conjunto de clases e interfaces del paquete java.util para gestionar colecciones de objetos. Collection. Un grupo de elementos individuales, frecuentemente con alguna regla aplicada a ellos. List. Elementos en una secuencia particular. Set. No puede haber duplicados. Coleccin sin duplicados Queue: Coleccin ordenada con extraccin por el principio e insercin por el principio (LIFO) o por el final (FIFO) Map. Un grupo de pares objeto llave-valor. llave valor. Un mapa es tambin llamado un array asociativo. La desventaja principal de un contenedor contenedor es que no trata con tipos desconocidos. Un contenedor toma referencias a Object, por lo que no hay restriccin sobre lo que se coloca en dicho contenedor. Sin embargo se debe hacer un cast para cada elemento del contenedor.

Iteradores
Un iterador es un objeto cuya misin es la de recorrer a travs de una secuencia de objetos y seleccionar cada objeto en esa secuencia sin que el programador pueda conocer o tenga cuidado sobre la estructura subyacente de esa secuencia. Un iterador es llamado un objeto de peso ligero. Los iteradores separan a los algoritmos del tipo especfico de contenedor con el cual un algoritmo puede trabajar. Los iteradores son la parte central para usar algoritmos.

Collection
En este primer ejemplo veremos que cualquiera de de los mtodos podramos utilizarlos con List, Queue o Set ya que extienden de collection pero que pueden incluir alguna restriccin. import java.util.*; public class EjemploColecciones {

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

Collection<String> col1 = new HashSet<String>(); Collection<String> col2 = Arrays.asList("valor1", "valor2"); Collection<String> col3 = Collections.singleton("valor3");

69

public static void main(String[] args) {

// add() y addAll() devuelven true si cambian // la coleccin. Importa en conjuntos if (col1.add("cero")) System.out.println ("col1 modificada"); if (col1.addAll(col2)) System.out.println ("col1 modificada"); // Copiamos usando un copy constructor Collection<String> copia = new ArrayList<String>(col1); col1.remove("cero"); // eliminar un elemento col1.removeAll(col3); l(col3); // eliminar los elementos en e de c col1.retainAll(col2); // elimina de c los que no estn en d col1.clear(); // eliminar todos boolean b =col1.isEmpty(); // b == true int s = col1.size(); // s == 0 // Recuperamos en c la copia b = col1.addAll(copia); // b == true b = col1.contains("cero"); // b == true b = col1.containsAll(col2); // b == true; // Recorremos col1 Iterator<String> iterador = col1.iterator(); while(iterador.hasNext()) System.out.println(iterador.next()); for(Iterator<String> String> i = col1.iterator(); i.hasNext();) System.out.println(i.next()); // Recorremos de col1 for(String word : col1) System.out.println(word); // Las colecciones tienen toString() System.out.println(col1); // Copia en un Array Object[] elementos = col1.toArray(); oArray(); // Obtenemos una copia String[] strings = col1.toArray(new String[col1.size()]); //Sin necesidad de saber el tamao strings = col1.toArray(new String[0]); } } Resultado:

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

70

Los mtodos ms interesantes de una coleccin son: Los elementos de una coleccin pueden pasarse a un array mediante

List
El orden es la caracterstica ms importante de una lista, ya que mantiene elementos en una secuencia particular. Podemos movernos en ambas direcciones de la lista a travs de un ListIterator. List Son muy similares a un array, pero con tamao cambiante. Le diferencia de los conjuntos en que puede haber duplicados. Para construir la lista utilizaremos uno de los tres constructores: Existen dos implementaciones de una es ArrayList. La ventaja ventaja de ArrayList sobre un array es que se puede redimensionar. La principal ventaja es que el tiempo de acceso a un elemento en particular es nfimo. La desventaja es que si queremos eliminar un elemento del principio, o del medio, la clase debe mover todos los que le siguen a la posicin anterior, para cubrir el hueco que deja el elemento. Esto hace que sacar elementos del medio o del principio sea costoso. La segunda implementacin es LinkedList . En sta, los elementos son mantenidos en una serie de nodos atados entre s como eslabones de una cadena. Cada uno de estos nodos apunta a su antecesor y al elemento que le sigue. Esta implementacin de List necesita entonces empezar desde el comienzo, la desventaja es que usar el elemento diez implica realizar diez di movimientos. La ventaja es que es posible eliminar elementos del principio de la lista y del medio de manera muy eficiente. Provee un ptimo acceso secuencial con rapidez de insercin y borrado en medio de la lista. Ejemplo de List:

import java.util.*; public class Main { public static void main(String[] args) { List lista1 = new LinkedList(); lista1.add("Madrid"); lista1.add("Sevilla"); lista1.add("Valencia"); Iterator iterador = lista1.iterator(); while (iterador.hasNext()) { String elemento = (String) iterador.next(); System.out.print(elemento + " "); } List lista2 = new ArrayList(); lista2.add("Madrid"); lista2.add("Sevilla");

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

71

lista2.add("Valencia"); Iterator iterador2 = lista2.iterator(); System.out.println("--LinkedList LinkedList--"); while (iterador2.hasNext()) { String elemento = (String) iterador2.next(); System.out.print(elemento + " "); } System.out.println("--ArrayList ArrayList--"); } }

Set
Coleccin sin duplicados. Cada elemento que se agregue a un conjunto debe ser nico, por lo que todo elemento duplicado no se agregar. No puede haber dos referencias al mismo objeto. Por regla general, cuando se redefine equals(), se debe redefinir hashCode(). Es necesario redefinir hashCode() cuando la clase definida ser colocada en un HashSet. Los mtodos add(o) y addAll(o) devuelven false si o ya estaba en el conjunto

Map
En un mapa se pueden buscar objetos utilizando otro objeto. Tabla que asocia claves a valores. No utiliza la interfaz Collection. Los principales mtodos son: put(), get(), remove() HashMap se basa en una tabla hash, por lo que es preferible utilizar HashMap HashMap en vez de HashTable. TreeMap se basa en una implementacin de rboles rojo-negro. rojo EJEMPLO: import java.util.*; public class Ejemplo { public static void main(String args[]) { // Definir un HashMap HashMap global = new HashMap(); // Insertar valores "key"-"value" "key" al HashMap global.put("Laura", "667895789"); global.put("Pepe", "645895756"); global.put("Abelardo", "55895711"); global.put("Daniel", "667111788"); global.put("Arturo", "667598623"); // Definir Iterator para extraer/imprimir valores for( Iterator it = global.keySet().iterator(); it.hasNext();) {

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

72

String s = (String)it.next(); String s1 = (String)global.get(s); System.out.println("Alumno: "+s + " - " + "Telefono: "+s1); } } }

hashCode()
El cdigo hash es una manera de tomar parte de la informacin de un objeto y convertirla en un entero nico relativo con lo que las bsquedas se pueden hacer con mucha rapidez. Un cdigo hash debe estar basado en el contenido del objeto.

Queue:
Es una coleccin ordenada de elementos con mtodos para extraer elementos del principio de la cola, en orden. A diferencia de List, no hay acceso aleatorio: se extrae por el principio y se inserta por el principio o por el final. El orden de insercin puede ser por el final (FIFO) o por el principio (LIFO o pila). Se permiten elementos duplicados (en Set no) En lugar de elevar excepciones cuando est vaca o llena, Queue proporciona mtodos para interrogar, que devuelven null. l. Por ello no se suele permitir insercin de null como valor BlockingQueue: put()/take() se bloquean hasta que hay espacio/hay elementos. Para aadir elementos add() : en BoundedQueue eleva excepcin si est llena offer() : devuelve false si est llena, no eleva excepcin put() : Es de BlockinQueue y se bloquea si est llena Para extraer elementos remove() : extrae el elemento del principio. Excep. si vaco poll() : como remove() pero si est vaca devuelve ull take() : Es de BlockinQueue y se bloquea si est vaca drainTo() : Es de BlockinQueue: vaca y devuelve coleccin Para consultar sin extraer element() : Devuelve, sin extraerlo, el primer elemento. Excep. si vaca Implementaciones: LinkedList: FIFO sin lmite de capacidad. Permite elementos null. PriorityQueue mantiene ordenados los elementos de menor a mayor peek() : Como element() pero devuelve null si vaca

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

73

En java.util.concurrent hay implementaciones para BlockingQueue

Otras colecciones
singleton(), singletonList(), singletonMap() Devuelven conjunto, unto, lista y mapa inmutables, con un nico elemento. tiles para pasar un elemento a un mtodo que espera una coleccin.

Interface Comparator y Comparable


Para que un objeto sea comparable, su clase debe implementar la interfaz java.lang.Comparable. Esto quiere decir, que si queremos que una lista de objetos - o un conjunto - tenga sus elementos ordenados, y esos objetos son de una clase que hemos hecho, es necesario que nuestra clase implemente la interfaz java.lang.Comparable. Un comparador es una clase lase de apoyo que ser utilizada para los mtodos de ordenamiento. Esto se logra implementando la interfaz java.util.Comparator. Cuando nosotros creamos una clase de algn tipo, podemos especificar el orden natural de los objetos de esa clase cuando se encuentran encuentran en una lista, simplemente implementando el interfaz Comparable que declara el mtodo: int compareTo(Object o) El mtodo compareTo () devuelve un entero con las siguientes caractersticas: Negativo -> > Si thisObject <anotherObject Cero -> Si thisObject Object == anotherObject Positivo -> > Si thisObject> anotherObject Por lo tanto las dos posibles soluciones para comparar Ejemplo: En este ejemplo comparamos cadenas ignorando maysculas y minsculas e imprimiendo lo resultado por orden alfabtico.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

Clase Principal import java.util.*; public class Principal { public static void main(String[] args) { TreeSet ts = new TreeSet(new Comparacion ()); ts.add("Alonso"); ts.add("alonso"); ts.add("Conchi");

74

ts.add("Emilio"); ts.add("Gmez"); ts.add("manuela"); ts.add("Manuela"); System.out.println(ts); } } Clase Comparacion import java.util.*; class Comparacion implements Comparator { public int compare(Object o1, Object o2) { return ((String) o1).compareToIgnoreCase((String) o2); //Compara cadenas ignorando las may/min }}

Ejemplo: En este ejemplo utilizamos la interface Comparable para comprobar objetos iguales.

Clase Principal import java.util.*; public class Principal { public static void main(String[] args) { TreeSet ts = new TreeSet(); ts.add(new Persona("Pepe", "Perez")); ts.add(new Persona("Pipi", "Perez")); ts.add(new Persona("Manolito", "Cascos")); ts.add(new Persona("Pipi", "Perez")); ts.add(new Persona("Sara", "Alonso")); System.out.println(ts); } } Clase Persona import java.util.*; public class Persona implements Comparable { private String Nombre, apellido; public Persona(String Nombre, String apellido) { if (Nombre==null || apellido==null) throw new NullPointerException();//Comprobar los nulos this.Nombre = Nombre;

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

75

this.apellido = apellido; } public String Nombre(){return Nombre;} public String apellido() {return apellido;} public boolean equals(Object o) { if (!(o instanceof Persona)) return false;//mtodo equals retorna false si argumento Persona n = (Persona)o;//no es del tipo adecuado o es nulo return n.Nombre.equals(Nombre) && n.apellido.equals(apellido); } public int hashCode() { return 31*Nombre.hashCode() + apellido.hashCode(); }//hashcode tiene en cuenta ambos campos public String toString() {return Nombre + " " + apellido;} public int compareTo(Object o) { Persona n = (Persona)o;//arroja ClassCastException si argumento no int lastCmp = apellido.compareTo(n.apellido);//es del tipo Name return (lastCmp!=0 ? lastCmp : Nombre.compareTo(n.Nombre)); //primero comparamos los apellidos y si son iguales //los nombres } }

Genricos
Los tipos genricos permiten forzar la seguridad de los tipos, en tiempo de compilacin, en las colecciones (u otras clases y mtodos que utilicen tipos parametrizados). En este ejemplo definimos dos os objetos de tipo String: public class Main { public static void main(String[] args) { List objetos = new ArrayList(); objetos.add(new String("Deportes")); objetos.add(new String("Lectura")); for(int i = 0; i < objetos.size(); i++) { String temp = (String) g) objetos.get (i); System.out.println (temp); } }}

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

76

Sin colecciones genricas tendramos que resolver el ejemplo de la siguiente manera: import java.util.ArrayList; import java.util.List; public class Ejemplo { public static void main(String[] args) { List lista = new ArrayList(); lista.add("Deportes"); String cadena = (String) lista.get(0); System.out.println(cadena); } }

Un una interface).

permite almacenar objetos T o cualquier subtipo subtipo del mismo. (T tambin puede ser

Cuando se utilizan colecciones genricas, no es necesario castear los objetos cuando se obtienen de la misma. Se puede pasar una coleccin genrica como parmetro a un mtodo que toma una coleccin no genrica, rica, pero los resultados pueden ser inesperados. Compilar sin ningn error no es lo mismo que compilar sin ninguna advertencia. Una advertencia de compilacin no es considerado un error de compilacin. La informacin genrica de tipo no existe en tiempo de de ejecucin, es solo para la seguridad de tipos en tiempo de compilacin. Mezclando genricos con cdigo legal se puede compilar correctamente, pero dicho cdigo puede arrojar una excepcin. Las asignaciones polimrficas aplican solo al tipo base, no al parmetro parmetro de tipo genrico: List<Deportes> l = new ArrayList< Deportes >(); // vlido List< Deportes > l = new ArrayList<Futbol>(); // invalido La regla de asignacin polimrfica aplica en cualquier lugar en donde se pueda realizar una asignacin: void foo(List< Deportes > l) { } // no puede tomar un argumento List< Futbol > List< Deportes > bar() { } // no puede devolver un List< Futbol > La sintaxis comodn permite a un mtodo genrico, aceptar subtipos (o supertipos) de un tipo declarado como argumento de mtodo: List<? extends Deportes > Cuando se utiliza un comodin <? extends Futbol>, la coleccin puede ser accedida pero no modificada. Cuando se utiliza el comodin List<?>, cualquier tipo genrico puede ser asignado a la referencia, pero solo para acceso, no para modificaciones. List<?> es igual a List<? extends Object>.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

77

Las convenciones de declaracin utilizan la letra T para tipos y E para elementos de una coleccin. Se puede utilizar ms de un tipo parametrizado en una declaracin. Se puede declarar un tipo genrico utilizando un tipo que no est definido en la clase: public <T> void makeList(T t) { } Por convencin los tipos parametrizados son letras solitarias maysculas, sin esta convencin sera difcil leer el cdigo y decir la diferencia diferencia entre una variable parametrizada y una clase ordinaria o un nombre de una interface. E Elemento (Usado extensivamente en las colecciones en java) K Key N Number T Type V Value S, U, V etc. 2nd, 3rd, 4th types Ejemplo de convenciones: import java.util.*; public class Principal<T> { private T t; public void add(T t) { this.t = t; } public T get() { return t; } public <U> void inspeccion (U u) { System.out.println("T: " + t.getClass().getName()); System.out.println("U: " + u.getClass().getName()); u.getClass().g } public static void main(String[] args) { Principal<Integer> integerBox = new Principal<Integer>(); integerBox.add(new Integer(10)); integerBox.inspeccion("una cadena de texto"); } }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

78

Unidad 10 : Principios bsicos de E/S


Introduccin
En java todas las operaciones que constituyen un flujo de informacin del programa se les denomina Entrada/Salida. Siempre que hablemos de E/S podemos estar haciendo referencia a la E/S por teclado desde el equipo de un usuario o a la E/S a travs de ficheros. ficheros El paquete en java encargado del tratamiento de los datos de E/S es el java.io. Gracias a este paquete podremos hacer referencia a todas las clases relacionadas con E/S de informacin.

Argumentos de la lnea de comandos


Para copilar un programa en Java utilizamos el comando javac seguido del nombre del archivo java que queremos compilar. Al ejecutar un programa en la ventana de comandos el programador deber utilizar el comando java. Este comando puede tener argumentos como se explica en el siguiente siguiente ejemplo: java Miprograma Pepe Riesgo 25

Los argumentos "Pepe", "Riesgo" y "25" se reciben en un Array de strings en el main: public static void main(String[] args) { ... }

args[0] es "Pepe" args[1] es "Riesgo" args[2] es "25" El siguiente ejemplo imprime en pantalla los parmetros que enviamos al ejecutar el programa. Java impresiones Madrid Valencia Sevilla El cdigo de impresiones.java es: public class impresiones { public static void main (String[] args) { for (int i=0; <args.length; i++) System.out.println(Parametros: +args[i]); } }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

79

Propiedades del d Sistema


En ocasiones es importante conocer las caractersticas del sistema donde ejecutamos nuestros programas para evaluar el rendimiento que ste pueda tener o simplemente para propsitos informativos. La clase System del paquete java.lang nos permite hacer uso del mtodo getProperty paraobtener la siguiente informacin: java.version : java.vendor : java.home: os.name: os.arch: os.version: user.name : user.home : java.vm.name: java.vm.version: Versin del entorno de desarrollo de Java Ja (JRE). Nombre de la distribucin del JRE. Directorio de instalacin de la mquina virtual. Nombre del sistema operativo. Arquitectura del sistema operativo. Versin del sistema operativo. Nombre de usuario del sistema. Ruta del directorio del usuario del sistema. Nombre ombre de la mquina virtual instalada. Versin de la mquina virtual v instalada.

El siguiente ejemplo mostrar informacin de nuestra mquina con WindAows 2003

public class Ejemplo { public static void main(String[] args) throws IOException{ String propSO = "Nombre: " + System.getProperty("os.name"); propSO += System.getProperty("line.separator") + "Version: " + System.getProperty("os.version"); propSO += System.getProperty("line.separator") + "Arquitectura: " + System.getProperty("os.arch"); propSO += System.getProperty("line.separator") + "Directorio Temporal: Temporal: " + System.getProperty("java.io.tmpdir"); propSO += System.getProperty("line.separator") + "Separador de Ficheros: " + System.getProperty("file.separator"); propSO += System.getProperty("line.separator") + "Separador de Path: " + System.getProperty("path.separator");; .separator");; propSO += System.getProperty("line.separator") + "Usuario: " + System.getProperty("user.name"); System.out.println(propSO); } }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

80

CLASE PROPERTIES
La clase Properties permite manejar el conjunto de propiedades de un programa. Las clase Properties rties representa un conjunto de propiedades persistentes. La clase Properties es una tipo especial de tabla hash con las siguientes caractersticas:

La clave y el valor de la tabla son strings La tabla puede ser grabada y recuperada de un stream con slo una operacin Valores por defecto pueden ser definidos en una tabla secundaria Debido a que Properties hereda de Hashtable , los mtodos put y putAll se pueden aplicar a un objeto Properties .

Mtodos de la clase Properties


getProperty ( String key): Devuelve un string con el valor de la clave especificada. setProperty ( String key): Devuelve un string con el valor de la clave especificada. propertyNames ():Returns an enumeration of all the keys in this property list, including distinct keys in the_ default property list if a key of the same name has not already been found from the main properties list._ Devuelve una enumeracin de todas las claves del archivo de propiedades.

Creacin de archivo de propiedades


Siempre un archivo de propiedades lo lo guardaremos con extensin .PROPERTIES, .XML, .CONFIG o un .TXT, ya que es la mejor forma de reconocerlos. Guardaremos en C:\configuracion.properties configuracion.properties la siguiente informacin: # Nombre del servidor servidor.nombre=PC9915 # Usuario para la conexin servidor.usuario=Pepe # Password para la conexin servidor.password=poijasfr

Recuperacin de la informacin de un archivo de propiedades


Para poder hacer uso del archivo de propiedades recurriremos a la clase Properties del paquete java.util. Una vez instanciada esta clase podremos acceder a las claves y valores del fichero de propiedades accediendo por el nombre de la clave, o bien recorrer todas las claves si no conocemos el nombre de la misma. import java.io.*;

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

81

import java.util.*; public class Ejemplo { public static void main(String[] args) throws IOException{ Properties prop = new Properties(); InputStream is = null; try { is=new FileInputStream("c:\\configuracion.properties"); configuracion.properties"); prop.load(is); } catch(IOException e) { System.out.println(e.toString()); } // Acceder a las propiedades por su nombre System.out.println("Propiedades por nombre:"); System.out.println("---------------------------------------------"); System.out.println(prop.getProperty("servidor.nombre")); System.out.println(prop.getProperty("ser System.out.println(prop.getProperty("servidor.password")); System.out.println(prop.getProperty("servidor.usuario")); // Recorrer todas sin conocer los nombres de las propiedades System.out.println("Recorrer todas las propiedades:"); System.out.println("-------------------------------------------------------------"); for (Enumeration e = prop.keys(); e.hasMoreElements() ; ) { // Obtenemos el objeto Object obj = e.nextElement(); System.out.println(obj + ": " + prop.getProperty(obj.toString())); } } }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

82

FICHEROS
Dispositivos de soporte magntico que se utilizan para guardar informacin de forma persistente de los programas java. La informacin dentro de un fichero se guarda: Por campos: Son cada una de las variables miembro Por registros: Son cada uno de los objetos

Existen cuatro operaciones bsicas para trabajar con ficheros: Apertura del fichero Lectura de la informacin Escritura sobre el fichero Cierre del fichero.

El trabajo con ficheros se realiza a travs de flujos. Los flujos son clases de java que proporcionan los mecanismos necesarios para el intercambio de informacin entre objetos. Esta informacin puede estar codificada de dos formas: Byte Caracteres

CLASES DEL PAQUETE IO


CLASE READER Clase base que permite la lectura de la informacin de cualquier soporte de caracteres. CLASE WRITER Clase e base que permite la escritura de la informacin en cualquier soporte de caracteres. CLASE INPUTSTREAM Clase base que permite leer la informacin de cualquier objeto en bytes CLASE OUTPUTSTREAM Clase base que permite escribir la informacin de cualquier objeto o en bytes

TIPOS DE FICHEROS
Ficheros secuenciales: Se caracterizan por manejar informacin de distinta longitud. En un operacin de lectura inicialmente se lee todo el contenido del fichero de principio a fin, la escritura se puede hacer al principio o al final del fichero.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

83

Ficheros aleatorios o de registro: Se caracterizan por manejar informacin que tiene la misma longitud. Las operaciones de lectura y/o escritura se pueden realizar en cualquier parte del fichero.

Ficheros secuenciales
CLASE FILE
Se utiliza para manipular ficheros y/o carpetas que pueden o no existir dentro del sistema de archivos. Constructores: File(String, String): Crea un objeto de la clase que es un fichero. Se encuentra en la ruta que se indica en el primer argumento y cuyo nombre se pasa como segundo argumento. File(File, String): Crea un objeto de la clase que es un fichero. El path se indica en el objeto File que se pasa en el primer argumento y cuyo nombre se pasa como cadena en el segundo argumento. File(String): Crea un objeto de la clase que es un fichero. La ruta o nombre se pasa como argumento.

Cuando se crea un objeto de la clase File el fichero no se crea directamente en el sistema, para que se cree hay dos mtodos: Utilizando la funcin createNewFile(). Escribir al l menos un byte de informacin.

EJEMPLOS: - File carpeta= new File(C:\\Ejemplos) Ejemplos) Crea una carpeta ejemplos dentro de la unidad C. - File archivo= new File(carpeta,Ejemplo1.txt) Crea un fichero llamado ejemplo1 dentro de c:\Ejemplos. c: - File archivo2 = new File(C:\\Ejemplos,Ejemplo2.txt) Ejemplos,Ejemplo2.txt) Crea un fichero llamado ejemplo2 dentro de c:\Ejemplos. c: - File archivo3= new File(C:\\Ejemplos Ejemplos\\Ejemplo2.txt) Crea un fichero llamado ejemplo2 dentro de c:\Ejemplos. c: - File carpeta= new File(Ejemplos) Al no poner r ruta crea la carpeta donde se est ejecutando la aplicacin. - File archivo3= new File(Ejemplo3.txt) Al no poner ruta crea el fichero donde se est ejecutando la aplicacin.

canRead(): Boolean. True si se puede hacer una operacin de lectura en un fichero o carpeta. canWrite(): Boolean. True si se puede hacer una operacin de escritura en un fichero o carpeta. canNewFile(): Permite crear en el sistema un fichero o carpeta que inicialmente est vacio.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

84

Mtodos:

delete(): Boolean. Se utiliza para eliminar un fichero o carpeta. Devuelve true si se puede eliminar. deleteOnExit(): Permite eliminar un fichero o carpeta al finalizar la aplicacin. equals(): Boolean.True si son iguales los ficheros que se comparan. exists(): Boolean. True si el fichero o carpeta existe. getAbsolutePath(): Devuelve una cadena indicando la ruta completa donde se encuentra el archivo o carpeta. getName(): Indica el nombre del fichero o carpeta. isDirectory(): Devuelve true cuando el objeto File es una carpeta. isFile(): Devuelve true e cuando el objeto File es un fichero. isHidden(): Devuelve true cuando el objeto File est oculto. length(): Devuelve la longitud del fichero en bytes. list(): Devuelve una matriz de tipo string con el nombre de todos los archivos y carpetas que haya dentro de otra carpeta. mkdir(): Crear una carpeta. Devuelve true si se puede crear. En el caso de que la carpeta este dentro de un path absoluto que no exista en el sistema, solo crea la primera carpeta. mkdirs(): Crear una carpeta. Devuelve true si se puede crear. En el caso de que la carpeta este dentro de un path absoluto que no exista en el sistema, se crea de manera completa. Ejemplo: Con mkdir C:\Nueva\Ejemplo Ejemplo solo creara Nueva y com mkdirs nueva y ejemplo. renameTo(): Permite cambiar el nombre de un fichero fichero o carpeta por el del objeto que se pasa como argumento. Devuelve true si lo ha cambiado. setReadOnly(): Para establecer un fichero o carpeta de solo lectura.

Constantes: pathSeparator: Devuelve un string indicando el carcter que se utiliza dentro del sistema para separar cada una de las cadenas de la variable path. En Windows es ;. pathSeparatorChar: Idem del anterior pero lo devuelve como carcter. separator: Devuelve un string indicando el carcter que se utiliza dentro del sistema para establecer la ruta a los recursos. En Windows es \. separatorChar: Idem del anterior pero lo devuelve como carcter.

En el siguiente ejemplo mostramos todos los ficheros exe que tenemos en la carpeta trabajos. import java.io.*; public class FicherosExe { public static void main(String args[]){ //separador alamacena el tipo de separador utilizado en la plataforma, en windows \ String separador= File.separator; //En carpeta almaceno el path de la carpeta que quiero mirar sus subelementos File carpeta= new File("c:" +separador+ "Trabajos");

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

85

//En elementos almaceno la matriz con todos los nombres de los archivos y carpetas dentro_ de la carpeta que le indiqu String[] elementos=carpeta.list(); //Mostramos el nmero de carpetas dentro de la que le dije di System.out.println("Los ficheros .exe son:\n"); son: for (int i=0;i<elementos.length;i++){ if (elementos[i].endsWith("exe") || elementos[i].endsWith("EXE")){ System.out.println("\t"+carpeta.getAbsolutePath()+_ t"+carpeta.getAbsolutePath()+_ separador+elementos[i]); } } } }

Laboratorio: Uso de la clase File


Objetivo
Utilizar las propiedades y mtodos ms interesantes de la clase File.

Enunciado
Crear en la unidad c de vuestra mquina una carpeta con el nombre TrabajosCurso. Desarrollar una clase que nos permita recorrer y mostrar el nmero de ficheros que tenemos en esta carpeta.

Solucin
import java.io.*; public class NumeroFicheros {

public static void main(String args[]){ String separador= File.separator; //En carpeta almaceno el path de la carpeta carpeta que quiero mirar sus subelementos File carpeta= new File("c:" +separador+ "TrabajosCurso"); //En elementos almaceno la matriz con todos los nombres de los archivos y_ carpetas dentro de la carpeta que le indiqu String[] elementos=carpeta.list(); //Mostramos el numero de carpetas dentro de la que le dije System.out.println("La carpeta " + carpeta.getAbsolutePath() +_ " tiene "+ elementos.length + " subelementos");

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

86

} }

CLASE FILEOUTPUTSTREAM
Se utiliza para escribir informacin en formato byte. Constructores: FileOutputStream(String): Abre un flujo de escritura al fichero cuyo path y/o nombre se pasa como argumento. El path puede ser absoluto o relativo. En el caso de que el fichero no exista lo crea automticamente icamente y en el caso de que exista lo sobrescribe. FileOutputStream (File): Abre un flujo de escritura al fichero creado previamente que se pasa en el objeto File como argumento. En el caso de que el fichero no exista lo crea automticamente y en el caso de que exista lo sobrescribe. FileOutputStream (String,boolean): Abre un flujo de escritura al fichero cuyo path y/o nombre se pasa como primer argumento. En el caso de que el fichero no exista lo crea automticamente y en el caso de que exista si el segundo do argumento es true aade, y si es falso sobrescribe. Los tres constructores propagan una excepcin IOException. Mtodos: void write(byte[],int,int): El primer argumento es una matriz de tipo byte con la informacin que se va a escribir en el fichero, el l segundo argumento es la posicin dentro de la matriz a partir de la cual voy a escribir en el fichero y el tercero y ltimo es el nmero de byte de la matriz que se van a escribir. void close(): Cierra el flujo de escritura a un fichero. Si el flujo de escritura no se cierra, la informacin del fichero no se escribe y puede perder su contenido.

CLASE FILEINPUTSTREAM
Se utiliza para abrir un flujo de lectura en byte asociado a un fichero. Constructores: FileInputStream(String): Crea un objeto, flujo de lectura en bytes asociado a un fichero. Este constructor propaga la excepcin FileNotFoundException(se genera cuando el fichero al que se va a asociar el flujo no existe o no est disponible). FileInputStream (File): Crea un objeto que permite la lectura en bytes del fichero que se pasa como objeto file en el argumento.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

87

Mtodos: int read(byte[],int,int): El primer argumento es una matriz de tipo byte con la informacin leida del fichero, el segundo argumento es la posicin dentro de la matriz a partir de la cual voy a leer y el tercero y ltimo es el nmero de byte de la matriz que se van a leer. Devuelve el nmero de byte leidos por del fichero. Propaga excepcin IOException. void close(): Cierra el flujo de lectura a un fichero. Si el flujo de lectura lectura no se cierra, para el resto de lecturas que queramos hacer el fichero aparecer vacio. El siguiente ejemplo nos permite abrir un fichero mediante la clase FileOutputStream y escribir en el fichero llamado Nombres.dat. import java.io.*; public class Escribir_fich{ static FileOutputStream fescritura; public static void main (String[] args){ String nombre="PEPE SANCHEZ"; try{ File carpeta=new File("ficheros"); if(!carpeta.exists()){ carpeta.mkdir(); } File archivo= new File (carpeta,"Nombres.dat"); fescritura= new FileOutputStream(archivo); }catch (IOException ioe){ System.out.println("ERROR GRAVE EN EL SISTEMA DE E/S EN EL ACCESO"); } try{ fescritura.write(nombre.getBytes(),0,nombre.length()); fescritura.write(nombre.getBytes(),0,nom bre.length()); System.out.println("SE HA ESCRITO EN EL FICHERO"); }catch (IOException ioe){ System.out.println("ERROR DE ENTRADA SALIDA DE DATOS"); }finally{ if(fescritura !=null){ try{

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

88

fescritura.close(); }catch (IOException ioe){ System.out.println("ERROR GRAVE DE E/S DE DATOS"); } } } } } El siguiente ejemplo nos permite abrir un fichero mediante la clase FileInputStream y leer en el fichero llamado Nombres.dat. import java.io.*; public class Leer_fich{ static FileInputStream flectura; static File archivo; public static void main (String[] args){ try{ archivo = new File("Ficheros"+ File.separator + "Nombres.dat"); flectura=new FileInputStream( archivo ); }catch (FileNotFoundException e){ System.out.println("ERROR GRAVE: El fichero " + archivo.getAbsolutePath()+ _ "no esta disponible"); return; } try{ byte[] matriz = new byte[ (byte) archivo.length()] ; int leidos = flectura.read(matriz,0,matriz.length); System.out.println(new String (matriz,0, leidos)); }catch (IOException ioe){ System.out.println("ERROR DE ENTRADA SALIDA DE DATOS"); }finally{ if (flectura!=null){ try{ flectura.close(); }catch (IOException ioe){ System.out.println("ERROR .println("ERROR GRAVE DE E/S DE DATOS"); } } } } }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

89

Laboratorio: Uso de las clases FileOutputStream y FileInputStream


Objetivo
Aprender a escribir y leer sobre ficheros.

Enunciado
Crear un men como el que se muestra en la imagen. ---------------------------------------------------1.- ESCRITURA EN FICHERO 2.- LECTURA EN FICHERO 3.- SALIR ---------------------------------------------------Introduce una opcion: Podremos escribir en un fichero elegido un texto texto y posteriormente recuperar el contenido escrito en el fichero. INTRODUCE EL NOMBRE DEL FICHERO DONDE ESCRIBIR: datos.txt INTRODUCE TEXTO EN EL FICHERO: Hola ---------------------------------------------------1.- ESCRITURA EN FICHERO 2.- LECTURA EN FICHERO 3.- SALIR ---------------------------------------------------Introduce una opcion: 2 INTRODUCE EL NOMBRE DEL FICHERO A LEER: datos.txt EL CONTENIDO DEL FICHERO datos.txt es: Hola

Solucin:
class Trabajar_Ficheros{ static File archivo; //Para trabajar con el fichero con el que voy a escribir o del que voy a leer

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

90

import java.io.*;

static FileOutputStream fescritura; static FileInputStream flectura; public static void main (String [] args) throws IOException{ int opc= Integer.MIN_VALUE; boolean agregar = false ; //para saber cuando hay que aadir o sobreescribir do{ System.out.println("---------------------------------------------------System.out.println("---------------------------------------------------"); System.out.println("\t1.- ESCRITURA EN FICHERO"); System.out.println(" System.out.println(" System.out.println("\t2.LECTURA EN FICHERO"); System.out.println(" System.out.println("\t3.SALIR"); System.out.println("---------------------------------------------------System.out.println("---------------------------------------------------\n"); do{ System.out.print("Introduce una opcion: "); opc = Integer.parseInt( new BufferedReader (new InputStreamReader _ (System.in)).readLine().trim()); }while (opc==Integer.MIN_VALUE); if (opc==1){ System.out.print("\n n INTRODUCE EL NOMBRE DEL FICHERO DONDE _ ESCRIBIR: "); String fichero = new BufferedReader (new InputStreamReader Inp (System.in))_ .readLine().trim(); archivo = new File (fichero); if (archivo.exists()){ System.out.println("\n n EL FICHERO YA EXISTE. QUIERE _ SOBREESCRIBIRLO (S)I (N)O?"); String resp= new BufferedReader (new InputStreamReader Reader (System.in))._ readLine().trim(); if (resp.compareToIgnoreCase("S")==0) { agregar = false; }else{ agregar = true; } } System.out.println ("\nINTRODUCE nINTRODUCE TEXTO EN EL FICHERO:");

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

91

String cadena = new BufferedReader (new InputStreamReader _ (System.in)).readLine().trim(); cadena = cadena +"\n"; byte[] matriz = cadena.getBytes(); try{ fescritura = new FileOutputStream (archivo.getName(),agregar); fescritura.write(matriz,0,matriz.length); ngth); }catch (IOException e){ System.out.println("No se ha podido escribir la informacin en el fichero "+ _ archivo.getName()); }finally{ try{ if(fescritura!=null){ fescritura.close(); } }catch(IOException e){ System.out.println("No se ha podido cerrar correctamente _ el flujo de escritura asociado al fichero "+ archivo.getName()); } } }else if (opc ==2){

System.out.print("\nINTRODUCE nINTRODUCE EL NOMBRE DEL FICHERO A LEER: "); String fichero = new BufferedReader (new InputStreamReader (System.in))._ readLine().trim(); archivo = new File (fichero); //Creo un objeto File asociado a ese nombre byte [] matriz= new byte [(int) archivo.length()]; try{ flectura= new FileInputStream(archivo); putStream(archivo); int leidos = flectura.read(matriz,0,matriz.length); System.out.println("\nEL nEL CONTENIDO DEL FICHERO "+_ archivo.getName()+"\n es: \n"); System.out.println(new String(matriz,0,leidos)); }catch (FileNotFoundException e){ System.out.println("No se ha podido establecer }catch (IOException e){ System.out.println("No se ha podido leer la informacion del fichero "+_ archivo.getName());

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

92

comunicacion con el fichero "+_ archivo.getName());

}finally{ try{ if(flectura!=null){ flectura.close(); } }catch(IOException e){ System.out.println("No se ha podido cerrar correctamente _ el flujo asociado al fichero "+ archivo.getName()); } } } }while(opc!=3); } }

CLASE FILEWRITER
Clase que se utiliza para crear un flujo que te permite escribir informacin que va en caracteres en un fichero. Constructores: FileWriter(File): Crea un objeto que permite escribir en el fichero File que se pasa como argumento. En el caso de que el fichero no exista lo crea automticamente y en el caso de que exista lo sobrescribe. FileWriter (String): Crea un objeto que permite escribir en el fichero cuyo nombre y/o path se pasa en el argumento. En el caso de que el fichero no exista lo crea automticamente y en el caso de que exista lo sobrescribe. FileWriter (String, boolean): Crea un objeto que permite escribir en el fichero cuyo nombre y/o path se pasa en el argumento. En el caso de que el fichero no exista lo crea automticamente y en el caso de que exista lo sobrescribe. Mtodos: void write(char[],int,int): El primer argumento es una matriz de tipo char con la informacin que se va a escribir en el fichero, el segundo argumento es la posicin dentro de la matriz a partir de la cual al voy a escribir en el fichero y el tercero y ltimo es el nmero de byte de la matriz que se van a escribir. void write(String): til para escribir la cadena que se pasa como argumento en el fichero. void close(): Cierra el flujo de escritura a un fichero. Si el flujo de escritura no se cierra, la informacin del fichero no se escribe y puede perder su contenido. Los tres mtodos propagan una excepcin IOException.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

93

CLASE FILEREADER
Clase que se utiliza iliza para crear un flujo que te permite leer informacin que va en caracteres en un fichero. Constructores: FileReader(File): Abre un flujo para leer informacin del fichero que se pasa como objeto file en el argumento. FileReader (String): Crea un objeto to para poder leer del fichero cuyo path y/o nombre se pasa como argumento. Cualquiera de los dos constructores propaga una excepcin de la clase FileNotFoundException. Mtodos: int read(char[],int,int): El primer argumento es una matriz de tipo char en donde se gurda la informacin leda del fichero, el segundo argumento es la posicin dentro de la matriz a partir de la cual voy a escribir en el fichero y el tercero y ltimo es el nmero de caracteres de la matriz que se van a escribir. void close(): Cierra erra el flujo de lectura a un fichero. Si el flujo de escritura no se cierra, la informacin del fichero no se escribe y puede perder su contenido. Los dos mtodos propagan una excepcin IOException.

CLASE DATAOUTPUTSTREAM
Se utiliza para crear flujos de escritura que permiten manejar los tipos primitivos de java y la clase String. Constructor: DataOutputStream(OutputStream): Esta clase OutputStream es una clase abstracta. Es la clase base que se utiliza para crear cualquier flujo de escritura en bytes. Mtodos: void writeUTF(String): Para escribir la cadena que se pasa como argumento. Este formato incluye informacin sobre la longitud exacta de la cadena, nos permite recuperar la cadena con facilidad debido a que conocemos la longitud del fichero. void writeBoolean(boolean): Para escribir la variable de tipo boolean que se pasa como argumento. void writeByte(int): Para escribir como byte el tipo int que se pasa como argumento. void writeDouble(double): Para escribir como byte argumento. el tipo double que se pasa como

void writeShort(int): Para escribir como short el tipo int que se pasa como argumento. void writeInt(int): Para escribir como entero el tipo int que se pasa como argumento. void writeFloat(float): Para escribir como float el tipo float que se pasa como argumento.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

94

void writeChar(char): Para escribir como carcter el tipo entero que se pasa como argumento(el cdigo ASCII del caracter). void close(): Cierra el flujo de escritura a un fichero. Si el flujo de escritura no se cierra, la informacin macin del fichero no se escribe y puede perder su contenido.

El siguiente ejemplo permite escribir con la clase DataOutputStream. import java.io.*; public class Escribir_Fich{ static File archivo; static DataOutputStream flujoescritura; public static atic void main (String[] args){ String respuesta=""; System.out.println("INTRODUCE EL FICHERO DE CLAVES POR TECLADO") ; try{ String nombrefich= new BufferedReader (new InputStreamReader (System.in))._ readLine().trim(); archivo= new File (nombrefich) ; if (archivo.exists()){ System.out.println ("EL FICHERO YA EXISTE DESEA SBOREESCRIBIR (SI/NO)?"); respuesta= new BufferedReader (new InputStreamReader (System.in)).readLine().trim(); } //compareToIgnoreCase es que compare compare sin distinguir mayusculas y minusculas if (respuesta.compareToIgnoreCase("si")==0){ flujoescritura = new DataOutputStream ( new FileOutputStream(nombrefich)); }else{ flujoescritura= new DataOutputStream (new FileOutputStream(nombrefich,true)); } System.out.println ("INTRODUCE EL NOMBRE DE USUARIO POR TECLADO: "); String nombre= new BufferedReader (new InputStreamReader (System.in)).readLine().trim(); System.out.println ("INTRODUCE EL CODIGO DE USUARIO POR TECLADO: "); int codigo = Integer.parseInt(new BufferedReader (new InputStreamReader (System.in))._

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

95

readLine().trim()); flujoescritura.writeInt(codigo); flujoescritura.writeUTF(nombre); }catch (IOException ioe){ System.out.println("NO SE HA PODIDO ESCRIBIR LA System.out.println("NO INFORMACION EN EL FICHERO " + _ archivo.getName()); }finally{ try{ if (flujoescritura!=null){ flujoescritura.close(); } }catch (IOException ioe){ System.out.println("NO SE HA PODIDO CERRAR CORRECTAMENTE EL FLUJO _ DEL FICHERO EL FICHERO " + archivo.getName()); } } } }

CLASE DATAINPUTSTREAM
Para crear un flujo que permite leer informacin y recuperarla directamente comom un tipo primitivo de java, incluyendo la clase String. Constructor: DataInputStream(InputStream): La clase InputStream es una clase abstracta, es la clase base para cualquier tipo de flujo que lea informacin de los tipos primitivos de java, incluyendo la clase String. Mtodos: Tiene los mismos mtodos que la clase anterior: writeUTF readUTF write... read.... ................... Los mtodos propagan una excepcin IOException. Hay una excepcin EOFExeption cuando intentas leer de un fichero que ya no tiene informacin. Para leer la informacin a travs de la clase DataInputStream, obligatoriamente esa informacin tiene que haber sido escrita con DataOutputStream. El orden en que se va escribiendo es el orden en que se va leyendo. El siguiente ejemplo nos permite escribir con la clase DataInputStream. import java.io.*;

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

96

public class Leer_Fich{ static File archivo; static DataInputStream flujolectura; public static void main (String[] args){ System.out.println("INTRODUCE EL FICHERO DE CLAVES POR TECLADO") ; try{ archivo= new File (new BufferedReader (new InputStreamReader (System.in))._ readLine().trim()); flujolectura= new DataInputStream (new FileInputStream(archivo)); //Ojo el orden al leer tiene que ser el mismo que al escribir while (true){ System.out.println ln ("CODIGO DE USUARIO: "+ flujolectura.readInt()); System.out.println ("NOMBRE DE USUARIO: "+ flujolectura.readUTF()); } }catch (FileNotFoundException e){ System.out.println("NO SE HA PODIDO ENCONTRAR EL FICHERO "+_ archivo.getName()); }catch (EOFException e){ }catch (IOException ioe){ System.out.println("NO SE HA PODIDO LEER LA INFORMACION EN EL FICHERO " + _ archivo.getName()); }finally{ try{ if (flujolectura!=null){ flujolectura.close(); } }catch (IOException (IOExcepti ioe){ System.out.println("NO SE HA PODIDO CERRAR CORRECTAMENTE EL _ FLUJO DEL FICHERO " + archivo.getName()); } } }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

97

CLASE OBJECTOUTPUTSTREAM
Flujo que se utiliza para poder escribir objetos de cualquier clase java a cualquier otro objeto. Constructores: ObjectOutputStream(): Para crear un objeto que permite escribir objetos de java sobre cualquier dispositivo. ObjectOutputStream(OutputStream): Crea un flujo que permite escribir objetos de java en el objeto outputstream que se pasa como argumento. Mismos mtodos que DataOutputStream mas: void writeObject(Object): Para escribir a travs del flujo que est asociado al objeto que se pasa como argumento. Propagan la excepcin IOException. Para poder utilizar este flujo los objetos han de de ser PERSISTENTES: Aquel que al ser escrito a travs de un flujo se encarga de almacenar los valores de sus variables miembro. La serializacin es el proceso por el cual un objeto o una coleccin de objetos se convierten en una serie de bytes que pueden ser er almacenados en un fichero y recuperado posteriormente para su uso. Se dice que el objeto u objetos tienen persistencia. Cuando serializamos un objeto, almacenamos la estructura de la clase y todos los objetos referenciados por esta. Los objetos persistentes ntes son aquellos que pertenecen a las clases que implementan la interface serializable, esta interface que pertenece al paquete IO de java no tiene mtodos, nicamente avisa al compilador que los objetos que pertenecen a esa clase se encargan ellos mismos de guardar la informacin que contienen. Si una clase tiene como variable miembro un objeto de otra clase, a su vez debe implementar la interface serializable. La clase ObjectOutputStream permite la escritura de cualquier nmero de objetos a travs del flujo. fl En el caso particular de que el objeto destino sea un fichero, solo va a permitir una operacin de lectura. Si se utilizan flujos de lectura y escritura de objetos en distintas aplicaciones, las clases de dichos objetos tienen que estar obligatoriamente obligatoriamente en un paquete. Estas clases no pueden estar en el mismo fichero que la aplicacin.

CLASE OBJECTINPUTSTREAM
Es la clase que representa un flujo de lectura de objetos java que previamente han sido escritos con el flujo ObjectOutputStream. Constructores:

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

ObjectInputStream (InputStream): Crea un flujo que permite leer objetos de java en el objeto InputStream que se pasa como argumento.

98

ObjectInputStream(): Para crear un objeto que permite leer objetos de java sobre cualquier dispositivo.

Mtodos: Mismos mtodos que DataOutputStream mas: object readObject(): Para leer un objeto asociado al flujo y devolverlo de tipo Object. Hay que hacer obligatoriamente in cast a la clase a la que lo vamos a convertir. Persona obj=(Persona) flujolectura.readObject(); Todos s los mtodos propagan una excepcin de la clase IOException. El mtodo readObject propaga la excepcin ClassNotFoundException(Cuando se intenta hacer un cast al objeto que se ha ledo de una case que no es), y la excepcin StreamCorruptedException(cuando se intenta hacer ms de una operacin de lectura a travs de la clase ObjectInputStream).

Ejemplo
Creamos la clase persona en el paquete utilidades. La clase Persona implementar la clase serializable, y ser la encargada de guardar la informacin serializada. package Utilidades; public class Persona implements java.io.Serializable{ private String m_nombre, m_apellidos, m_telefono, m_email; public Persona(){} public Persona (String a,String b,String c, String d){ m_nombre = a ; m_apellidos os = b; m_telefono = c ; m_email = d; } public public public public } Creamos la clase Escritura, esta clase ser la encargada de guardar la informacin de los clientes en un fichero de texto. La escritura la realizaremos a travs de la creacin de un objeto Persona. package ejemplos; import java.io.*; import Utilidades.*; class Escritura { static ObjectOutputStream flujoescritura; static File archivo, carpeta; String String String String Obtener_Nombre() {return m_nombre ;} Obtener_Apellidos() {return m_apellidos ;} Obtener_Telefono() {return m_telefono ;} Obtener_Email() {return m_email ;}

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

99

public static void main (String[] args){ carpeta= new File ("Clientes"); if (!carpeta.exists()){ carpeta.mkdir(); } archivo = new File (carpeta, "Correos.txt"); try{ flujoescritura = new ObjectOutputStream ( new FileOutputStream (archivo)); flujoescritura.writeObject( new Persona ("Pepe", "Salas Prez", "919622314","pepeSalas@yahoo.es")); System.out.println("SE HA ESCRITO EN EL FICHERO FICH "+ archivo); }catch (IOException e){ System.out.println("NO SE HA PODIDO ESCRIBIR LA INFORMACION EN EL FICHERO "+ archivo); }finally{ try { if (flujoescritura!=null){ flujoescritura.close(); } }catch(IOException e){ System.out.println("NO SE HA PODIDO CERRAR CORRECTAMENTE _ EL FLUJO ASOCIADO AL FICHERO "+ archivo); } } } } La clase Lectura utilizar un objeto ObjectInputStream para realizar la lectura de la informacin serializada. package ejemplos; import java.io.*; import Utilidades.*; public class Lectura { static ObjectInputStream flujolectura; static File archivo; public static void main (String args[]){ archivo = new File ("Clientes","Correos.txt"); try{ flujolectura = new ObjectInputStream (new FileInputStream (archivo)); Persona obj = (Persona) flujolectura.readObject(); System.out.println("NOMBRE "+obj.Obtener_Nombre()+ " System.out.println("TELEFONO "+obj.Obtener_Telefono()+ " EMAIL "+ _ obj.Obtener_Email());

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

100

APELLIDOS "+_ obj.Obtener_Apellidos());

}catch(ClassNotFoundException e){ System.out.println("NO SE HA PODIDO CONVERTIR LA INFORMACION"); }catch(IOException e){ System.out.println("NO SE HA PODIDO LEER LA INFORMACION DEL FICHERO"); }finally{ try{ if(flujolectura!=null){ flujolectura.close(); } }catch(IOException e){ System.out.println("NO SE HA PODIDO CERRAR CORECTAMENTE _ EL FLUJO ASOCIADO AL FICHERO"); } } } }

CLASE RANDOMACCESSFILE
Es la clase encargada de crear ficheros ficheros aleatorios, son los ms fciles de tratar ya que nos permiten movernos hacia la derecha, hacia la izquierda, saltar posiciones, Se puede escribir partes del fichero sin necesidad de cerrarlo y aadir informacin al final del fichero. Cuando queramos abrir ir un fichero de acceso aleatorio tendremos que crear un objeto de tipo RandomAccessFile y en constructor indicaremos la ruta del fichero y el modo de apertura: slo lectura "r", o lectura/escritura "r/w". RandomAccessFile Fichero = new RandomAccessFile ("datos.txt","rw"); ("

En el siguiente ejemplo crearemos una aplicacin que nos permita guradar datos de los alumnos de un curso en un fichero de texto con RandomAccesFile.Crearemos un men para poder seleccionar entre las opciones: Introducir nota, Listado completo, Ver notas de un alumno, Modificar nota y Salir. package ejemplos; import java.io.*; public class FicherosAleatorios { private static final int TAM_MAX=50; private static final int NOMBRE_MAX=30; private static final int MODULO_MAX=15; private static RandomAccessFile nota;

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

101

//----------------------------------------------------------------------------------------------------------------------------public static void Listar (String[] opc){ System.out.println("-------------------------------------------------------System.out.println(" --------------------------------------------------------"); for (int i=1; i<=opc.length ; i++){ System.out.println(" System.out.println("\t\t"+i+"."+opc[i-1]); 1]); } System.out.println("--------------------------------------------------------"); System.out.println("-------------------------------------------------------} //----------------------------------------------------------------------------------------------------------------------------public static String Datos(String s){ try{ System.out.println("---------------------------------------------------System.out.println("-------------------------------------------------------"); System.out.print(s); return (new BufferedReader (new InputStreamReader (System.in)))._ readLine().trim(); }catch (IOException ioe){ System.out.println(" nError interno en sistema de System.out.println("\nError entrada/salida\n"); } return ""; } //----------------------------------------------------------------------------------------------------------------------------public static void meterNotaEnFichero(){ try{ String aux=""; nota.seek( NumRegistros()* NumRegistros( TAM_MAX); do{ aux=Datos("Introduce nombre: "); if (aux.length()>=NOMBRE_MAX){ System.out.println("\nNombre nNombre demasiado largo\n"); largo System.out.println("----------------------------------------------------------------------------------} }while(aux.l }while(aux.length()>=NOMBRE_MAX); nota.writeUTF(aux);

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

102

--------------");

do{ aux=Datos("Introduce modulo: "); if (aux.length()>=MODULO_MAX){ System.out.println("\nNombre nNombre de modulo demasiado largo"); System.out.println("------------------------------------------------------------------------------------------------"); } }while(aux.length()>=MODULO_MAX); nota.writeUTF(aux); System.out.println("---------------------------------------------------System.out.println("-------------------------------------------------------"); otro:do{ try{ aux=Datos("Introduce nota: "); nota.writeInt(Integer.parseInt(aux)); }catch (NumberFormatException e){ System.out.println("Debes introducir un numero"); continue otro; } }while(false); }catch(IOException ioe){ System.out.print(" t.print("\nError "+ioe.toString()); } } //----------------------------------------------------------------------------------------------------------------------------public static void listadoCompleto(){ if (NumRegistros()!=0){ System.out.println(" System.out.println("\n\t LISTADO COMPLETO\n-----------------------------------------------------------------------------"); System.out.println(" ---------------------------------------------"); System.out.println("\n--------------------------------------------try{ for (int i=0; i<NumRegistros();i++){ nota.seek(i* TAM_MAX); System.out.println("\nNombre: nNombre: "+ nota.readUTF()); nota.read System.out.println("Modulo: "+ nota.readUTF()); System.out.println("Nota: "+ nota.readInt()); System.out.println("\n-----------------------------------------------------------------------------------"); }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

103

}catch (IOException ioe){ System.out.println(" System.out.println("\nError "+ioe.toString()); e.toString()); } }else{ System.out.println(" nNo hay registros introducidos"); System.out.println("\nNo } } //----------------------------------------------------------------------------------------------------------------------------public static void notasDe1Alumno(){ String aux=""; boolean esta=false; if (NumRegistros()>0) { aux = Datos("Introduce el nombre de un alumno: "); try{ for (int i=0; i<NumRegistros();i++){ nota.seek(i* TAM_MAX); if (aux.compareToIgnoreCase(nota.readUTF())==0){ nota.seek(i* TAM_MAX); System.out.println("\ \n--------------------------------------------"); System.out.println("Nombre: "+ nota.readUTF()); System.out.println("Modulo: "+ nota.readUTF()); System.out.println("Nota: "+ nota.readInt()); esta=true; } } if (esta==false){ System.out.println("\nEse nEse alumno no se encuentra"); } }catch (IOException ioe){ System.out.println("\nError nError "+ioe.toString()); } }else{ System.out.println("No hay datos en el fichero"); } //----------------------------------------------------------------------------------------------------------------------------public static void modificarNota(){ }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

104

String aux=""; String aux2=""; boolean esta=false; if (NumRegistros()>0) { aux = Datos("Introduce el nombre de un alumno: "); aux2 = Datos("Introduce el modulo: "); String opcion=""; try{ for (int i=0; i<NumRegistros();i++){ nota.seek(i* TAM_MAX); if (aux.compareToIgnoreCase(nota.readUTF())==0){ if (aux2.compareToIgnoreCase(nota.readUTF())==0){ nota.seek(i* .seek(i* TAM_MAX); System.out.println("Nombre: "+ nota.readUTF()); System.out.println("Modulo: "+ nota.readUTF()); opcion = Datos("Introduce la nueva nota: "); nota.writeInt(Integer.parseInt(opcion)); esta=true; } } } if (esta==false){ System.out.println("Esos datos no se encuentra"); } }catch (IOException ioe){ System.out.println("\nError nError "+ioe.toString()); } }else{ System.out.println("No hay datos en el fichero"); } } //----------------------------------------------------------------------------------------------------------------------------private static int NumRegistros(){ try{ return (int)Math.ceil ((double)nota.length()/ (double)TAM_MAX); }catch (IOException e){ System.out.println("ERROR GRAVE DE ENTRADA/SALIDA"); return 0;

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

105

} } //-----------------------------------------------------------------------------------------------------------------------------

public static void main (String[] args){ String[] menu1={"Introducir nota", "Listado completo","Ver notas de un alumno",_ "Modificar nota","Salir"}; String opcion; try{ nota=new RandomAccessFile ("notas.txt","rw"); fin:do{ Listar(menu1); opcion = Datos("Introduce una opcion: "); try{ switch (Integer.parseInt(opcion)){ case 1: case 2: meterNotaEnFichero(); break; listadoCompleto(); break;

case 3: notasDe1Alumno(); break; case 4: modificarNota(); break; case 5: break fin; default: System.out.println("Opcion erronea"); } }catch (NumberFormatException e){ System.out.println("La opcion tiene que ser un numero"); } }while(true); }catch (IOException ioe){ System.out.print(" nError "+ioe.toString()); System.out.print("\nError }finally{ try{

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

106

if (nota!=null){ nota.close(); } }catch (IOException ioe){ System.out.print("\nError nError "+ioe.toString()); } } } }

Ver Video: ObjectOutputStream_ObjectInputStream

Unidad 11: : E/S de consola y E/S de archivos


Objetivos
Conocer los objetos que implementan la salida estndar en java Trabajar con la E/S de datos por consola y archivos

Introduccin
En esta unidad trataremos la E/S de los datos del usuario desde su equipo, datos introducidos por teclado, sin interactuar ninguna interface tipo Swing, pgina web, web applet, El acceso a la entrada y salida estndar de datos en Java es controlado por tres objetos que se crean automticamente al iniciar la aplicacin: System.in, System.out y System.err. System.err LOS InputStream: EL OBJETO System.in Al igual que Java nos ofrece System.out para escribir en pantalla, tenemos System.in para leer de ella. System.in es un objeto de una clase de java que se llama InputStream. Para java, un InputStream es cualquier cosa de la que se leen bytes. Puede ser el teclado, un fichero, un socket, o cualquier otro dispositivo de entrada. Esto, por un lado es una ventaja. Si todas esas cosas son InputStream, podemos hacer cdigo que lea de ellas sin saber qu estamos leyendo. Por otro lado, es una pega. Como un InputStream InputStream es para leer bytes, slo tiene mtodos para leer bytes. Nosotros queremos leer palabras o nmeros del teclado, no bytes. Si escribimos en el teclado una A mayscula y la leemos con System.in, obtendremos un entero de valor 65, que es el valor del byte correspondiente a la A. Para java, una clase Reader es una clase que lee caracteres. Esto se parece ms a lo que queremos. Un Reader tiene mtodos para leer caracteres. Con esta clase ya podriamos trabajar. La pena es que seguimos teniendo System.in, stem.in, que es un InputStream y no un Reader.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

107

LOS Reader

Cmo convertimos el System.in en Reader?. Hay una clase en java, la InputStreamReader, que nos hace esta conversin. Para obtener un Reader, nicamente tenemos que instanciar un InputStreamReader pasndole en el constructor un InputStream. El cdigo es el siguiente InputStreamReader isr = new InputStreamReader(System.in); Estamos declarando una variable "isr" de tipo InputStreamReader. Creamos un objeto de esta clase haciendo new InputStreamReader(...). Entre parntesis le pasamos el InputStream que queremos convertir a Reader, en este caso, el System.in InputStreamReader es un Reader. Se comporta igual que in Reader y se puede poner en cualquier sitio que admita un Reader. Es decir, podemos leer de l caracteres. caracter Al constuirlo le hemos pasado un InputStream, en concreto, System.in. InputStreamReader de alguna forma se lo guarda dentro. Cuando a InputStreamReader le pedimos caracteres, l le pide al InputStream que tiene guardado dentro los bytes, los convierte a caracteres y nos los devuelve. LA CLASE BufferedReader Con la clase InputStreamReader podramos apaarnos. La pega es que nos da los caracteres sueltos. Si estamos leyendo de teclado, el que usa el programa puede escribir 10 caracteres o 20 o 13. Si usamos os InputStreamReader, como lee caracteres sueltos, Tenemos que decirle cuntos queremos (que no lo sabemos), o bien ir pidiendo de uno en uno hasta que no haya ms. La clase BufferedReader posee el mecanismo para obtener un BufferedReader a partir de otro Reader cualquiera (por ejemplo el InputStreamReader), es similar al que usamos antes. Lo instanciamos pasndole en el construtor el Reader. El cdigo es BufferedReader br = new BufferedReader (isr); El funcionamiento de esta clase es igual que el InputStreamReader. InputStreamReader. Cuando le pedmos una lnea completa de caracteres (un String), ella se lo pide al Reader que tenga dentro, los convierte en String y nos lo devuelve. Para pedirle un String, se usa el mtodo readLine(). Este mtodo lee todos los caracteres tecleados tecle (recibidos si fuera otro dispositivo de entrada) hasta que encuentra la pulsacin de la tecla o como quieras llamarla. String texto = br.readLine();

System.in
La clase System.in nos permite acceder a la lectura de caracteres. Para la lectura de los caracteres c tendremos que utilizar un Buffer de lectura, la clase encargada de esto ser BuffererReader. Las aplicaciones que tengan que hacer una lectura de streams, en este caso por la consola, lo realizarn mediante wrapping de clases. Es decir, sobre la consola, montamos un InputStreamReader, y sobre este un BufferedReader. Ejemplo: BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); Mtodos ms impotantes: skip(n): Ignora los n caracteres siguientes de la entrada.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

108

read():Si no se ha introducido ningn carcter por el teclado devuelve el valor 1. Devuelve el carcter que se ha introducido por el teclado leyndolo del buffer de entrada y lo elimina del buffer para que en la siguiente lectura sea ledo el siguiente carcter. En el siguiente ejemplo recogemos un nmero por teclado y mostramos en pantalla si el nmero es par o impar. import java.io.*; public class Ejemplo { public static void main(String[] args) throws IOException{ String numero; BufferedReader teclado=new BufferedReader(new BufferedReader(new InputStreamReader(System.in)); System.out.println("Introduzca nmero:"); numero=teclado.readLine(); int num=Integer.parseInt(numero); int dato=Integer.parseInt(numero); if (dato%2==0){ System.out.println("El dato "+dato+" es par"); p } else{ System.out.println("El dato "+dato+" es impar"); } } }

Introduzca nmero: 5 El dato 5 es impar

System.out
Este objeto implementa la salida estndar. Se pueden utilizar los mtodos print() y println() con cualquier tipo bsico Java como argumento.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

En este ejemplo obligamos la salida a 14 posiciones, con el smbolo y cuatro decimales.

109

Una de las novedades desde la versin 1.5 de java es el famoso printf tan usado en C. Este mtodo nos permite definir como representar multitud de tipos de datos sin mucho trabajo.

import java.util.*; public class EjPrint { public static void main(String [] params) { float valor = 10.23f; System.out.printf("El valor es %+14.4f",valor); } } La salida ser:

System.err
En java podemos implementar el objeto System.err para la salida de errores. Las funciones que tenemos en System.out son idnticas a las proporcionadas por System.out. Es muy habitual imprimir el error en un fichero de texto dedicado a ir guardado los mensajes de error que se produzcan. En el siguiente ejemplo recogemos un nmero por teclado y mostramos en pantalla si el nmero es par o impar. Si el nmero es impar lanzamos un System.err. import java.io.*; public class Ejemplo { public static void main(String[] args) throws thro IOException{ String numero; BufferedReader teclado=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Introduzca nmero:"); numero=teclado.readLine(); int num=Integer.parseInt(numero); int dato=Integer.parseInt(numero); if (dato%2==0){ System.out.println("El dato "+dato+" es par"); } else{ System.out.println("El dato "+dato+" es impar"); System.err.println( "Dato impar no se puede realizar la operacin" ); } } }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

Introduzca nmero: 3 Dato impar no se puede realizar la operacin El dato 3 es impar

110

Unidad 12: Creacin de interfaces grficas con el API Swing


Introduccin
La base de la programacin grfica se encuentra en estos dos elementos fsicos del ordenador, los cuales se disearon de forma conjunta con el propsito de presentar informacin al usuario. El comprender su funcionamiento ayuda a conocer lo que estamos haciendo cuando diseamos un entorno grfico.

Monitor y tarjeta grfica


El CRT (Tubo de Rayos Catdicos) est formado por los siguientes elementos: Ctodos: Aqu se generan tres haces de electrones cuya energa corresponden con los tres colores bsicos, a partir de los cuales podemos obtener el resto de colores. Sistema de enfoque: Mediante un sistema de electroimanes (campos (campos magnticos generados a partir de seales elctricas) enfocamos los tres haces de electrones sobre un punto de la pantalla. Este sistema es el encargado tambin de realizar el desplazamiento de dichos haces con el propsito de formar la imagen. Pantalla: la: Est formada por un material fosforescente que desprende los fotones que llegan hasta el ojo cuando los electrones chocan contra l. Adems mantiene la impresin de los haces durante un tiempo que junto con la persistencia de nuestra retina nos da la sensacin s de permanencia.

A partir de este funcionamiento podemos definir una serie de parmetros: Pixel: la unidad bsica de informacin de la imagen. Se corresponde con uno de los puntos donde convergen los tres haces de electrones. El tamao actual es de 0.28mm. Cuanto ms pequeo sea el pixel, mayores resoluciones podramos obtener con el mismo tamao de la pantalla. Resolucin vertical y horizontal (resolucin): Es el nmero de pxeles que se estn representando de forma vertical (lneas) y de forma horizontal horizontal (nmero de puntos en una lnea). Resoluciones tpicas son: 640x480, 800x600, 1024x768. Frecuencia de cuadro: Es el nmero de imgenes que se presentan por segundo. Esta frecuencia se coge directamente de la frecuencia de la seal de red (50Hz) y debe ser valores que eviten el parpadeo. Entrelazado: Tecnologa que permite representar primero las lneas impares y posteriormente las lneas pares con lo que se consigue que la vista se canse menos. Profundidad de color: Los colores que es capaz de representar representar el monitor viene directamente dado por la capacidad que tenga el monitor de cambiar las intensidades de los tres haces de electrones. Esta variacin es analgica dentro del monitor, por tanto, podramos conseguir infinidad de colores, sin embargo, los circuitos que controlan estas intensidades (situados en la tarjeta grfica) manejan datos digitales que posteriormente se convierte a analgico con la correspondiente prdida de niveles.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

111

La evolucin de los monitores: CGA EGA VGA SVGA

Tarjeta grfica. Este es el elemento que controla todas las seales que necesita el monitor para presentar informacin en pantalla. En concreto: Seales de temporizacin para el movimiento de los haces. Seales RGB para el control de la intensidad de los haces (colores).

La informacin de los colores son datos binarios situados en la memoria que tiene la propia tarjeta grfica. Un conjunto de posiciones de memoria alberga la informacin para cada pixel. Por tanto, la resolucin y nmero de colores que podemos podemos obtener depende de la memoria que disponga la tarjeta. Conclusin: Por tanto cuando aparece un elemento grfico en pantalla, tan slo se han situado en la zona de memoria correspondiente un conjunto de datos binarios que codifican los colores del conjunto junto de pxeles de la zona de pantalla en concreto.

El sistema de coordenadas.
A la hora de disear los programa de bajo nivel que faciliten a los programadores su trabajo con el entorno grfico, es necesario establecer algn sistema de referencia que que ponga orden en el mar de pxeles de la pantalla. Se acord que el origen de coordenadas (0,0) sera la esquina superior izquierda, la coordenada x seran las lneas, y la coordenada y seran las columnas. Ahora bien, los lenguajes de programacin pueden pueden manejar coordenadas relativas o absolutas. Coordenadas absolutas: Cualquier elemento que se site sobre la pantalla (por ejemplo, un botn) tendr su origen de coordenadas en la esquina superior izquierda y tendrn los valores que correspondan con la coordenada co (0,0). Coordenadas relativas: Cualquier elemento que se coloque sobre la pantalla tendr su propio sistema de coordenadas, es decir, la coordenada de su esquina superior izquierda ser la (0,0). El compilador del lenguaje ser el encargado de realizar realizar la transformacin de coordenadas.

La unidad de medida son los pxeles. A la hora de un pintar un Componente, se debe tener en cuenta, adems del tamao ya comentado, el tamao del borde del Componente, si lo tuviera. Por ejemplo, un borde que qu ocupar un pixel alrededor del componente, hara que la coordenada de la esquina superior izquierda pasase de ser

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

112

Java usa coordenadas relativas, es decir, cada uno de los componentes de Java tiene su propio sistema de coordenadas, que va desde la coordenada (0,0) (esquina superior izquierda), hasta la posicin determinada por su anchura y altura totales, menos una unidad.

(0,0) a (1,1) y reducira adems la anchura y altura totales del Componente es dos pxeles, uno por cada lado.

Clases de Java para la programacin programacin grfica y su evolucin.


Al enfrentarse con el desarrollo de una aplicacin grfica, el programador debe conocer las herramientas que le ofrece el lenguaje de programacin que va a utilizar. Java dispone de una serie de clases para este menster. Estas clases se encuentran en los siguientes paquetes: Java.awt: El AWT (Abstract Window Toolkit) es el primer paquete que diseo Sun para el desarrollo de entornos grficos. Se comenta que se desarroll en unos pocos meses y que esto fu la causa de sus carencias y defectos. Javax.swing: Este paquete se distribuye en la nueva plataforma Java2.

Programacin grfica con Swing


Swing hay que verlo como una extensin de AWT, por por tanto, no hay que olvidar lo aprendido en AWT. Es ms, en la mayora de los casos es suficiente con aadir una "J" al componente AWT para que se convierta en un componente Swing. En Swing, los componentes de la interfaz grfica son Beans. Todos los componentes com son "ligeros" (lightweight), es decir, ya no se usan componentes dependientes del sistema operativo. Se utiliza slo el nuevo modelo de Delegacin de eventos. Son muchas las ventajas que ofrece el uso de Swing: La navegacin con el teclado es automtica, automtica, es decir, cualquier aplicacin Swing se puede usar sin el ratn sin tener que aadir lneas de cdigo adicionales. Las etiquetas de informacin ("tool tips") se pueden crear con una sola lnea de cdigo. Estas etiquetas de informacin son las que que aparecen cuando nos situamos con el ratn sobre un componente del interfaz grfico.

Con respecto al AWT, Swing incorpora muchos aspectos que permiten mejorar el entorno grfico.

Paquete javax.swing
Las clases principales de Swing se encuentran en este paquete. Tenemos que seguir distinguiendo entre Gestores de trazado, Contenedores y Componentes. A continuacin pasamos a describir las nuevas clases agrupadas segn lo que sean:

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

113

Sumario de clases del paquete javax.swing BoxLayout JRootPane JWindow JApplet JDialog JFrame JPanel JInternalFrame JComponent AbstractButton
Un gestor de trazado nuevo que permite a mltiples componentes ser colocados segn un eje horizontal o vertical. El componente fundamental en la jerarqua de contenedores. Una representacin de una ventana. Una versin extendida de java.applet.Applet que aade nuevas funcionalidades, por ejemplo, pueden aadirse barras de men de Swing. La clase principal para crear una ventana de dilogo. Una versin extendida de java.awt.Frame que aade funcionalidades extras. JPanel es un contenedor ligero genrico. Un objeto ligero que proporciona muchas de las caractersticas de una ventana nativa, incluyendo "pinchar y arrastrar", cerrado, iconizado, redimensionado, redimensionado, ttulo y barra de men. La clase base para los componentes Swing. Define el comportamiento comn de las clases JButton, JToggleButton, JCheckbox y JRadioButton. Es una clase abstracta y, por tanto, no pueden crearse objetos. La definicin abstracta para el modelo de datos que proporciona una lista con sus contenidos. Un botn Swing. Un CheckBox Swing. Una implementacin de un botn tipo radio Una implementacin de un botn de dos estados. Esta clase permite crear un grupo de botones con exclusin mltiple. Un rea para visualizar un texto corto, una imagen o ambos. Implementacin de Swing de un ComboBox -- Un ComboBox es una combinacin de una caja de tecto y una lista desplegable que permite a un usuario o introducir un valor mediante teclado o seleccionar de la lista. Un componente que permite al usuario seleccionar uno o ms objetos de una lista.

AbstractListModel JButton JCheckBox JRadioButton JToggleButton ButtonGroup JLabel

JList

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

114

JComboBox

ImageIcon JTextField JPasswordField JTextArea JScrollPane JProgressBar JSlider JMenuBar JMenu JMenuItem JPopupMenu JRadioButtonMenuItem JCheckBoxMenuItem JSeparator JToolBar JColorChooser JFileChooser

Una implementacin del interface Icon que permite pintar iconos a partir de imgenes. Una implementacin de una caja de texto.. JPasswordField es un campo de texto tipo password. Una implementacin de un textarea. Un contenedor que permite aadir barras de desplazamiento a otros componentes. Un componente que representa un valor entero dentro de un intervalo limitado. Un componente que permite al usuario seleccionar grficamente un valor desplazando una barra dentro de un intervalo. Una implementacin de una barra de men. Una implementacin de un men. Una implementacin de un MenuItem. Una implementacin de un men emergente Una implementacin de un item de men tipo radio. Un item de un men Swing que puede ser seleccionado o no. Una implementacin de un separador de opciones de men. Una implementacin de una barra de herramientas. Esta clase proporciona un panel de controles diseado para permitir al usuario manipular y seleccionar un color. JFileChooser proporciona un mecanismo simple para seleccionar un fichero. JOptionPane JOpt ionPane facilita el despliegue de una caja de dilogo estndar que pregunta al usuario acerca de un valor o le informa de algo. Un componente de texto para editar diversas clases de contenidos.

JOptionPane JEditorPane JTextPane JScrollBar JTabbedPane

Una implementacin de una barra de desplazamiento. Un componente que permite al usuario desplazarse entre un grupo de

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

115

Un componente de texto con capacidad de representacin grfica.

componentes pulsando el tabulador con un ttulo y/o icono dado.

JSplitPane JTable JTree

JSplitPane se usa para dividir dos (y slo dos) componentes. JTable es un componente que permite presentar datos en formato de tabla de dos dimensiones. Un control que visualiza un conjunto jerarquicamente en forma de rbol. de datos organizados

Ejemplos con algunas de las clases de Swing


Posicionar controles en un formulario.
Insertar dos controles JButton sobre un Frame de Swing. Al pulsar sobre el JButton Rojo cambiaremos el color del contenedor a Rojo y lo mismo con el Jbutton de Verde.

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class EjSwing extends JFrame{ Container cont; //----------------------------------------------------------------------------------------------public static void main (String args[]){ new EjSwing(); } //----------------------------------------------------------------------------------------------public EjSwing(){ cont = getContentPane(); JButton boton1= new JButton("Rojo");

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

116

boton1.setBounds(20,50,100,20); boton1.addActionListener(new ActionListener(){ public void actionPerformed (ActionEvent ae){ cont.setBackground (Color.red); } }); cont.add(boton1); JButton boton2= new JButton("Verde"); boton2.setBounds(180,50,100,20); boton2.addActionListener(new ActionListener(){ public void actionPerformed (ActionEvent ae){ cont. setBackground (Color.green); } }); cont.add(boton2); cont.setLayout(new BorderLayout()); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent we){ System.exit(0); } }); setSize(300,200); setLocation(100,100); setTitle("Ejemplo de javax.swing.JFrame"); setResizable(false); setVisible(true); } }

Contenedor JFrame y controles en ejecucin.


Realizar un programa que permita modificar dinmicamente el nmero de controles que contiene un contenedor en un JFrame. Al pulsar sobre agregar, iremos agregando botones hasta el mximo de diez botones. Al pulsar sobre Eliminar, iremos eliminando botones del contenedor de uno en uno. Con el botn eliminar todos, borraremos todos los botones del contenedor.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

117

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class EjSwing extends JFrame{ int contador=0; public EjSwing() { final Panel p_central =new Panel(); Panel p_sur=new Panel(); int i=0; Button btn_agregar= new Button ("Agregar"); Button btn_eliminar=new Button ("Eliminar");_ Button btn_eliminar_todos=new Button ("Eliminar todos"); final Button[] botones= new Button[10]; setLayout(new BorderLayout()); for (i=0;i<botones.length;i++) { botones[i]=new Button("Boton " +(i+1)); } btn_agregar.addActionListener(new ActionListener()_ {

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

118

public void actionPerformed(ActionEvent e) { if (contador < botones.length) { p_central.add(botones[contador++]); validate();_ } } }); btn_eliminar.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (contador > 0) { contador--;_ p_central.remove(contador); validate(); } } }); btn_eliminar_todos.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { p_central.removeAll(); contador=0; validate(); } }); p_sur.add(btn_agregar); p_sur.add(btn_eliminar); p_sur.add(btn_eliminar_todos); add(p_central, BorderLayout.CENTER); add(p_sur, BorderLayout.SOUTH); setSize(300,300); } public static void main (String Args[]) { EjSwing f=new EjSwing(); f.setVisible(true); } }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

119

Clase JTree
En este ejemplo realizaremos una aplicacin con un control Jtree en el que podremos insertar nuevos elementos, ver elementos seleccionados, Eliminar elementos y Modificar elementos.

DefaultTreeModel modelo;

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

public class EjSwing extends JFrame{

120

import import import import import

java.awt.*; java.awt.event.*; javax.swing.*; javax.swing.event.*; javax.swing.tree.*;

JTree arbol=new JTree(); JButton btn=new JButton("Insertar"); JButton btnsel=new JButton("Seleccionado"); JButton btneli=new JButton("Eliminar"); JButton btnmod=new JButton("Modificar"); JLabel lbl=new JLabel(); JTextField txt=new JTextField(); Container cont; JScrollPane scroll; DefaultMutableTreeNode raiz; DefaultMutableTreeNode ode nnodo; DefaultMutableTreeNode equipo; DefaultMutableTreeNode jugador; public EjSwing() { cont=getContentPane(); raiz=new DefaultMutableTreeNode("Clientes"); modelo=new DefaultTreeModel(raiz); crearNodos(); arbol.setModel(modelo); arbol.setBounds(10, ol.setBounds(10, 20, 150, 200); scroll=new JScrollPane(arbol); lbl.setBounds(10, 210, 300, 50); lbl.setBackground(Color.green); btn.setBounds(180, 20, 100, 30); txt.setBounds(180, 70, 100, 30); btnsel.setBounds(180, 110, 120, 30); btneli.setBounds(180, 140, 120, 30); btnmod.setBounds(180, 180, 120, 30); //cont.add(arbol); scroll.setBounds(10, 20, 150, 200); cont.add(scroll); cont.add(btn); cont.add(txt); cont.add(lbl); cont.add(btnsel); cont.add(btneli); cont.add(btnmod); cont.setLayout(new BorderLayout()); arbol.addTreeSelectionListener(new TreeSelectionListener() { public void valueChanged(TreeSelectionEvent e) { } }); btn.addActionListener(new ActionListener() {

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

121

public void actionPerformed(ActionEvent actionPerformed(ActionEvent e) { nnodo=new DefaultMutableTreeNode(txt.getText()); raiz.add(nnodo); modelo.reload(); } }); btneli.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int indice=0; DefaultMutableTreeNode nodo; DefaultMutableTreeNode padre; nodo=(DefaultMutableTreeNode)(arbol.getSelectionPath()._ getLastPathComponent()); padre=(DefaultMutableTreeNode)nodo.getParent(); //padre.remove(nodo); nodo.removeFromParent(); //padre.setUserObject((Object)(txt.getText())); modelo.reload(); } }); btnmod.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { DefaultMutableTreeNode nodo; nodo=(DefaultMutableTreeNode)(arbol.getSelectionPath()._ DefaultMutableTreeNode)(arbol.getSelectionPath()._ getLastPathComponent()); nodo.setUserObject((Object)(txt.getText())); modelo.reload(); } }); btnsel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { lbl.setText("NODO..." +arbol.getSelectionPath()._ getLastPathComponent()); } }); setSize(500, 500); setVisible(true); } public static void main(String args[]) { EjSwing f=new EjSwing(); }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

122

public void crearNodos() { equipo=new DefaultMutableTreeNode("Madrid"); raiz.add(equipo); jugador=new DefaultMutableTreeNode("Pepe"); equipo.add(jugador); jugador=new DefaultMutableTreeNode("Yumio"); equipo.add(jugador); jugador=new DefaultMutableTreeNode("Tiner s.l"); equipo.add(jugador); equipo=new DefaultMutableTreeNode("Sevilla"); raiz.add(equipo); jugador=new DefaultMutableTreeNode("FGT s.a"); equipo.add(jugador); jugador=new DefaultMutableTreeNode("Polos s.l"); equipo.add(jugador); jugador=new DefaultMutableTreeNode("Yahiza"); Def equipo.add(jugador); } }

Laboratorio: Manejo de los cuadros de dilogo


Objetivo
Utilizar los cuadros de dilogo de Swing.

Enunciado:
Realizar una aplicacin en la que cargaremos los distintos cuadros de dialogo que nos proporciona Swing. En el botn de maximizar, haremos la ventana tan grande como la pantalla. En el botn de dialogo, mostraremos una ventana que nos indique la versin de la aplicacin y as con cada uno de los dilogos disponibles.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

123

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

124

Dialogo..

Archivo

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

import import import import

javax.swing.*; java.io.*; java.awt.*; java.awt.event.*;

125

public class CuadrosDialogo extends javax.swing.JFrame { /** Creates new form CuadrosDialogo */ public CuadrosDialogo() { initComponents(); } private void btndialogoActionPerformed(java.awt.event.ActionEvent evt) { final JDialog ventana = new JDialog(this, "Acerca de..", true); ventana.getContentPane().add(new JLabel("Aplicacion SWING", JLabel.CENTER), _ BorderLayout.CENTER); JButton btncerrar = new JButton("Cerrar"); ventana.getContentPane().add(btncerrar, _ BorderLayout.SOUTH); btncerrar.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ventana.setVisible(false); } }); ventana.setSize(200, 200); ventana.setLocation(100, 100); ventana.setVisible(true); } private void btncolorActionPerformed_ (java.awt.event.ActionEvent evt) { Color col; col = JColorChooser.showDialog(this,_ "Color de fondo", btncolor.getBackground()); if (col != null) { btncolor.setBackground(col); } } private void btnmaximizarActionPerformed_ (java.awt.event.ActionEvent evt) { int ancho, alto; ancho = getToolkit().getScreenSize().width; alto = getToolkit().getScreenSize().height - 30; this.setSize(ancho, alto); this.setLocation(0, 0); } private void btnframeActionPerformed(java.awt.event.ActionEvent evt) { JFrame fr; fr = new JFrame(); fr.setVisible(true); }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

126

private void btnarchivoActionPerformed(java.awt.event.ActionEvent evt) { JFileChooser fd; fd=new JFileChooser(); int respuesta=-1; respuesta = JOptionPane.showConfirmDialog(this, "Desea abrir?"); if (respuesta == JOptionPane.OK_OPTION) { //ABRIR fd.setDialogType(JFileChooser.OPEN_DIALOG); fd.setDialogTitle("Abrir archivo"); fd.setCurrentDirectory(new File("C:\\")); File("C: respuesta = fd.showOpenDialog(this); if (respuesta == JFileChooser.APPROVE_OPTION) { this.lblmsj.setText("Archivo abierto " + fd.getSelectedFile()); } else { this.lblmsj.setText("Accin CANCELADA"); } } else if_ (respuesta == JOptionPane.CANCEL_OPTION) .CANCEL_OPTION) { //GUARDAR fd.setDialogType(JFileChooser.SAVE_DIALOG); fd.setDialogTitle("Guardar archivo"); fd.setApproveButtonText("Guardar como..."); respuesta = fd.showSaveDialog(this); if (respuesta == JFileChooser._ APPROVE_OPTION) { this.lblmsj.setText("Archivo Guardado " + fd.getSelectedFile()); } else { this.lblmsj.setText("Accin CANCELADA"); } } } private void btnOptionPaneActionPerformed_ (java.awt.event.ActionEvent evt) { int icono = -1; String titulo, mensaje; titulo = this.txttitulo.getText(); mensaje = this.txtmensaje.getText(); if (this.rdbadvertencia.isSelected()) { icono = JOptionPane.WARNING_MESSAGE; } else if (this.rdbinformacion.isSelected()) { icono = JOptionPane.INFORMATION_MESSAGE; } else if (this.rdbinterrogacion.isSelected()) { icono = JOptionPane.QUESTION_MESSAGE;

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

127

} else if (this.rdbsinicono.isSelected()) { icono = JOptionPane.PLAIN_MESSAGE; } else { icono = JOptionPane.ERROR_MESSAGE; } if (this.rdbconfirmacion.isSelected()) { JOptionPane.showConfirmDialog(this, mensaje, titulo, _ JOptionPane._ YES_NO_CANCEL_OPTION); } else if (this.rdbentrada.isSelected()) { //Primero muestra una ventana que captura un_ texto y luego lo muestra en otra String s=""; s = JOptionPane.showInputDialog(this, mensaje, titulo, icono); JOptionPane.showMessageDialog(this, s, titulo, icono); } else { JOptionPane.showMessageDialog(this, mensaje, titulo, icono); } } }

Ver Video: Interfaz Grfica

Unidad 13: Control de eventos generados por la interfaz grfica


Introduccin
El modelo antiguo de eventos est basado en la herencia.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

Cuando uno de los mtodos devuelve true, el evento ya no es procesado ms all, en caso contrario, el evento se propaga a travs de la jerarqua de componentes de la interfaz hasta que sea tratado o alcance al jerarqua de componentes.

128

Para que un programa capture eventos de una interfaz grfica, los componentes deben ser subclases de la interfaz y sobreescribir los mtodos action() y handleEvent().

Hay dos elecciones para estructurar el cdigo de gestin de eventos: Cada componente individual puede hacerse hacerse subclase para manejar especficamente un conjunto de eventos. Todos los eventos son manejados por un contenedor determinado (tendr que analizar sobre que componente se ha producido). Inconvenientes: No se pueden filtrar eventos: los eventos son recibidos recibidos por los componentes, los manejen o no. Problema de rendimiento con los eventos que se producen con mucha frecuencia.

Modelo nuevo de delegacin. delegacin. (Source, Listener, Adapter)


Los eventos ahora estn organizados en jerarquas de clases de eventos. El nuevo modelo hace uso de:

Fuentes de eventos (source):


Son objetos que tiene la capacidad de detectar eventos y notificar a los receptores de eventos que se han producido esos eventos.

Fuentes de Eventos

Descripcin
Es la clase raz de la cual derivarn todos los eventos. Tiene dos mtodos de inters que son:

EventObject

Object getSource() --> > Devuelve el objeto sobre el que se ha producido el evento. String toString() -->Da >Da una representacin en forma de String. Es la clase raz de la cual derivan todos los eventos del AWT. Es una clase abstracta. De inters son:

AWTEvent

- Sus campos estticos que almacenan los valores para diferentes tipos de eventos.

ComponentEvent

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

Evento de bajo nivel que indica que un componente se ha movido, ha cambiado de tamao, ...

129

- El mtodo int getID() que devuelve un nmero entero que se corresponde con el tipo de evento que se ha producido.

Deriva de AWTEvent. Estos eventos se producen slo con propsitos de notificacin. El AWT sigue gue funcionando correctamente aunque no se traten. El evento es pasado a todos los ComponentListener o AdapterListener que se hayan registrado para recibir este tipo de eventos. Para registrar un listener se usa el mtodo addComponentListener sobre el objeto obj sobre el cual queremos recibir los eventos. Son de inters: - Sus campos que almacenan los valores que indican lo que ha sucedido a nivel de componente: Si se ha movido, si se ha ocultado, ... - El mtodo Component getComponent() para obtener el componente en forma de objeto sobre el que se produjo el evento. Se genera por objetos tipo Container cuando se aade o se quita un objeto de l. El evento es pasado a cada ContainerListener o AdapterListener que se haya dado de alta mediante el mtodo addContainerListener() del objeto sobre el que queremos obtener los eventos. - Sus campos que almacenan el valor de lo que puede suceder: un componente se ha aadido, se ha quitado, ... - Sus mtodos: mtod Container getContainer() que permite obtener el contenedor sobre el que se produjo el evento y Component getChild() obtiene el componente que lo produjo (al ser aadido, quitado, ...). Fuente de eventos de bajo nivel que indica si la ventana ha cambiado de estado (abrir, activar, minimizar, ...)

ContainerEvent (hereda de Caben destacar: ComponentEvent)

WindowEvent (hereda de ComponentEvent).

El evento es pasado a cada WindowListener o WindowAdapter que se haya registrado mediante el mtodo addWindowListener() para ser notificados. El mtodo getWindow() devuelve devuelve la ventana que gener el evento. Es el evento raz de todos los eventos de entrada a nivel de componente.

InputEvent (hereda de ComponentEvent).

Sus dos fuentes de eventos hijas son: KeyEvent (para eventos relacionados con el teclado) y MouseEvent (para eventos relacionados con el ratn). A continuacin vemos MouseEvent. Indica que una accin de ratn ha sucedido sobre un componente.

- Un botn del ratn es presionado.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

MouseEvent

Eventos de ratn

130

- Un botn del ratn es liberado - Un botn del ratn es clickeado (presionado y liberado) - El cursor del ratn entra en un componente. - El cursor del ratn sale del componente. Mouse Motion Events - El ratn es movido. - El ratn es arrastrado con botn pulsado (dragged) Estos eventos se envan a los MouseListener y MouseAdapter que se hayan registrado mediante el mtodo addMouseListener(). Dispone de una serie de mtodos tipo get (getX, getY, getPosition, getClickCount para recoger informacin del evento). Es un evento de alto nivel que indica que algo ha sucedido sobre un componente. Algunos componentes usan este tipo de eventos event en vez de usar los de bajo nivel. El protocolo para implementar correctamente este evento es mediante un ActionCommand.

ActionEvent

Los componente disponen de un mtodo setActionCommand (string) para asociarles un ActionCommand en concreto. El evento dispone de un getActionCommand() mediante el cual poder identificar el ActionCommand. Este evento se pasa a los ActionListener o ActionAdapter que se han dado de alta mediante el mtodo addActionListener() para poder recibir eventos de este tipo.

Ejemplos con eventos


ActionListener y WindowListener
Realizar un programa para cambiar el color de fondo de un Frame pulsando sobre los botones de accin. En este ejemplo vemos como generamos eventos para los cinco JButton.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

131

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class EjSwing extends JFrame{ Button boton1,boton2,boton3,boton4,boton5; public static void main(String[] args) { new EjSwing(); } public EjSwing() { setLayout(new BorderLayout (20,20)); boton1=new Button ("Rojo"); //----------------------------------boton1.addActionListener( new ActionListener(){ public void actionPerformed (ActionEvent ae){ getContentPane().setBackground (Color.red); } }); //----------------------------------add(boton1,BorderLayout.NORTH); boton2= new Button("Verde"); //----------------------------------boton2.addActionListener( new ActionListener(){ public void actionPerformed (ActionEvent ae){ getContentPane().setBackground (Color.green); } }); //----------------------------------add(boton2,"Sou add(boton2,"South"); boton3= new Button("Amarillo"); //----------------------------------boton3.addActionListener( new ActionListener(){

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

132

public void actionPerformed (ActionEvent ae){ getContentPane().setBackground (Color.yellow); } }); //----------------------------------add(boton3,"Center"); boton4= new Button("Azul"); //----------------------------------boton4.addActionListener( new ActionListener(){ public void actionPerformed (ActionEvent ae){ getContentPane().setBackground (Color.blue); } }); //------------------------------add(boton4,"East"); boton5= new Button("Negro"); //----------------------------------boton5.addActionListener( new ActionListener(){ public void actionPerformed (ActionEvent ae){ getContentPane().setBackground (Color.black); } }); //----------------------------------add(boton5,BorderLayout.WEST); setSize(300,200); setResizable(false); setLocation(100,100); setBackground(Color.cyan); setTitle("Ejemplo Eventos"); setVisible(true); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) { System.exit(0); dispose(); } }); } }

La clase SwingWorker es una clase de utilidad incluida en Java SE 6 que soluciona el problema de utilizar un hilo (thread) separado al de Swing para para realizar tareas de larga duracin.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

133

Clase SwingWorker

El objetivo de esta clase es la de implementar en un hilo/thread separado, cualquier funcionalidad que pudiera requerir mucho consumo de tiempo.

Definiendo un SwingWorker
En el siguiente ejemplo veremos una forma de poder haber background sobre un componente.

private void jBtnCambiarActionPerformed(ActionEvent evt) { _ ClaseWorker sw = new_ ClaseWorker (); sw.addPropertyChangeListener(new _ PropertyChangeListener(){ public_ void propertyChange(PropertyChangeEvent ropertyChange(PropertyChangeEvent evt) { _ if(evt.getPropertyName().equals(Correcto))_ // Aqu podramos ir actualizando el cdigo del componente a modificar. } } }); }_ class ClaseWorker extends javax.swing.SwingWorker_ { protected Object doInBackground()_ throws Exception { firePropertyChange_ (Correcto, null, NEW VALUE); _ return null; } };

Objetivo

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

Laboratorio 1: Movimiento entre frames

134

Trabajar con ms de un Frame en un proyecto

Enunciado:
Realizar una aplicacin en la que podremos movernos entre diferentes Frames que hayamos creado previamente en nuestra aplicacin. Tendremos 3 ventanas JFrame, en cada una de las ventanas podremos pasar a la siguiente o la anterior, dependiendo de la posicin del conjunto. En la ventana final podremos cerrar la aplicacin, o movernos entre las diferentes ventanas que tengamos. Crearemos una clase principal principal que se encargar de iniciar la aplicacin, del movimiento y de terminar la aplicacin. Pondremos un control JProgressBar para saber dnde estamos posicionados en el conjunto de ventanas.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

135

CLASE PRINCIPAL PARA ADMINISTRAR LOS MOVIMIENTOS En sta clase, los objetos sern compartidos (static) para poder acceder a ellos sin necesidad_ de crear instancias de objeto. import javax.swing.*; public class ClasePrincipalFrames { static VariosFormularios f1 = new VariosFormularios(); static VariosFormularios2 f2 = new VariosFormularios2(); static VariosFormularios3 f3 = new VariosFormularios3(); public static void cambiarFrame(JFrame framenuevo, JFrame frameantiguo) { framenuevo.setVisible(true); frameantiguo.setVisible(false); ameantiguo.setVisible(false); } public static void cerrarAplicacion() { System.exit(0); } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { f1.setVisible(true); } }); } } FRAME NUMERO 1 import java.awt.*; public class VariosFormularios extends javax.swing.JFrame {

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

136

/** Creates new form VariosFormularios */ public VariosFormularios() { initComponents(); this.setTitle("FRAME NUMERO 1"); this.setLocation(200, 200); this.getContentPane().setBackground(Color.YELLOW); this.jProgressBar1.setValue(1); } private void btnsiguienteframeActionPerformed(java.awt.event.ActionEvent evt) { ClasePrincipalFrames.cambiarFrame(ClasePrincipalFrames.f2, ClasePrincipalFrames.f1); } } FRAME NUMERO 2 import java.awt.*; public class VariosFormularios2 extends javax.swing.JFrame { /** Creates new form VariosFormularios2 */ public VariosFormularios2() { initComponents(); this.setTitle("FRAME NUMERO 2"); this.setLocation(200, 200); this.getContentPane().setBackground(Color.BLUE); this.jProgressBar1.setValue(2); } private void btnanteriorframeActionPerformed(java.awt.event.ActionEvent evt) { ClasePrincipalFrames.cambiarFrame(ClasePrincipalFrames.f1, ClasePrincipalFrames.f2); ClasePrincipalFrames.f2); } private void btnsiguienteframeActionPerformed(java.awt.event.ActionEvent evt) { ClasePrincipalFrames.cambiarFrame(ClasePrincipalFrames.f3, ClasePrincipalFrames.f2); } } FRAME NUMERO 3 import java.awt.*; public class VariosFormularios3 extends javax.swing.JFrame { /** Creates new form VariosFormularios3 */ public VariosFormularios3() { initComponents(); this.setTitle("FRAME NUMERO 3"); this.setLocation(200, 200);

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

137

this.getContentPane().setBackground(Color.MAGENTA); tContentPane().setBackground(Color.MAGENTA); this.jProgressBar1.setValue(3); } private void btnfinalActionPerformed(java.awt.event.ActionEvent evt) { ClasePrincipalFrames.cerrarAplicacion(); } private void btnanteriorActionPerformed(java.awt.event.ActionEvent evt) { ClasePrincipalFrames.cambiarFrame(ClasePrincipalFrames.f2, ClasePrincipalFrames.f3); } private void btnirframeActionPerformed(java.awt.event.ActionEvent evt) { int indice; indice = this.cmbframes.getSelectedIndex(); if (indice == 0) { ClasePrincipalFrames.cambiarFrame(ClasePrincipalFrames.f1, ClasePrincipalFrames.f3); } else { ClasePrincipalFrames.cambiarFrame(ClasePrincipalFrames.f2, ClasePrincipalFrames.f3); } } }

Laboratorio 2: Cargador de imgenes


Objetivo
Trabajar con componentes grficos.

Enunciado:
Realizar una aplicacin para cargar imgenes dinmicamente desde una ruta dada. Tendremos la posibilidad de cambiar el tamao de la imagen a nuestra conveniencia, dependiendo si queremos darle un tamao fijo (300,300) o queremos darle uno personalizado con on las cajas TextField. Al pulsar sobre Cargar Imagen, abriremos un cuadro de dialogo de Ficheros para seleccionar el archivo de imagen a cargar. Crearemos una clase JIMAGENPANE para dibujar la imagen sobrescribiendo el mtodo paintComponent de la clase super.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

138

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

public class DibujarImagenes extends javax.swing.JFrame { JImagenPane pimg; /** Creates new form DibujarImagenes */

139

import javax.swing.*; import java.awt.*; import java.io.*;

public DibujarImagenes() { initComponents(); String fichero = "C:\\CARTELES CARTELES\\dostontosmuytontos.jpg"; pimg = new JImagenPane(fichero); pimg.setSize(300, 300); this.getContentPane().add(pimg); this.setTitle("Cargador de Imagenes"); validate(); } private void btncargarimagenActionPerformed(java.awt.event.ActionEvent evt) { int alto, ancho; JFileChooser fd; String archivoimagen = ""; fd = new JFileChooser(); int respuesta = -1; fd.setDialogType(JFileChooser.OPEN_DIALOG); fd.setDialogTitle("Abrir archivo"); fd.setCurrentDirectory(new File("C:\\")); File("C: respuesta = fd.showOpenDialog(this); if (respuesta == JFileChooser.APPROVE_OPTION) { archivoimagen = fd.getSelectedFile().getAbsolutePath(); alto = 300; ancho = 300; if (this.rdbfijo.isSelected()) { pimg.setSize(300, 300); this.pimg.nuevaImagen(archivoimagen); } else { alto = Integer.parseInt(this.txtalto.getText()); ancho = Integer.parseInt(this.txtancho.getText()); teger.parseInt(this.txtancho.getText()); pimg.setSize(ancho, alto); this.pimg.nuevaImagen(archivoimagen, alto, ancho); } } } Realizar despus la prctica con un JLABEL y utilizando el mtodo setIcon() private ImageIcon Icon getIcono(String ico,Dimension tam) { int ancho=tam.width; int alto=tam.height; ImageIcon img = new ImageIcon(ico); img = new ImageIcon(img.getImage().getScaledInstance(ancho, alto, Image.SCALE_AREA_AVERAGING)); return img; }

CLASE JIMAGENPANE import java.awt.*; import javax.swing.*;

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

140

public class JImagenPane extends JPanel { private Image im; //imagen a pintar public JImagenPane(String fichero) { im = this.getToolkit().getImage(fichero); } public void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(im, 0, 0, this); } public void nuevaImagen(String fichero) { im = this.getToolkit().getImage(fichero); im = im.getScaledInstance(this.getWidth(), this.getHeight(),Image._ SCALE_AREA_AVERAGING); repaint(); } public void nuevaImagen(String fichero, int alto, int ancho) { im = this.getToolkit().getImage(fichero); it().getImage(fichero); im = im.getScaledInstance(ancho, alto,Image.SCALE_AREA_AVERAGING); repaint(); } }

Unidad 14: Aplicaciones basadas en la interfaz grfica


Objetivos
Conocer las principales clases en la elaboracin de mens con java Aprender a realizar un toolbar con java

Introduccin
En Swing disponemos de cuatro calse importantes para la creacin de interfaces basadas en la creacin de menes que son: JMenu, JMenuBar, JMenuItem y JPopupMenu. Un men en una aplicacin in no es ms que un JMenuBar en el que hay varios mens como veremos en esta unidad. En esta imagen podemos apreciar las diferentes secciones a las que hacen referencia las clases relacionadas con mens de Java:

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

141

Creacin de un men
Las tres clases ms importantes para crear un men son las siguientes:

JMenuBar
Representa la barra en la que voy a guardar mis menus.

JMenu
Son las opciones del men que insertaremos sobre el JMenBar, normalmente llamamos men por ejemplo el men "Archivo", "Insertar", "Formato", " etc.

JMenuItem
Los elementos de un men se representan mediante la clase JMenuItem. Ejemplo guardar, guardar como del Jmenu de Archivo.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

142

Jerarqua de clases para realizar un men:

Ejemplo de creacin de un Men:


En el siguiente ejemplo crearemos un Men con las opciones archivo y editar como se muestra en la imagen.

//Construimos los JMenuItem del JMenu de Archivo

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

import javax.swing.*; public class EjSwing extends JFrame{ public EjSwing(){ //Creacin de un JMeunuBar, clase principal. JMenuBar menuPrincipal = new JMenuBar(); JMenu menuArchivo = new JMenu("Archivo"); JMenu menuEditar = new JMenu("Editar"); menuPrincipal.add(menuArchivo); menuPrincipal.add(menuEditar);

143

JMenuItem Guardar = new JMenuItem("Guardar"); JMenuItem GuardarC = new JMenuItem("Guardar como"); JMenuItem Imprimir = new JMenuItem("Imprimir"); JMenuItem Cerrar = new JMenuItem("Cerrar"); menuArchivo.add(Guardar); menuArchivo.add(GuardarC); menuArchivo.add(Imprimir); menuArchivo.add(new JSeparator()); menuArchivo.add(Cerrar); //Agregamos el Men al JFrame. setJMenuBar(menuPrincipal); } public static void main (String args[]){ new EjSwing().setVisible(true);} }

Creacin de un Toolbar
Un objeto JToolBar crea una barra de herramientas para la insercin de componentes dentro de una fila o una columna. Normalmente las barras de herramientas proporcionan acceso a funcionalidades que tambin se encuentran en tems de mens.

En esta figura se aprecia un toolbar creado en una aplicacin distribuida

Ejemplo de creacin de un Toolbar:


En el l siguiente ejemplo crearemos una barra de herramientas con tres botones dentro de la barra como se muestra en la imagen.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

144

import javax.swing.*; public class EjSwing extends JFrame{ static JFrame formulario = new JFrame(); //Creamos un toolbar con nombre y orientacion horizontal. static JToolBar jtb1 = new JToolBar("Barra de Herramientas",0 ); static JButton bot1 = new JButton("Abrir"); static JButton bot2 = new JButton("Guardar"); static JButton bot3 = new JButton("Imprimir"); // parte principal de programa public static void main(String[] args) { formulario.setTitle("Ejemplo Toolbar"); formulario.setDefaultCloseOperation(formulario.EXIT_ON_CLOSE); //Insertamos los componentes en el Toolbar. jtb1.add(bot1); jtb1.add(bot2); jtb1.add(bot3); // Insertamos tamos el Toolbar en el formulario formulario.getContentPane().add(jtb1); formulario.pack(); formulario.setVisible(true); } } Tambin podemos insertar iconos en la barra de herramientas: ImageIcon ImagenGuardar=new ImageIcon("guardar.gif"); bot1.setIcon(ImagenGuardar); Sus propiedades ms comunes son: Autoscrolls(), Background(), Border(), Foreground(),Floatable(), Insets(), Layout(), ToolTipText(), Visible(), VisibleRect(). Sus eventos ms comunes son: WINDOW: WindowActivated(), ctivated(), WindowClosed(), WindowClosing(), WindowDeactivated(), WindowOpened(). MOUSE: MouseClicked(), MouseDragged(),MouseEntered(), MouseExited(),MouseMoved(), MousePressed(), MouseReleased(). KEY: KeyPressed(), KeyReleased(), KeyTyped(). Bounds(), Margin(), Cursor(), Enabled(), Font(), Name(), Opaque(), Orientation(),

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

145

JPopupM JPopupMenu
Un JPopupMenu es conocido con el nombre de menu contextual, este es el menu que sale normalmente al dar clic derecho en el escritorio o en casi cualquier programa. programa

Creacin de un JPopupMenu
// Demostracin de los objetos JPopupMenu import java.awt.*; import java.awt.event.*; import javax.swing.*; public class PruebaContextual extends JFrame { private JRadioButtonMenuItem elementos[]; private final Color valoresColor[] = { Color.BLUE, Color.YELLOW, Color.RED }; private JPopupMenu Menu menuContextual; // configurar GUI public PruebaContextual() { super( "Uso de objetos JPopupMenu" ); ManejadorEventos manejador = new ManejadorEventos(); String colores[] = { "Azul", "Amarillo", "Rojo" }; // establecer er men contextual y sus elementos ButtonGroup grupoColores = new ButtonGroup(); menuContextual = new JPopupMenu(); elementos = new JRadioButtonMenuItem[ 3 ];

construir cada elemento de men y agregarlo al men contextual; adems adem // permitir el manejo de eventos para cada elemento de men

//

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

146

for ( int cuenta = 0; cuenta < elementos.length; cuenta++ ) { elementos[ cuenta ] = new JRadioButtonMenuItem( colores[ cuenta ] ); menuContextual.add( elementos[ cuenta ] ); grupoColores.add( elementos[ cuenta ] ); elementos[ cuenta ].addActionListener( manejador ); } getContentPane().setBackground( Color.WHITE ); // declarar un objeto MouseListener para la ventana que muestra // un objeto JPopupMenu cuando ocurre el evento de desencadenamiento del men contextual getContentPane().addMouseListener( new MouseAdapter() { // clase interna annima a // manejar evento de oprimir botn del ratn public void mousePressed( MouseEvent evento ) { checkForTriggerEvent( evento ); } // manejar evento de soltar el botn del ratn rat public void mouseReleased( MouseEvent evento ) { checkForTriggerEvent( evento ); } // determinar si evento debe desencadenar el men contextual private void checkForTriggerEvent( checkForTriggerEven MouseEvent evento ) { if ( evento.isPopupTrigger() ) menuContextual.show( evento.getComponent(), evento.getX(), evento.getY() ); } } // fin de la clase interna annima ); // fin de la llamada a addMouseListener setSize( 300, 200 ); setVisible( true ); } // fin del constructor de PruebaContextual public static void main( String args[] ) { JFrame.setDefaultLookAndFeelDecorated(true); Frame.setDefaultLookAndFeelDecorated(true); PruebaContextual aplicacion = new PruebaContextual(); aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } // clase interna privada para manejar eventos de elemento de men private class ManejadorEventos implements ActionListener {

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

147

// procesar selecciones de elementos de men public void actionPerformed( ActionEvent evento ) { // determinar cul elemento de men fue seleccionado for ( int i = 0; i < elementos.length; i++ ) if ( evento.getSource() == elementos[ i ] ) { getContentPane().setBackground( valoresColor[ i ] ); return; } } } // fin de la clase interna privada ManejadorEventos Manej } // fin de la clase PruebaContextual

Ver Video: Unidad 14. CrearToolBar

Unidad 15 : Hilos
Introduccin
Todos los ejemplos que hemos realizado hasta este punto han sido desarrollados con un solo hilo de ejecucin, es decir, nicamente realizamos una tarea. La programacin multihilo o multitarea permitir lanzar varias acciones dentro de un mismo programa, de e esta manera podremos realizar distintas tareas simultneamente. El sistema con el que estemos trabajando se encargar de la ejecucin concurrente de ambas tareas. Es importante comentar que cada thread se ejecutar de forma absolutamente independiente. Cada C uno trabaja como si tuviese un microprocesador para el solo. Por lo que si tenemos una zona de datos compartida entre varios threads de modo que puedan intercambiar informacin entre ellos, es necesario usar algn sistema de sincronizacin para evitar que uno de ellos acceda a un grupo de datos que pueden estar a medio actualizar por otro thread.

Clases para trabajar con thread


CLASE Thread DEFINICIN

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

ThreadGroup para gestionar dicho grupo.

Un objeto de este tipo representa a un conjunto de Threads y proporciona mtodos

148

Un objeto Thread representa a una tarea en ejecucin. Aqu se implementan mtodos que van a permitir gestionar tareas individualmente.

Ciclo de vida de un thread


Inicio tarea
Cuando se crea una nueva tarea, sta no se arranca automticamente sino que hay que usar el mtodo start().Hasta que no se arranca la tarea, sta permanece en el estado Nueva tarea.

Ejecutar la tarea
Cuando iniciamos una tarea se desencadena la llamada a dos mtodos: start() : Mtodo que crea los recursos necesarios para que la tarea se pueda ejecutar. No conviene sobreescribir este mtodo, el cual se implementa en la clase Thread. run(): Mtodo equivalente al main de las aplicaciones que hemos realizado hasta ahora. En este mtodo es dnde el programador deber poner el cdigo que desea que se ejecute en la tarea.

Detener la tarea
Una tarea se puede detener por los siguientes motivos: Llamando al mtodo sleep(). Cuando la tarea usa su mtodo wait() para para esperar a que se cumpla una condicin. Cuando la tarea queda bloqueada en algn proceso de E/S. Cada una de esas entradas al estado Parada, tiene su vuelta al estado Si paramos una tares se puede volver a ejecutar de la siguiente manera: Si se par con n sleep(), pasado el tiempo especificado. Si se par por una operacin de E/S, cuando dicha operacin se realice. Si se par por wait(), llamando al mtodo notify() o notifyAll() y que la condicin por la que se espera se cumpla. Se llamar por tanto a alguno alguno de esos mtodos cuando la variable que controla condicin vare.

Primer ejemplo de hilos

Ejemplo1.java

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

149

En el siguiente ejemplo creamos tres clases, la clase principal(Ejemplo1.java) lanza la segunda clase que es un programa que muestra la hora(hora.java), adems lanzar la tercera clase que es un programa que solicita informacin por teclado(teclado.java).

public class Ejemplo1{ public static void main(String args[]) { Teclado t1=new Teclado(); Hora t2=new Hora(); t2.start(); new Thread(t1).start(); } Hora.java import java.util.*; public class Hora extends Thread{ public Hora(){ System.out.println("Constructor de Hora"); } public void run(){ Date fecha=new Date(); System.out.println("Mtodo Run de Teclado"); try{ for (int i=0;i<15;++i){ System.out.println("Fecha: "+ fecha.toString()); sleep(5000); } } catch(InterruptedException e){ System.out.println("ERROR"); } } } Teclado.java import java.io.*;

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

150

public class Teclado implements Runnable{ BufferedReader bin; public Teclado(){ System.out.println("Constructor de Teclado"); bin=new BufferedReader(new InputStreamReader(System.in)); } public void run(){ String linea=""; System.out.println("Mtodo Run de Teclado"); try{ for (int i=0;i<15;++i){ System.out.println("Introduzca lnea de texto:"); linea=bin.readLine(); System.out.println("Usted escribi: "+linea); } } catch(IOException e){ System.out.println("ERROR"); } } } SALIDA DEL PROGRAMA:

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

151

Mtodos de la clase Thread


start()
Este mtodo indica al intrprete de Java que cree un contexto del hilo del sistema y comience a ejecutarlo. A continuacin, el mtodo run() de este hilo ser invocado en el nuevo contexto del hilo. Hay que tener precaucin de no llamar al mtodo start() ms de una vez sobre un hilo determinado.

run()
El mtodo run() constituye el cuerpo de un hilo en ejecucin. Este es el nico mtodo del interfaz Runnable. nnable. Es llamado por el mtodo start() despus de que el hilo apropiado del sistema se haya inicializado. Siempre que el mtodo run() devuelva el control, el hilo actual se detendr.

stop()
Este mtodo provoca que el hilo se detenga de manera inmediata. A menudo constituye una manera brusca de detener un hilo, especialmente si este mtodo se ejecuta sobre el hilo en curso. En tal caso, la lnea inmediatamente posterior a la llamada al mtodo stop() no llega a ejecutarse jams, pues el contexto del hilo muere uere antes de que stop() devuelva el control. Una forma ms elegante de detener un hilo es utilizar alguna variable que ocasione que el mtodo run() termine de manera ordenada

currentThread()
Este mtodo devuelve el objeto thread que representa al hilo de ejecucin que se est ejecutando actualmente.

sleep( long )
El mtodo sleep() provoca que el intrprete ponga al hilo en curso a dormir durante el nmero de milisegundos que se indiquen en el parmetro de invocacin. Una vez transcurridos esos milisegundos, os, dicho hilo volver a estar disponible para su ejecucin. Los relojes asociados a la mayor parte de los intrpretes de Java no sern capaces de obtener precisiones mayores de 10 milisegundos, por mucho que se permita indicar hasta nanosegundos en la llamada lla alternativa a este mtodo.

yield()

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

152

Este mtodo hace que el intrprete cambie de contexto entre el hilo actual y el siguiente hilo ejecutable disponible. Es una manera de asegurar que nos hilos de menor prioridad no sufran inanicin.

suspend()
El mtodo suspend() es distinto de stop(). suspend() toma el hilo y provoca que se detenga su ejecucin sin destruir el hilo de sistema subyacente, ni el estado del hilo anteriormente en ejecucin. Si la ejecucin de un hilo se suspende, puede llamarse a resume() resume() sobre el mismo hilo para lograr que vuelva a ejecutarse de nuevo.

resume()
El mtodo resume() se utiliza para revivir un hilo suspendido. No hay garantas de que el hilo comience a ejecutarse inmediatamente, ya que puede haber un hilo de mayor prioridad priori en ejecucin actualmente, pero resume() ocasiona que el hilo vuelva a ser un candidato a ser ejecutado.

getPriority()
Este mtodo devuelve la prioridad del hilo de ejecucin en curso, que es un valor comprendido entre uno y diez.

setPriority( int )
El l mtodo setPriority() asigna al hilo la prioridad indicada por el valor pasado como parmetro. Hay bastantes constantes predefinidas para la prioridad, definidas en la clase Thread, tales como MIN_PRIORITY, NORM_PRIORITY y MAX_PRIORITY, que toman los valores valo 1, 5 y 10, respectivamente. Como gua aproximada de utilizacin, se puede establecer que la mayor parte de los procesos a nivel de usuario deberan tomar una prioridad en torno a NORM_PRIORITY. Las tareas en segundo plano, como una entrada/salida a red o el nuevo dibujo de la pantalla, deberan tener una prioridad cercana a MIN_PRIORITY. Con las tareas a las que se fije la mxima prioridad, en torno a MAX_PRIORITY, hay que ser especialmente cuidadosos, porque si no se hacen llamadas a sleep() o yield(), se puede provocar que el intrprete Java quede totalmente fuera de control.

getName()
Este mtodo devuelve el valor actual, de tipo cadena, asignado como nombre al hilo en ejecucin mediante setName().

setName( String )
Este mtodo permite identificar al al hilo con un nombre menmnico. De esta manera se facilita la depuracin de programas multihilo. El nombre mnemnico aparecer en todas las lneas de trazado que se muestran cada vez que el intrprete Java imprime excepciones no capturadas.

El mtodo wait() permite a un hilo pausar su ejecucin hasta que se le notifique que ocurri algo de lo que se tiene que encargar.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

Los mtodos wait(), notify() y notifyAll() deben ser llamados desde un contexto sincronizado.

153

Uso de Wait y Notify

El mtodo notify() se utiliza tiliza para enviar una seal a un y solo un hilo que se encuentra esperando. El mtodo notify() no permite especificar que hilo en espera se va a notificar. El mtodo notifyAll() funciona del mismo modo que notify, a diferencia que enva seales a todos los lo hilos esperando por un objeto.

Ejemplo del uso de estos mtodos


En el siguiente ejemplo usamos los mtodos wait() y notify() con el objetivo de hacer esperar al lector hasta que el escritor rellene los nuevos campos.

Principal.java import java.io.*; public class Principal{ public static void main (String args[]) throws IOException{ Ficha f1=new Ficha("hola","hola","hola",1); Ficha[] fichas={f1}; Actualiza ac=new Actualiza(fichas); Leer le=new Leer(fichas,ac); ac.start(); le.start(); } } Leer.java import java.io.*; public class Leer extends Thread{ Ficha[] fichas; Actualiza ac; public Leer(Ficha[] fichas, Actualiza ac){ System.out.println("Constructor de Leer");

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

154

this.fichas=fichas; this.ac=ac;

} public void run(){ System.out.println("Mtodo Run de Leer"); leer(); } public void leer(){ try{ ac.sincronizar(true); System.out.println(fichas[0].texto()); sleep(5000); } catch(InterruptedException e){ System.out.println(e.toString()); } } } Ficha.java /** Objeto que contiene los datos y operaciones de una Ficha de la Agenda. */ public class Ficha implements java.io.Serializable { protected String nombre; protected String apellidos; protected String direccion; protected int telefono; /** Construye una Ficha nueva con sus datos. */ public Ficha(String nombre, String apellidos, String direccion, int telefono) { this.nombre=nombre; this.apellidos=apellidos; this.direccion=direccion;

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

155

this.telefono=telefono; } /** Devuelve el texto con el contenido de esta Ficha. */ public String texto() { String texto="________________________________________\n"+ texto="________________________________________ "Nombre : "+nombre+"\n"+ "Apellidos: "+apellidos+"\n"+ "Direccion: "+direccion+"\n"+ "Telefono : "+telefono+"\n"+ "________________________________________ "________________________________________\n"; return texto; } } Actualiza.java import java.io.*; public class Actualiza extends Thread{ BufferedReader bin; Ficha [] fichas; public Actualiza(Ficha[] fichas){ System.out.println("Constructor de Actualiza"); bin=new BufferedReader(new InputStreamReader(System.in)); this.fichas=fichas; } public void run(){ System.out.println("Mtodo Run de Actualiza"); actualiza(); } // El mtodo wait() y notify() deben estar dentro de un mtodo // sincronizado. Con una variable boolena controlamos si hay // que ejecutar wait o notify. public synchronized void sincronizar(boolean b){ if (b){ try{ wait();

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

156

} catch(InterruptedException e){ System.out.println(e.toString()); } } else{ notifyAll(); } } public void actualiza(){ String linea=""; System.out.println("Comenzando la actualizacin"); try{ System.out.println("Introduzca nombre:"); fichas[0].nombre=bin.readLine(); System.out.println("Introduzca apellidos:"); fichas[0].apellidos=bin.readLine(); System.out.println("Introduzca direccion:"); fichas[0].direccion=bin.readLine(); System.out.println("Introduzca telefono:"); fichas[0].telefono=Integer.parseInt(bin.readLine()); sincronizar(false); } catch(IOException e){ System.out.println("ERROR"); } } }

Sincronizac Sincronizacin
Uso
La cuestin cuando se trabaja con threads es que la ejecucin avanza en varias partes del programa a la vez. Cada una de esas ejecuciones simultneas pueden tocar los mismos objetos.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

157

Los mtodos synchronized previenen que ms de un hilo acceda al cdigo de un mtodo crtico simultneamente. Para sincronizar un bloque de cdigo, se debe especificar un argumento que es el objeto que se utilizara como cerradura para la sincronizacin. Se puede utilizar la palabra clave synchronized como un modificador modificador de un mtodo, o como un iniciador de un bloque de cdigo sincronizado. Mientras que solo un hilo puede acceder al cdigo sincronizado de una instancia en particular, mltiples hilos pueden acceder al cdigo no sincronizado de una misma instancia. Cuando un hilo se duerme, su cerradura no se encuentra disponibles para otros hilos.

Ejemplo de sincronizacin
En el ejemplo anterior podemos modificar la clase Ficha de tal manera que las operaciones de lectura queden bloqueadas hasta que terminen las de escritu escritura. import java.io.*; public class Ficha implements java.io.Serializable { protected String nombre; protected String apellidos; protected String direccion; protected int telefono; /** Construye una Ficha nueva con sus datos. */ public Ficha(String String nombre, String apellidos, String direccion, int telefono) { this.nombre=nombre; this.apellidos=apellidos; this.direccion=direccion; this.telefono=telefono; } /** Devuelve el texto con el contenido de esta Ficha. */ public String texto() { String texto="________________________________________\n"+ texto="________________________________________ "Nombre : "+nombre+"\n"+ "Apellidos: "+apellidos+"\n"+ "Direccion: "+direccion+"\n"+ "Telefono : "+telefono+"\n"+ "____________________________ "________________________________________\n"; return texto; }

switch (opcion){

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

BufferedReader bin=new BufferedReader(new InputStreamReader(System.in));

158

public synchronized void operar(int opcion){

case 1: try{ System.out.println("Introduzca nombre:"); this.nombre=bin.readLine(); System.out.println("Introduzca apellidos:"); this.apellidos=bin.readLine(); System.out.println("Introduzca direccion:"); this.direccion=bin.readLine(); System.out.println("Introduzca telefono:"); this.telefono=Integer.parseInt(bin.readLine()); } catch(IOException e){ System.out.println("ERROR"); } break; case 2: System.out.println(this.texto()); break; } System.out.println("Saliendo del mtodo operar"); } }

Unidad 16 : Programacin en red


Introduccin
Java tiene como ventaja frente a otros lenguajes de programacin el que puede programarse en red. Al igual que las personas tenemos nuestro DNI para identificarnos, los ordenadores dentro de la red tienen un identificador la DIRECCIN IP. La comunicacn entre los equipos se realiza mediante dos protocolos de transmisin: TCP/IP: Transmisin Control Protocol / Internet Protocol. UDP: UserDatagramProtocol. Un PROTOCOLO es un conjunto de normas que si se cumple nos asegura una comunicacin. Dependiendo de lo que vaya a hacer usare un protocolo u otro.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

159

TCP/IP: Mas seguro. Enva informacin de una maquina a otra. Esta informacin se enva en tramas que son bloques de informacin que van codificadas c en bytes(0 y 1). Este protocolo enva las tramas, en el caso de producirse perdidas reenviarlas y una vez llegadas al destino ordenarlas. Adems de protocolo se necesita un puerto. Son numricos. Es el mecanismo por el que entra informacin en la maquina o por el que la maquina enva informacin. UDP: Es el protocolo universal de datos. Es el mas rpido y menos seguro. A una direccin manda informacin y no se preocupa de que la direccin exista, le llegue, etc. Valido para intranets. Las tramas si se pierden no se retransmiten y no las ordenan a la llegada.

Clase InetAddress
Esta clase que pertenece al paquete java.Net podemos capturar las direcciones o nombres de las mquinas.

Ejemplo
//Este ejemplo nos dice la direccion de la maquina donde estamos trabajando import java.net.*; public class EjemploInetAddress{ public static void main(String args[]){ try{ InetAddress mimaquina = InetAddress.getLocalHost(); System.out.println("Mi maquina es "+mimaquina); }catch(UnknownHostException e){ System.out.println("No encuentro el servidor"); e.printStackTrace(); //Escribe el error que genera } } }

Mtodos de la clase
getLocalHost(): Devuelve el InetAddress.getLocalHost(). nombre de la maquina y la direccin IP. Para llamarlo

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

getHostName(): Devuelve una nombre_objeto.getHostName().

cadena

con

el

nombre

de

la

mquina.

Para

llamarlo

160

getHostAddress(): Devuelve una nombre_objeto.getHostAddress().

cadena

con

la

direccin

IP.

Para

llamarlo

getByName( String): Determina la direccin IP del host a partir del nombre del host. Para llamarlo InetAddress getByName(nombre). getAddress(): Mete la direccin IP en una matriz byte. Para llamarlo miarray= nombre_objeto.getAddress(); getAllByName(): Devuelve todas las direcciones IP en en una matriz a partir del nombre del host. Por ejemplo Sun puede tener con un nombre muchas direcciones IP. Para llamarlo: nombrearray= objetoInetAddres.getAllByName().

Realizar Laboratorio: Uso de la clase InetAddress


Objetivo
Manejar los mtodos ms importantes de la clase InetAddress.

Enunciado
Crear un clase que utilice los mtodos ms importantes de la clase InetAddress y muestre la informacin siguiente:

Mi maquina es .getLocalHost() Pc001/192.168.1.55 Direccion .getHostAddress() 192.168.1.34 Nombre .getHostName() Pc001 Nombre .getByName( nombre)Pc001/192.168.1.55 Con la matriz .getAddress() 192 Con la matriz .getAddress() 168 Con la matriz .getAddress() 1 Con la matriz .getAddress() 55

Solucin:
public class Enjemplo{ public static void main(String args[]){ InetAddress mimaquina; byte matriz[]; try{ //Muestro nombre-ip nombre mimaquina = InetAddress.getLocalHost(); System.out.println("Mi maquina es .getLocalHost() "+mimaquina); //Muestro solo la ip System.out.println("Direccion .getHostAddress() "+

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

161

mimaquina.getHostAddress()); //Muestro el nombre String nombre= mimaquina.getHostName(); System.out.println("Nombre .getHostName() "+nombre); //Muestro un host a partir de un string mimaquina= InetAddress.getByName( nombre); mimaquina= System.out.println("Nombre .getByName( nombre)"+mimaquina); //Muestro la direccion que meti en una matriz matriz= mimaquina.getAddress(); System.out.println("Con la matriz .getAddress()"+ new String(matriz)); for (int i=0; i<matriz.length;i++){ System.out.println("Con la matriz .getAddress() "+_ ((matriz[i]+256)%256)); //Tambien vale System.out.println("Con la matriz .getAddress() "+ ((matriz[i]&255))); } }catch(UnknownHostException e){ System.out.println("ERROR"); e.printStackTrace(); //Escribe el error que genera } } }

Socket
Un Socket es un mtodo para la comunicacin entre un programa del cliente y un programa del servidor en una red. Un socket se define como el punto final en una conexin El Socket es donde el cliente o el servidor escriben la informacin que transferimos. Las clases Socket y ServerSocket del paquete java.net proporcionan un canal de comunicacin independiente del sistema utilizando TCP, cada una de las cuales cuales implementa el lado del cliente y el servidor respectivamente.

Ejemplo
En el siguiente ejemplo nos encargamos de leer la informacin que nos est entrando. import java.net.*; import java.io.*; public class ejSocket{ public static void main(String args[]){ try{ Socket misocket = new Socket("Servidor ",13);

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

162

//Creacin de flujo para recibir datos BufferedReader in = new BufferedReader(new InputStreamReader( misocket.getInputStream())); String texto; while ((texto=in.readLine())!=null){ System.out.println(texto); } //Cerrar el Socket que hemos abierto misocket.close(); }catch (UnknownHostException uhe){ System.out.println("No encuentro el servidor"); }catch (IOException ioe){ System.out.println("Error entrada salida"); } } }

Mtodos de la clase Socket


getInputStream() : Abrir el canal de entrada de informacin getOutputStream(): Abrimos el canal salida close() : Cerramos el Socket InetAddress getInetAddress() : Devuelve un un objeto InetAddress con el nombre y la direccin de la maquina a la que estamos conectados. InetAdress ia:nombre_socket.getInetAdress(); int getPort(): Devuelve el numero de puerto al que estamos conectados. int puerto = n_socket.getPort(); InetAdress getLocalAddress() LocalAddress() : Devuelve nuestra direccin. InetAdress a = nom_socket.getLocalAddress(). int getLocalPort() : Devuelve el puerto desde el que nos conectamos int puerto = n_socket.getLocalPort();

Ejemplo de utilizacin de algunos de los mtodos

public static void main(String args[]){

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

import java.io.*; import java.net.*; public class Cliente{

163

try{ Socket misocket = new Socket("200.200.1.12",8810); BufferedReader in = new BufferedReader(new InputStreamReader( misocket.getInputStream())); / //Leer String texto= in.readLine(); System.out.println(texto); PrintWriter out = new PrintWriter (misocket.getOutputStream(),true); out.println("Hola"); InetAddress a = misocket.getInetAddress(); System.out.println("misocket.getInetAdrress() "+a); System.out.println("misocket.getInetAdrress() System.out.println("Puerto al que estamos conectados_ "+misocket.getPort()); a=misocket.getLocalAddress(); System.out.println("misocket.getLocalAdress()="+a); System.out.println("Puerto desde el que estamos_ conectados "+misocket.getLocalPort());

//Siempre hay que cerrar el Socket que hemos abierto misocket.close(); }catch (UnknownHostException uhe){ System.out.println("No encuentro el servidor"); }catch (IOException ioe){ System.out.println("Error entrada salida"); } } } Podemos limitar el tiempo de espera del cliente a recibir del servidor, si no conecta o no recibe nada salta la excepcin y se desconecta, para que no est esperando infinitamente y que se desconecte tras as el si no ha conseguido conectarse. setSoTimeout( tiempo_milisegundo); //Intento de connexion a un servidor import java.net.*; import java.io.*; import java.util.*; //Para la fecha public class hora { public static void main(String args[]){ try{ System.out.println("La hora de Madrid es: "+new Date()); _

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

164

//Muestro la hora de mi equipo Socket miSocket = new Socket("www.whitehouse.net",13); _ //El puerto que da la hora es el 13 miSocket.setSoTimeout(10000); //Si no conecto en _ 10 segundos me salgo //Abro el flujo de comunicacin BufferedReader in = new BufferedReader(new InputStreamReader_ ( miSocket.getInputStream())); //Muestro lo que nos llega System.out.println("La hora de la Casa Blanca: "+in.readLine()); }catch (InterruptedIOException (Interru e){ //Si en 10 segundos no conecta lanza esta excepcion System.out.println("Interrupted"); e.printStackTrace(); }catch (IOException e){ System.out.println("IO"); e.printStackTrace(); } } }

CLASE URL
Gracias a la clase e URL vamos a tener la posibilidad de descargarnos el cdigo fuente de una pgina html. Luego podemos hacer un programa que interprete ese cdigo y los transforme en elementos java. Tambin nos va a permitir obtener informacin del servidor al que nos conectamos. conectamos. URL: Localizador Uniforme de Recursos. Con esto nos vamos a poder descargar cualquier recurso de la red. Posibilidades: Descargarnos cualquier recurso de la web. Informacin del servidor: fecha de creacin.... Comunicacin de varios ordenadores

Cmo creamos un objeto URL?


URL miurl = new URL (*); Hay muchos constructores, dependiendo de lo que pongamos en vez de *: http://java.sun.com/index.html. La direccin de la pgina, un archivo. http://java.sun.com/products. Con un directorio.

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

165

(nombre_protocolo, _protocolo, nombreHost, puerto, nombre_archivo) (http,java.sun.com,80,FAQ.html)

Ejemplo de como podramos unir dos direcciones


import java.net.*; public class ejemplo_constructor_URL { public static void main (String[] args){ try{ URL url_principal cipal = new URL ("http://java.sun.com/index.html"); URL url_absoluta= new URL (url_principal,"products/jsse/index_103.html"); //Con eso juntaria las dos //Otra podria ser URL url_absoluta= new URL (url_principal,"FAQ.html"); System.out.println(url_absoluta.toString()); }catch(MalformedURLException e){ System.out.println("URL mal formada"); e.printStackTrace(); } } }

Mtodos de la clase URL


String getProtocol() : Devuelve el protocolo del URL. String getHost():Devuelve evuelve el Host del objeto URL. int getPort(): Nos devuelve el puerto del URL. Si no hemos inicializado el URL con el puerto, nos devuelve 1. String getFile(): Devuelve el archivo especificado en el URL. Devuelve null si no lo he especificado.

Ejemplo del uso de estos mtodos


import java.net.*; public class ejemplo_constructor_URL { public static void main (String[] args){ try{ URL url_principal = new URL ("http://java.sun.com/principal.html"); URL url_absoluta= new URL (url_principal,"products/jjj/index5555.html"); System.out.println(url_absoluta.toString()); System.out.println("Protocolo = "+url_absoluta.getProtocol()); System.out.println("Host = "+url_absoluta.getHost());

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

166

System.out.println("Puerto = "+url_absoluta.getPort()); System.out.println("File = "+url_absoluta.getFile()); }catch(MalformedURLException e){ System.out.println("URL mal formada"); e.printStackTrace(); } } }

CLASE URLConnetion
Con la clase URLConnection podemos crea crearnos rnos una conexin como la del Socket pero ms completa. Podremos pedir ms informacin al servidor: fecha de creacin, tipo de fichero al que vamos a acceder...

Pasos para crear una conexin


Creamos un objeto de la clase URL Creamos un objeto de la clase URLConnection con el mtodo openConnection del objeto url URL miurl = new URL (http://www.yahoo.com); URLConnection conexion = miurl.openConnection(); Especificaciones de la conexin: Registrarnos Podemos indicar si queremos tener abiertos canales de entrada y salida. Conectarnos a partir de una fecha (por si queremos que la pgina est actualizada). Para indicar que queremos tener abiertos los canales de entrada y salida se usan: setDoInput (boolean); setDoOutput(boolean); Salida Entrada

Conectarnos ctarnos con el mtodo connect();

Ejemplo
import java.io.*; public class Agenda{ public static void main (String args[]){ try{

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

167

URL miurl = new URL ("http://www.marca.com"); //Abrimos la conexion URLConnection conexion= nexion= miurl.openConnection(); conexion.setDoInput (true); //Miro si ha sido modificada conexion.setIfModifiedSince(100000000); //Nos conectamos conexion.connect(); //Abrimos el canal de entrada BufferedReader in = new BufferedReader( new InputStreamReader _ ( conexion.getInputStream())); String cadena; while((cadena=in.readLine())!=null){ System.out.println(cadena); } }catch(IOException e){ System.out.println(e.toString()); } } }

CLASES DatagramPacket y DatagramSocket


En bloque anteriores hemos visto como enviamos informacin son el protocolo protocolo TCP/IP y si esta informacin llegaba mal la volvamos a enviar. Con los datagramas podemos enviar informacin ms rpida, pero como desventaja la informacin se puede perder. La clase DatagramPacket nos permite elaborar paquetes de informacin. La clase DatagramSocket sirve para enviar y recibir la informacin.

Trabajo con los paquetes


Pasos para el envio de paquetes
1 .Contruimos un paquete con la clase DatagramPacket 2. Creamos un objeto de la clase DatagramSocket. Al hacer el paquete incluimos la direccin y el puerto, no como en Socket que se hace directamente. DatagramSocket dtSocket= new DatagramSocket(); 3. Usamos el mtodo send( DatagramPacket paquete) de DatagramSocket. DtSocket.send (paquete);

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

168

Para recibir un paquete:


Creamos un paquete con la clase DatagramPacket vacio. (Lo llamamos otropaquete). Crear un objeto de la clase DatagramSocket. Ahora si que debemos indicarle el puerto por el que va la informacin. DatagramSocket otroSocket = new DatagramSocket(puerto); DatagramSocket(pue Recibimos el paquete con el mtodo receive ( nombre_paquete); OtroSockect.receive(otropaquete);

Ejemplo de datagramas
/ /Este programa envia una cadena y recibe el eco, recibe lo mismo que envia. // El cliente envia un paquete al servidor y recibe otro o // Clase Cliente import java.net.*; import java.io.*; public class ejemploDatagramasCliente{ public static void main (String args[]){ String servidor="10.32.1.10"; int puerto = 5000; String cadenaUDP = "Prueba ejemplo datagramas" ; //Cadena a enviar byte[] envio = cadenaUDP.getBytes(); try{ InetAddress direccion = InetAddress.getByName(servidor); DatagramPacket paquete = new DatagramPacket( envio, envio.length, _ direccion,puerto); //Creamos objeto DatagraSocket DatagramSocket midatagramSocket = new DatagramSocket(); //Enviamos la informacion rmacion midatagramSocket.send (paquete); byte[] recepcion = paquete.getData(); //Lo inicializo con _ la informacion mandada //Lo sobreescribo for(int i=0; i<paquete.getLength(); i++){ recepcion[i]= (byte)'x'; //Lo lleno de x } System.out.println( new String (paquete.getData())); _ // Aqui mostrara las xxxxx //Falta recibir el paquete de vuelta midatagramSocket.receive(paquete); Socket.receive(paquete); //al llegar aqui _ es programa espera a que le llegue la informacion desde el servidor System.out.println( new String(paquete.getData())); midatagramSocket.close();

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

169

}catch(UnknownHostException e){ }catch(UnknownHostExceptio System.out.println(e.toString()); }catch(SocketException e){ System.out.println(e.toString()); }catch(IOException e){ System.out.println(e.toString()); } } }

//Este programa envia una cadena y recibe el eco, recibe lo mismo que envie //Clase Servidor import java.net.*; import java.io.*; public class ejemploDatagramasServidor{ public static void main (String args[]){ try{ DatagramSocket socketDatagrama = new DatagramSocket Dat (5000); System.out.println("Escuchando en el puerto 5000"); //Lo meto en un bucle infinito para que este escuchando while(true){ DatagramPacket paquete = new DatagramPacket (new byte[20],20); byte[20], //Esperamos a recibir la informacin socketDatagrama.receive(paquete); System.out.println("Recibida llamada en el puerto 5000"); _ //Solo salta si recibo algo //Reenvio la _ informacin recibida, construyo un paquete con la informacin recibida DatagramPacket paqueteenvio = new DatagramPacket(paquete.getData(),_ paquete.getLength(),paquete.getAddress(), paquete.getPort()); socketDatagrama.send(paqueteenvio); } }catch(IOException ioe){ System.out.println(ioe.toString()); } } }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

RMI

170

El sistema de Invocacin Remota de Mtodos (RMI) de Java permite a un objeto que se est ejecutando en una Mquina Virtual Java realizar llamadas a mtodos de otro objeto que est en otra Mquina Virtual Java diferente.

Relacin cliente-servidor
En la parte del servidor tenemos: Aplicacin a la escucha. Objetos a la espera de que sean utilizados. Listado de objetos, esto es lo que llamamos Servicio de nombres en JAVA se llama RMI registry que es una aplicacin que tenemos que levantar para trabajar con co ella. Implementar una clase servidor que: Crea objetos de la clase que nos interesa (clase sirviente). Cuando creamos estos objetos creamos como 3 objetos, en realidad: El objeto remoto(Sirviente). Luego es como si lo clonramos y lo dividiramos en dos Stub y Skeleton. La representacin del objeto (Stub). Esto es lo que se coloca en el servicio de nombres. Registra el stub en el servicio de nombres. Otra representacin del objeto (Skeleton). Los registramos en el servicio de nombres. Clase/s sirviente/s: e/s: clase que genera unos objetos que utilizar el cliente. Tendr mtodos que podr usar el cliente y otros que no. Para ello: Declaramos una interfaz que nos diga los mtodos de los objetos de la clase sirviente a los que podemos acceder. La clase sirviente ente debe implementar este interfaz. En la parte del cliente: Aplicacin cliente: Queremos trabajar con mtodos de objetos que estn en el servidor. La aplicacin cliente preguntar por el objeto que queremos, en el servidor de nombres (listado de objetos). El cliente busca en el listado de objetos y se trae un ente de lo que est en el listado de objetos, se trae una representacin del listado de objetos. Nos traemos representacin del objeto que encuentra en el servicio de nombres stub. Como funcionamos: uncionamos: ponemos a funcionar el servidor, se crearan los objetos, al crearse el stub se registrar en el servicio de nombres. Crear el skeleton. Cuando el cliente llama al servicio de nombres recibe el stub, vamos a tener el stub en los dos sitios. El stub del cliente se va a comunicar con el Skeleton del servidor. El skeleton se comunica con el objeto sirviente.

Ejemplo

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

171

Tendremos cuatro archivos java: Cliente,Clase Servidor,Clase Sirviente e Interfaz

Hacer una aplicacin que devuelve el cuadrado de el factorial de un numero. Un cliente llama a un mtodo del servidor y devuelve el cuadrado del factorial de un nmero. El cuadrado y el factorial lo hacemos en dos mtodos. En el interface solo ponemos el cuadrado. Desde el cliente solo podremos llamar al mtodo cuadrado. Cuadrado llamara al factorial. De momento desde el cliente no pasamos parmetro. ElCliente.java import java.rmi.*; import java.rmi.server.*; public class ElCliente{ public static void main(String args[]){ String url= "rmi://localhost/"; try{ LaInterface inter = (LaInterface) Naming.lookup(url+"Numero"); System.out.println(inter.cuadrado()); }catch(Exception e){ System.out.println(e.toString()); } } } ElServidor.java

import java.rmi.*; import java.rmi.server.*; public class ElServidor{ public static void main(String args[]){ try{ System.out.println("Implementando la clase servidor"); //La clase ProductImpl es la que implementara los objetos ElSirvienteImplementaLaInterface n = new ElSirvienteImplementaLaInterface ElSirvienteImplementaLaInterface (5); System.out.println("Escribiendo en el servicio de nombres"); //Le digo que escriba en el servicio de nombres, para hacer referencia a ello pongo Naming Naming.rebind("Numero",n); //Nmero es una manera de identificar a 5.Desde el _ cliente llamaremos a Numero ,que es como se reconoce al objeto 5 System.out.println("Esperando las llamadas del cliente"); }catch(Exception e){ System.out.println(e.toString()); }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

172

} }

LaInterface.java import java.rmi.*; public interface LaInterface extends Remote{ String cuadrado()throws RemoteException; }

ElSirvienteImplementaLaInterface.java import java.rmi.*; import java.rmi.server.*; //Tiene que heredar de eso e implementar nuestro interface public class ElSirvienteImplementaLaInterface extends _ UnicastRemoteObject implements LaInterface{ int valor; //Nmero de el que calculo el !^2 public ElSirvienteImplementaLaInterface (int n) _ throws RemoteException{ valor=n; System.out.println("Estoy en _ ElSirvienteImplementaLaInterface"); } //--------------------------------------------------------------------------------public String cuadrado() throws RemoteException{ int x= factorial(valor); x=x*x; return "EL FACTORIAL AL CUADRADO DE _ "+ valor+ " ES "+ x; } //----------------------------------------------------------------------------------public int factorial(int n){ //Si no lo calculo int resultado=1; for(int i=1; i<=n;i++){ resultado*=i; } return resultado; } }

www.ceticsa.es Para uso exclusivo de los alumnos de CETICSA S.L.

Pgina

173

Das könnte Ihnen auch gefallen