172
Profesion Módulo 2: Ja nal en Plata Java ava Programming La aforma anguage

JavaModulo2 _2

Embed Size (px)

Citation preview

Page 1: JavaModulo2 _2

Profesional en Plataforma

Módulo 2: Java Programming Language

Profesional en Plataforma

Java

Módulo 2: Java Programming Language

Profesional en Plataforma

Módulo 2: Java Programming Language

Page 2: JavaModulo2 _2

©

Módulo 2: Java Programming Language

Unidad 1. Introducción

Unidad 2. Programación orientada a

Unidad 3. Identificadores, palabras y tipos

Unidad 4. Expresiones y control de flujo

Unidad 5. Arreglos

Unidad 6. Diseño de clases

Unidad 7. Características avanzadas de clases

Unidad 8. Excepciones y Aserciones

Unidad 9. Colecciones y

Unidad 10. Fundamentos de Entrada y salida

Unidad 11. Consola de entrada y salida y ficheros de entrada y salida

Unidad 12. Construcción de interfaces de usuario Java mediante APIs

Unidad 13. Manejando eventos

Unidad 14. Aplicaciones basadas en GUI

Unidad 15. Hilos

Unidad 16. Redes

Para uso exclusivo de los alumnos de CETICSA S.L.

Contenido

Módulo 2: Java Programming Language

Introducción

Programación orientada a objetos

Identificadores, palabras y tipos

Expresiones y control de flujo

rreglos

Diseño de clases

Características 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

Construcción de interfaces de usuario Java mediante APIs

Manejando eventos

licaciones basadas en GUI

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página3

generalidades de infraestructura

Consola de entrada y salida y ficheros de entrada y

Construcción de interfaces de usuario Java

Page 3: JavaModulo2 _2

©

Unidad 1 : Introducción

Sun Microsystems es la empresa que ha inventado el lenguaje Java, en un intento de resolver simultáneamente todos los problemas que se planteaban a los desarrolladores de software por la proliferación de arquitecturas incompatibles en los siguientes aspect

- Diferentes máquinas desde el punto de vista del hardware.- Diferentes sistemas operativos.- Diferentes sistemas de ventanas que funcionan sobre una misma máquina.

Estos problemas se han agravado aún más con la expansión de Internet en la cual deben comunicarse plataformas heterogéneas, y dónde las aplicaciones distribuidas son el corazón del sistema.

El éxito de Java reside en su arquitectura y las características que esta arquitectura le confiere.

Introducción En la arquitectura de Java es dónde se encuentra la solución al problema planteado en la introducción. El siguiente dibujo intenta resumir dicha arquitectura:

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

Para uso exclusivo de los alumnos de CETICSA S.L.

Unidad 1 : Introducción

Sun Microsystems es la empresa que ha inventado el lenguaje Java, en un intento de resolver simultáneamente todos los problemas que se planteaban a los desarrolladores de software por la proliferación de arquitecturas incompatibles en los siguientes aspectos:

Diferentes máquinas desde el punto de vista del hardware. Diferentes sistemas operativos. Diferentes sistemas de ventanas que funcionan sobre una misma máquina.

Estos problemas se han agravado aún más con la expansión de Internet en la cual deben nicarse plataformas heterogéneas, y dónde las aplicaciones distribuidas son el corazón del

El éxito de Java reside en su arquitectura y las características que esta arquitectura le confiere.

Arquitectura de Java

En la arquitectura de Java es dónde se encuentra la solución al problema planteado en la El siguiente dibujo intenta resumir dicha arquitectura:

Los programas se compilan a un fichero (*.class) intermedio, en un lenguaje creado por Sun tecodes). Este fichero luego es interpretado por una máquina virtual java (JVM). Por tanto,

interpretable.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página4

Unidad 1 : Introducción

Sun Microsystems es la empresa que ha inventado el lenguaje Java, en un intento de resolver simultáneamente todos los problemas que se planteaban a los desarrolladores de software por la

Diferentes sistemas de ventanas que funcionan sobre una misma máquina.

Estos problemas se han agravado aún más con la expansión de Internet en la cual deben nicarse plataformas heterogéneas, y dónde las aplicaciones distribuidas son el corazón del

El éxito de Java reside en su arquitectura y las características que esta arquitectura le confiere.

Arquitectura de Java

En la arquitectura de Java es dónde se encuentra la solución al problema planteado en la

Los programas se compilan a un fichero (*.class) intermedio, en un lenguaje creado por Sun tecodes). Este fichero luego es interpretado por una máquina virtual java (JVM). Por tanto,

Page 4: JavaModulo2 _2

©

La Especificación de la Máquina Virtual Java la define como:

Una máquina imaginaria implementadcódigo para la máquina virtual Java se almacena en archivos .class, cada uno de los cuales contiene, al menos, el código para una clase pública.

La especificación de la máquina virtual java propoque se compila toda la tecnología java. Esta especificación permite al software en java ser independiente de la plataforma ya que la compilación se hace para una máquina genérica conocida como la máquina virtual java (JVM). Esta puede ser emulada por software para poder ser ejecutada en los diferentes sistemas informáticos existentes, o bien ser implementada en hardware.

A partir del código fuente el compilador genera bytecodes. Estos bytecodes son instruccicódigo máquina para la JVM. Cada intérprete de java tiene una implementación de la JVM.

La especificación de la JVM proporciona definiciones muy concretas para la implementación 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.

Gran parte de los lenguajes de programación permiten la reserva de memoria en tiempo de ejecución. El proceso de reserva de memoria varía seinvolucra 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 ejecución debería liberar esa memoria.

En C, C++, y otros lenguajes, el programador es responsable de la gestión de la liberación 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 utiliejecución cuando ya no queda memoria disponible en el sistema. Se dice que estos programas tienen fugas de memoria ("memory

Java libera al programador de la responsabilidad de liberar la menoria. El lenguaje java pruna hebra de ejecución, 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 opera

El proceso de "Garbage collection" se realiza automáticamente durante el ciclo de vida de un programa java, eliminando la necesidad de liberar memoria y evitando las pérdidas de memoria. Sin embargo, la implementación del gestor de "garbage collectidiferentes implementaciones de la JVM.

Para uso exclusivo de los alumnos de CETICSA S.L.

La máquina virtual Java (JVM).

La Especificación de la Máquina Virtual Java la define como:

Una máquina imaginaria implementada mediante la emulación por software en una máquina real. El código para la máquina virtual Java se almacena en archivos .class, cada uno de los cuales contiene, al menos, el código para una clase pública.

La especificación de la máquina virtual java proporciona las especificaciones de hardware para las que se compila toda la tecnología java. Esta especificación permite al software en java ser independiente de la plataforma ya que la compilación se hace para una máquina genérica conocida

tual java (JVM). Esta puede ser emulada por software para poder ser ejecutada en los diferentes sistemas informáticos existentes, o bien ser implementada en hardware.

A partir del código fuente el compilador genera bytecodes. Estos bytecodes son instruccicódigo máquina para la JVM. Cada intérprete de java tiene una implementación de la JVM.

La especificación de la JVM proporciona definiciones muy concretas para la implementación de:

Conjunto de instrucciones (equivalente al de la CPU).

Formato de los archivos de clase.

El Garbage collection

Gran parte de los lenguajes de programación permiten la reserva de memoria en tiempo de ejecución. El proceso de reserva de memoria varía según 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"), ción debería liberar esa memoria.

En C, C++, y otros lenguajes, el programador es responsable de la gestión de la liberación 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 pueden generar errores de ejecución cuando ya no queda memoria disponible en el sistema. Se dice que estos programas tienen fugas de memoria ("memory-links").

Java libera al programador de la responsabilidad de liberar la menoria. El lenguaje java pruna hebra de ejecución, 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 operación.

El proceso de "Garbage collection" se realiza automáticamente durante el ciclo de vida de un programa java, eliminando la necesidad de liberar memoria y evitando las pérdidas de memoria. Sin embargo, la implementación del gestor de "garbage collection" puede variar sustancialmente en las

es implementaciones de la JVM.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página5

La máquina virtual Java (JVM).

a mediante la emulación por software en una máquina real. El código para la máquina virtual Java se almacena en archivos .class, cada uno de los cuales contiene,

rciona las especificaciones de hardware para las que se compila toda la tecnología java. Esta especificación permite al software en java ser independiente de la plataforma ya que la compilación se hace para una máquina genérica conocida

tual java (JVM). Esta puede ser emulada por software para poder ser ejecutada en los diferentes sistemas informáticos existentes, o bien ser implementada en hardware.

A partir del código fuente el compilador genera bytecodes. Estos bytecodes son instrucciones de código máquina para la JVM. Cada intérprete de java tiene una implementación de la JVM.

La especificación de la JVM proporciona definiciones muy concretas para la implementación de:

El Garbage collection

Gran parte de los lenguajes de programación permiten la reserva de memoria en tiempo de gún 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"),

En C, C++, y otros lenguajes, el programador es responsable de la gestión de la liberación de memoria. Esta es una tarea complicada a veces porque no siempre se sabe a priori cuando se puede

zada pueden generar errores de ejecución cuando ya no queda memoria disponible en el sistema. Se dice que estos programas

Java libera al programador de la responsabilidad de liberar la menoria. El lenguaje java proporciona una hebra de ejecución, 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

El proceso de "Garbage collection" se realiza automáticamente durante el ciclo de vida de un programa java, eliminando la necesidad de liberar memoria y evitando las pérdidas de memoria. Sin

on" puede variar sustancialmente en las

Page 5: JavaModulo2 _2

©

Ya hemos visto que el código fuente de Java se compila en el sentido de que se convierten a un conjunto de bytecodes.

En el momento de la ejecución, los diferentes archivos bytecodes que componen el programa a ejecutar se cargan, se verifican y se ejecutan en el intérprete. La función del intérprete es doble:

Por un lado ejecuta los bytecodes y por otro gestiona las llam

El entorno de ejecución que ejecuta el código compilado para una JVM realiza tres tareas principales:

Carga el código: Lo realiza el cargador de clases.

Verificación del código: Lo realiza el verificador de bytecode.

Ejecución del código: Lo realiza el intérprete de bytecode.

El cargador de clases. Su función es cargar todas las clases necesarias para la ejecución de un programa.

Además, mantiene separadas aquellas clases cargadas a partir del sistema de archivos local y aquellas otras cargadas a través de los recursos de la red. Esto permite limitar la acción de posibles aplicaciones dañinas, 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 mEn este momento se asigna direcciones de memoria reales a las referencias simbólicas del código y se rellena la tabla de asignación de memoria. Debido a que el proceso de asignación de memoria se realiza en el momento de la ejecuciautorizado a las áreas de código.

Verificador de bytecode. El código de java se verifica mediante diferentes test antes de ejecutarse en la máquina. La JVM verifica el formato de los diferentes 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 verificación se resuelve si el código cumple las especificaciones de la JVM y no viola la integridad del sistema. Si la verificación se completa con éxito, se puede asegurar lo siguiente:

Las clases cumplen con el formato de ar

No hay violaciones de acceso restringido.

El código no provoca desbordamientos de la pila.

Los tipos de parámetros para todo el código es correcto y no se modificará durante la ejecución.

No existen conversiones ilegales de datos, por ejemplo, convertir enteros a referencias a objetos.

Los accesos a los campos de los objetos están autorizados.

Para uso exclusivo de los alumnos de CETICSA S.L.

Seguridad del código

Ya hemos visto que el código fuente de Java se compila en el sentido de que se convierten a un

En el momento de la ejecución, los diferentes archivos bytecodes que componen el programa a ejecutar se cargan, se verifican y se ejecutan en el intérprete. La función del intérprete es doble:

Por un lado ejecuta los bytecodes y por otro gestiona las llamadas al hardware del sistema.

El entorno de ejecución que ejecuta el código compilado para una JVM realiza tres tareas

Carga el código: Lo realiza el cargador de clases.

Verificación del código: Lo realiza el verificador de bytecode.

n del código: Lo realiza el intérprete de bytecode.

Su función es cargar todas las clases necesarias para la ejecución de un programa.

Además, mantiene separadas aquellas clases cargadas a partir del sistema de archivos local y ellas otras cargadas a través de los recursos de la red. Esto permite limitar la acción de posibles

aplicaciones dañinas, 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 mEn este momento se asigna direcciones de memoria reales a las referencias simbólicas del código y se rellena la tabla de asignación de memoria. Debido a que el proceso de asignación de memoria se realiza en el momento de la ejecución, el intérprete de java añade protección contra acceso no

El código de java se verifica mediante diferentes test antes de ejecutarse en la máquina. La JVM verifica el formato de los diferentes fragmentos de bytecode en busca de código ilegal 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

En el proceso de verificación se resuelve si el código cumple las especificaciones de la JVM y no viola la integridad del sistema. Si la verificación se completa con éxito, se puede asegurar lo siguiente:

Las clases cumplen con el formato de archivo de clase de la especificación JVM.

No hay violaciones de acceso restringido.

El código no provoca desbordamientos de la pila.

Los tipos de parámetros para todo el código es correcto y no se modificará durante la ejecución.

gales de datos, por ejemplo, convertir enteros a referencias a objetos.

Los accesos a los campos de los objetos están autorizados.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página6

Seguridad del código

Ya hemos visto que el código fuente de Java se compila en el sentido de que se convierten a un

En el momento de la ejecución, los diferentes archivos bytecodes que componen el programa a ejecutar se cargan, se verifican y se ejecutan en el intérprete. La función del intérprete es doble:

adas al hardware del sistema.

El entorno de ejecución que ejecuta el código compilado para una JVM realiza tres tareas

Su función es cargar todas las clases necesarias para la ejecución de un programa.

Además, mantiene separadas aquellas clases cargadas a partir del sistema de archivos local y ellas otras cargadas a través de los recursos de la red. Esto permite limitar la acción de posibles

aplicaciones dañinas, 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 de la aplicación. En este momento se asigna direcciones de memoria reales a las referencias simbólicas del código y se rellena la tabla de asignación de memoria. Debido a que el proceso de asignación de memoria se

ón, el intérprete de java añade protección contra acceso no

El código de java se verifica mediante diferentes test antes de ejecutarse en la máquina. La JVM fragmentos de bytecode en busca de código ilegal - código 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

En el proceso de verificación se resuelve si el código cumple las especificaciones de la JVM y no viola la integridad del sistema. Si la verificación se completa con éxito, se puede asegurar lo siguiente:

chivo de clase de la especificación JVM.

Los tipos de parámetros para todo el código es correcto y no se modificará durante la ejecución.

gales de datos, por ejemplo, convertir enteros a referencias a objetos.

Page 6: JavaModulo2 _2

©

Introducción. La arquitectura presentada en el punto anterior proporciona unas características a Java que ningún otro lenguaje de programación tiene:

Robusto.

Java realiza verificaciones en busca de problemas tanto en tiempo de compilación como en tiempo de ejecución. En tiempo de compilación no tiene ningún misterio porque todos los lenguajes realizan esas verificaciones, sin embargo, en tiempo de ejecución, la JVM, que realiza la interpretación de los bytecodes, detecta cuando existe algún problema en la ejecución deque pueden ser recogidas por el programador con el propósito de recuperarse de dichos errores.

Arquitectura neutral (multiplataforma).

Gracias a que la compilación se realiza a un código objeto independiente de la arquitectmáquina (bytecodes), tan sólo necesitamos utilizar el intérprete 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 ejecución la realizacomprobaciones antes de ejecutarse en la máquina. En concreto:

El código se pasa a través de un verificador de ByteCodes que comprueba el formato de los fragmentos de código y detecta fragmentos de 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 aplicación del tipo Cbuscan primero entre las locales y luego entre las procedentes del exterior.

Respecto a la seguridad del código fuente, el propio JDK proporciona un desensamblador de ByteCodes, que hace que cualquier programa pueda sebytecodes. Utilizando javap no se obtiene el código fuente original, aunque si desmonta el programa mostrando su estructura. Este problema de seguridad del código fuente es algo todavía pendiente de subsanar.

Portable.

Más allá de la portabilidad básica por ser de arquitectura independiente, Java implementa otros estándares de portabilidad para facilitar el desarrollo.

Los enteros son de 32 bits en complemento a 2.

Para uso exclusivo de los alumnos de CETICSA S.L.

Características de Java

La arquitectura presentada en el punto anterior proporciona unas características a Java que ningún otro lenguaje de programación tiene:

Java realiza verificaciones en busca de problemas tanto en tiempo de compilación como en tiempo En tiempo de compilación no tiene ningún misterio porque todos los lenguajes realizan

esas verificaciones, sin embargo, en tiempo de ejecución, la JVM, que realiza la interpretación de los bytecodes, detecta cuando existe algún problema en la ejecución del programa, y lanza excepciones que pueden ser recogidas por el programador con el propósito de recuperarse de dichos errores.

Arquitectura neutral (multiplataforma).

Gracias a que la compilación se realiza a un código objeto independiente de la arquitectmáquina (bytecodes), tan sólo necesitamos utilizar el intérprete adecuado para que nuestro programa funcione sobre cualquier plataforma. El lema de Sun es "escribir una vez, ejecutar en

Como toda la ejecución la realiza la JVM, los programas Java pueden ser sometidos a muchas comprobaciones antes de ejecutarse en la máquina. En concreto:

El código se pasa a través de un verificador de ByteCodes que comprueba el formato de los fragmentos de código y detecta fragmentos de código ilegal (código 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 aplicación del tipo 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 código fuente, el propio JDK proporciona un desensamblador de ByteCodes, que hace que cualquier programa pueda ser convertido a código fuente a partir de sus bytecodes. Utilizando javap no se obtiene el código fuente original, aunque si desmonta el programa mostrando su estructura. Este problema de seguridad del código fuente es algo todavía pendiente

Más allá de la portabilidad básica por ser de arquitectura independiente, Java implementa otros estándares de portabilidad para facilitar el desarrollo.

Los enteros son de 32 bits en complemento a 2.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página7

Características de Java

La arquitectura presentada en el punto anterior proporciona unas características a Java que ningún

Java realiza verificaciones en busca de problemas tanto en tiempo de compilación como en tiempo En tiempo de compilación no tiene ningún misterio porque todos los lenguajes realizan

esas verificaciones, sin embargo, en tiempo de ejecución, la JVM, que realiza la interpretación de los l programa, y lanza excepciones

que pueden ser recogidas por el programador con el propósito de recuperarse de dichos errores.

Gracias a que la compilación se realiza a un código objeto independiente de la arquitectura de la máquina (bytecodes), tan sólo necesitamos utilizar el intérprete adecuado para que nuestro programa funcione sobre cualquier plataforma. El lema de Sun es "escribir una vez, ejecutar en

la JVM, los programas Java pueden ser sometidos a muchas

El código se pasa a través de un verificador de ByteCodes que comprueba el formato de los código ilegal (código que falsea punteros, viola

El cargador de clases separa el espacio de nombres del sistema de ficheros local del de los recursos aballo de Troya, ya que las clases se

Respecto a la seguridad del código fuente, el propio JDK proporciona un desensamblador de r convertido a código fuente a partir de sus

bytecodes. Utilizando javap no se obtiene el código fuente original, aunque si desmonta el programa mostrando su estructura. Este problema de seguridad del código fuente es algo todavía pendiente

Más allá de la portabilidad básica por ser de arquitectura independiente, Java implementa otros

Page 7: JavaModulo2 _2

©

Java construye sus interfaces de usuario a tréstas puedan ser implantadas en entornos UNIX, Mac o Pc.

Para poder desarrollar software con Java necesitamos una serie de herramientas que nos proporciona Sun a través 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 lenguaje de programación 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

Las reglas sintácticas (estructura) y semánticas (significado) permiten el entendimiento entre las partes que forman la comunicación.

En los lenguajes de programación también encontramos unas reglas sintácticas que debemos respetar a la hora de confeccionar los programas y una semántica encargada de resolver el problema que queremos programar.

Elementos y reglas sintácticas de los lenguajes de programación.Aunque todos los conceptos que aprenderemos a continuaciónprogramación existen diferencias en la implementación 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 más detallposible lo que significa cada una de las órdenes que forman parte del programa, con el propósito de poder recordar en un futuro la función que realiza cada una de ellas, y facilitar su estudio a personas ajenas al programa.

Identificadores. En todo lenguaje de programación surge la necesidad de utilizar una serie de elementos que debemos designar con algún nombre, por ejemplo:

Elemento

Variables - Elementos utilizados para referenciar posiciones de memoria dónde podremos almacenar datos necesarios para el programa.

Funciones - Elementos utilizados para referenciar posiciones de memoria dónde reside el código del programa.

Para uso exclusivo de los alumnos de CETICSA S.L.

Java construye sus interfaces de usuario a través de un sistema abstracto de ventanas de forma que 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 través de su JDK (Java Development Kit).

Al igual que el lenguaje natural que utilizamos para comunicarnos, ya sea de forma oral o por ier lenguaje de programación 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 sintácticas (estructura) y semánticas (significado) permiten el entendimiento entre las partes que forman la comunicación.

En los lenguajes de programación también encontramos unas reglas sintácticas que debemos nfeccionar los programas y una semántica encargada de resolver el

problema que queremos programar.

Elementos y reglas sintácticas de los lenguajes de programación.Aunque todos los conceptos que aprenderemos a continuación aparecen en todos los lenguajesprogramación existen diferencias en la implementación 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 más detallposible lo que significa cada una de las órdenes que forman parte del programa, con el propósito de poder recordar en un futuro la función que realiza cada una de ellas, y facilitar su estudio a personas

odo lenguaje de programación surge la necesidad de utilizar una serie de elementos que debemos designar con algún nombre, por ejemplo:

Descripción

Elementos utilizados para referenciar posiciones de memoria dónde podremos datos necesarios para el programa.

Elementos utilizados para referenciar posiciones de memoria dónde reside el código del programa.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página8

avés de un sistema abstracto de ventanas de forma que

Desarrollo con Java

Para poder desarrollar software con Java necesitamos una serie de herramientas que nos

Al igual que el lenguaje natural que utilizamos para comunicarnos, ya sea de forma oral o por ier lenguaje de programación dispone de unos elementos y reglas que deben

Los elementos del lenguaje natural nos permiten designar cosas (nombres), expresar cualidades de

Las reglas sintácticas (estructura) y semánticas (significado) permiten el entendimiento entre las

En los lenguajes de programación también encontramos unas reglas sintácticas que debemos nfeccionar los programas y una semántica encargada de resolver el

Elementos y reglas sintácticas de los lenguajes de programación. aparecen en todos los lenguajes de

programación existen diferencias en la implementación en cada uno de ellos lo que obliga a un

Un aspecto importante a la hora de confeccionar un programa es comentar lo más detalladamente posible lo que significa cada una de las órdenes que forman parte del programa, con el propósito de poder recordar en un futuro la función que realiza cada una de ellas, y facilitar su estudio a personas

odo lenguaje de programación surge la necesidad de utilizar una serie de elementos que

Elementos utilizados para referenciar posiciones de memoria dónde podremos

Elementos utilizados para referenciar posiciones de memoria dónde reside el

Page 8: JavaModulo2 _2

©

Objetos - Elementos que encapsulan variables (propiedades) y funciones (métodos) de manera que resulta más simplificando el diseño de programas complejos.

etc. - Conforme avancemos iremos conociendo más elementos de los lenguajes de programación.

A la hora de asignar nombre a todos estos elementos hay que

Tipos de datos básicos. El modelo mental más sencillo que se puede tener de una aplicación informática 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 cuáles deben salguna variable, pueden ser de diferente naturaleza (numéricos, alfanuméricos, etc.).

Cada lenguaje de programación dispone de unos tipos de datos básicos a los cuáles nos tenemos que amoldar a la hora de realizar el análisis de los datos que necesitamos en nuestra aplicación.

Variables. Este elemento juega un papel muy importante en el programa porque es el mecanismo que pone a nuestra disposición el lenguaje de programación para gestionar de una manela aplicación.

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

Al asignar un valor a la variable lo que estamos haciendo es almacenar el dato en la posición de memoria que se reservó para dicha variable.

En todo momento tenemos que tener presente que al usar la variable realmedato al que representa.

Operadores. Una de las primeras aplicaciones de los ordenadores fue el cálculo de matemático y, aunque ahora ha pasado a un segundo plano, los lenguajes de programación ofrecen una serie de elementos que permiten realizar operaciones con los datos.

Estas operaciones no sólo se limitan a operaciones aritméticas. Disponemos también de operaciones lógicas, comparaciones, etc.

Sentencias de control. Sin embargo, la característica que confiere al ordenador su potencia es la capacidad de procesamiento de la que dispone.

Para uso exclusivo de los alumnos de CETICSA S.L.

Elementos que encapsulan variables (propiedades) y funciones (métodos) de manera que resulta más sencillo modelar los problemas que queremos resolver simplificando el diseño de programas complejos.

Conforme avancemos iremos conociendo más elementos de los lenguajes de

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

modelo mental más sencillo que se puede tener de una aplicación informática es el de una caja negra que recibe unos datos de entrada, los procesa y entrega unos datos de salida representados

Estos datos de entrada, los cuáles deben ser albergados en memoria y referenciados mediante alguna variable, pueden ser de diferente naturaleza (numéricos, alfanuméricos, etc.).

Cada lenguaje de programación dispone de unos tipos de datos básicos a los cuáles nos tenemos realizar el análisis de los datos que necesitamos en nuestra aplicación.

Este elemento juega un papel muy importante en el programa porque es el mecanismo que pone a el lenguaje de programación para gestionar de una mane

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 posición de memoria que se reservó para dicha variable.

En todo momento tenemos que tener presente que al usar la variable realme

Una de las primeras aplicaciones de los ordenadores fue el cálculo de matemático y, aunque ahora ha pasado a un segundo plano, los lenguajes de programación ofrecen una serie de elementos que

miten realizar operaciones con los datos.

Estas operaciones no sólo se limitan a operaciones aritméticas. Disponemos también de operaciones

Sin embargo, la característica que confiere al ordenador su potencia es la capacidad de

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página9

Elementos que encapsulan variables (propiedades) y funciones (métodos) de sencillo modelar los problemas que queremos resolver

Conforme avancemos iremos conociendo más elementos de los lenguajes de

seguir unas reglas.

modelo mental más sencillo que se puede tener de una aplicación informática es el de una caja negra que recibe unos datos de entrada, los procesa y entrega unos datos de salida representados

er albergados en memoria y referenciados mediante alguna variable, pueden ser de diferente naturaleza (numéricos, alfanuméricos, etc.).

Cada lenguaje de programación dispone de unos tipos de datos básicos a los cuáles nos tenemos realizar el análisis de los datos que necesitamos en nuestra aplicación.

Este elemento juega un papel muy importante en el programa porque es el mecanismo que pone a el lenguaje de programación para gestionar de una manera sencilla los datos de

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

Al asignar un valor a la variable lo que estamos haciendo es almacenar el dato en la posición de

En todo momento tenemos que tener presente que al usar la variable realmente estamos usando el

Una de las primeras aplicaciones de los ordenadores fue el cálculo de matemático y, aunque ahora ha pasado a un segundo plano, los lenguajes de programación ofrecen una serie de elementos que

Estas operaciones no sólo se limitan a operaciones aritméticas. Disponemos también de operaciones

Sin embargo, la característica que confiere al ordenador su potencia es la capacidad de

Page 9: JavaModulo2 _2

©

Aunque esto nos pueda asustar, el tipo de procesamiento que puede realizar es muy básico, limitándose a:

Tomar decisiones sobre la ejecución o no de determinadas tareas en base al cumplimiento o no de una o varias condiciones (sentencias de decisión). En dichas condiciones siempre estarán implicados datos (o si se quiere, sus representantes las variables).

Alterar el flujo de ejecución normal del código del programa (sentencias de salto o bucles). También estas alteraciones estarán controladas por variables.

La combinación adecuada de este tipo de sentencias es la que definirá la estructura que resuelve un determinado problema.

Almac enamiento de datos mediante Arrays. Hemos visto el uso de variables como mecanismo básico para almacenar y acceder a datos en memoria. Sin embargo, en la mayoría de aplicaciones este tipo de almacenamiento de información se queda corto por ser demasiado scomplejos pero también más potentes.

Uno de estos sistemas, que aparece en todos los lenguajes de programación, es el de los Arrays.

Excepciones. Todos los lenguajes de programación avisan de los errcompilación, pero pocos son los que han sido diseñados para seguir avisando de posibles errores en tiempo de ejecución. Las aplicaciones Java, gracias a que se ejecutan bajo la supervisión de la máquina virtual (JVM), están siendo controladas constantemente. En caso de que ocurra algún error de ejecución, se lanza una excepción que puede ser recogida y tratada por el programador en su aplicación. De esta manera, lo que antes solía terminar en una ejecución anormal del programjava puede ser resuelto.

Objetos. Java es un lenguaje de programación orientado a objetos. La importancia de este tema es tal que le dedicamos el siguiente capítulo entero.

Unidad 2: Programación Orientada a Objetos

Introducción. El programador debe conocer cuál es su situación respecto a la máquina que va a programar y qué personajes, junto con él, son importantes a la hora de desarrollar una aplicación. Cada uno de estos personajes tiene un punto de vista diferente que describimo

Desarrollador del lenguaje de programación. Su conocimiento de la máquina es profundo debido a que debe desarrollar la aplicación que ayudará al programador a realizar su trabajo. En un principio se desarrollaban los lenguajes de programmicroprocesador. Esto dio lugar a lenguajes como C, Pascal, etc.

Para uso exclusivo de los alumnos de CETICSA S.L.

Aunque esto nos pueda asustar, el tipo de procesamiento que puede realizar es muy básico,

ejecución o no de determinadas tareas en base al cumplimiento o no de una o varias condiciones (sentencias de decisión). En dichas condiciones siempre estarán implicados datos (o si se quiere, sus representantes las variables).

n normal del código del programa (sentencias de salto o bucles). También estas alteraciones estarán controladas por variables.

La combinación adecuada de este tipo de sentencias es la que definirá la estructura que resuelve un

enamiento de datos mediante Arrays. Hemos visto el uso de variables como mecanismo básico para almacenar y acceder a datos en memoria. Sin embargo, en la mayoría de aplicaciones este tipo de almacenamiento de información se queda corto por ser demasiado simple y necesitamos a sistemas de almacenamiento más complejos pero también más potentes.

Uno de estos sistemas, que aparece en todos los lenguajes de programación, es el de los Arrays.

Todos los lenguajes de programación avisan de los errores que cometamos en tiempo de compilación, pero pocos son los que han sido diseñados para seguir avisando de posibles errores en tiempo de ejecución. Las aplicaciones Java, gracias a que se ejecutan bajo la supervisión de la

siendo controladas constantemente. En caso de que ocurra algún error de ejecución, se lanza una excepción que puede ser recogida y tratada por el programador en su aplicación. De esta manera, lo que antes solía terminar en una ejecución anormal del program

Java es un lenguaje de programación orientado a objetos. La importancia de este tema es tal que le dedicamos el siguiente capítulo entero.

Unidad 2: Programación Orientada a Objetos

El programador debe conocer cuál es su situación respecto a la máquina que va a programar y qué personajes, junto con él, son importantes a la hora de desarrollar una aplicación. Cada uno de estos personajes tiene un punto de vista diferente que describimos a continuación:

Desarrollador del lenguaje de programación. Su conocimiento de la máquina es profundo debido a que debe desarrollar la aplicación que ayudará al programador a realizar su trabajo. En un principio se desarrollaban los lenguajes de programación 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.

Página1

0

Aunque esto nos pueda asustar, el tipo de procesamiento que puede realizar es muy básico,

ejecución o no de determinadas tareas en base al cumplimiento o no de una o varias condiciones (sentencias de decisión). En dichas condiciones siempre estarán implicados

n normal del código del programa (sentencias de salto o bucles). También

La combinación adecuada de este tipo de sentencias es la que definirá la estructura que resuelve un

Hemos visto el uso de variables como mecanismo básico para almacenar y acceder a datos en memoria. Sin embargo, en la mayoría de aplicaciones este tipo de almacenamiento de información

imple y necesitamos a sistemas de almacenamiento más

Uno de estos sistemas, que aparece en todos los lenguajes de programación, es el de los Arrays.

ores que cometamos en tiempo de compilación, pero pocos son los que han sido diseñados para seguir avisando de posibles errores en tiempo de ejecución. Las aplicaciones Java, gracias a que se ejecutan bajo la supervisión de la

siendo controladas constantemente. En caso de que ocurra algún error de ejecución, se lanza una excepción que puede ser recogida y tratada por el programador en su aplicación. De esta manera, lo que antes solía terminar en una ejecución anormal del programa, con

Java es un lenguaje de programación orientado a objetos. La importancia de este tema es tal que le

Unidad 2: Programación Orientada a Objetos

El programador debe conocer cuál es su situación respecto a la máquina que va a programar y qué personajes, junto con él, son importantes a la hora de desarrollar una aplicación. Cada uno de estos

s a continuación:

Desarrollador del lenguaje de programación. Su conocimiento de la máquina es profundo debido a que debe desarrollar la aplicación que ayudará al programador a realizar su trabajo. En un principio

ación utilizando el lenguaje de ensamble del

Page 10: JavaModulo2 _2

©

Posteriormente, estos lenguajes se han podido utilizar para el desarrollo de tecnologías de programación más potentes como C++, y éste a su vez eJava. El lenguaje de programación proporciona las herramientas necesarias (API, entorno de desarrollo, etc.) al siguiente personaje: el programador de aplicaciones.

Programador de aplicaciones. Su conocimiento sutiliza para el desarrollo de sus aplicaciones. No necesita conocer la máquina tan en profundidad como el desarrollador de lenguajes de programación, sin embargo, ese conocimiento extra ayuda a comprender lo que se está realizando y, por tanto, facilita el desarrollo de aplicaciones. Su función principal es utilizar todas las herramientas que le ofrece un lenguaje de programación para desarrollar aplicaciones fáciles de usar (usabilidad) destinadas al siguie

Usuario. Su conocimiento del ordenador suele ser escaso, por no decir nulo, y su función es la de utilizar las aplicaciones que ha desarrollado el programador.

Un ejemplo puede aclarar todo lo expuesto anteriormente. Veamos cómo cada uno de estos personajes.

Desarrollador del lenguaje de programación. Este personaje conoce la manera que se ha diseñado en la máquina para contabilizar el tiempo. El reloj de tiempo real (RTC) incorpora un contador dónde se almacenan los milisegundos que han transcurrido desde el 1momento. Conocido el origen de coordenadas y los milisegundos que han transcurrido, se puede obtener mediante la aplicación de un algoritmo matemático el día, meencontramos, y la hora con una precisión de milisegundos. Por tanto, el desarrollador de un lenguaje de programación, para acceder hasta la hora del sistema, tendría que acceder al dato almacenado en el RTC mediante la lectura del pueconversión, lo que requiere un conocimiento del funcionamiento de la máquina determinado.

Programador. Aprovechando que el desarrollador del lenguaje de programación ha implementado el código de más bajo nivel para acceder a la hora del sistema, puede ofrecer este código al programador para simplificarle la forma de acceso. Una parte fundamental de un lenguaje de programación es el API que ofrece al programador. En él se encuentra todo el código que ha desarrollado el desarrollador del lenguaje de programación y que puede utilizar el programador en sus aplicaciones. La evolución de las tecnologías de programación ha dado lugar a dos tipos de lenguaje de programación (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 representación en la aplicación.

En este tema aprenderemos los conceptos de la programación orientada a objetos.

- El desarrollador de lenguajes de programación debe pensar en facilitar al programador su trabajo, el desarrollo de aplicaciones informáticas, ofreciéndole unas herrofrezcan:

Para uso exclusivo de los alumnos de CETICSA S.L.

Posteriormente, estos lenguajes se han podido utilizar para el desarrollo de tecnologías de programación más potentes como C++, y éste a su vez es el que se ha utilizado en el desarrollo de Java. El lenguaje de programación proporciona las herramientas necesarias (API, entorno de desarrollo, etc.) al siguiente personaje: el programador de aplicaciones.

Programador de aplicaciones. Su conocimiento suele centrarse en el lenguaje de programación que utiliza para el desarrollo de sus aplicaciones. No necesita conocer la máquina tan en profundidad como el desarrollador de lenguajes de programación, sin embargo, ese conocimiento extra ayuda a

o que se está realizando y, por tanto, facilita el desarrollo de aplicaciones. Su función principal es utilizar todas las herramientas que le ofrece un lenguaje de programación para desarrollar aplicaciones fáciles de usar (usabilidad) destinadas al siguiente personaje: el usuario.

Usuario. Su conocimiento del ordenador suele ser escaso, por no decir nulo, y su función es la de utilizar las aplicaciones que ha desarrollado el programador.

Un ejemplo puede aclarar todo lo expuesto anteriormente. Veamos cómo realiza el acceso a la hora

Desarrollador del lenguaje de programación. Este personaje conoce la manera que se ha diseñado en la máquina para contabilizar el tiempo. El reloj de tiempo real (RTC) incorpora un contador dónde e almacenan los milisegundos que han transcurrido desde el 1-1-1970 a las 00:00:00

momento. Conocido el origen de coordenadas y los milisegundos que han transcurrido, se puede obtener mediante la aplicación de un algoritmo matemático el día, mes y año en el que nos encontramos, y la hora con una precisión de milisegundos. Por tanto, el desarrollador de un lenguaje de programación, para acceder hasta la hora del sistema, tendría que acceder al dato almacenado en el RTC mediante la lectura del puerto dónde está situado e implementar el algoritmo de conversión, lo que requiere un conocimiento del funcionamiento de la máquina determinado.

Programador. Aprovechando que el desarrollador del lenguaje de programación ha implementado el nivel para acceder a la hora del sistema, puede ofrecer este código al

programador para simplificarle la forma de acceso. Una parte fundamental de un lenguaje de programación es el API que ofrece al programador. En él se encuentra todo el código que ha

sarrollado el desarrollador del lenguaje de programación y que puede utilizar el programador en sus aplicaciones. La evolución de las tecnologías de programación ha dado lugar a dos tipos de lenguaje de programación (y por tanto a dos tipos de API).

API orientado a objetos. Por ejemplo, el objeto Date es que se debe utilizar para acceder a la hora

Usuario. Simplemente visualizará la hora del sistema tal y como el programador haya realizado la

En este tema aprenderemos los conceptos de la programación orientada a objetos.

El desarrollador de lenguajes de programación debe pensar en facilitar al programador su trabajo, el desarrollo de aplicaciones informáticas, ofreciéndole unas herr

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

1

Posteriormente, estos lenguajes se han podido utilizar para el desarrollo de tecnologías de s el que se ha utilizado en el desarrollo de

Java. El lenguaje de programación proporciona las herramientas necesarias (API, entorno de

uele centrarse en el lenguaje de programación que utiliza para el desarrollo de sus aplicaciones. No necesita conocer la máquina tan en profundidad como el desarrollador de lenguajes de programación, sin embargo, ese conocimiento extra ayuda a

o que se está realizando y, por tanto, facilita el desarrollo de aplicaciones. Su función principal es utilizar todas las herramientas que le ofrece un lenguaje de programación para

nte personaje: el usuario.

Usuario. Su conocimiento del ordenador suele ser escaso, por no decir nulo, y su función es la de

realiza el acceso a la hora

Desarrollador del lenguaje de programación. Este personaje conoce la manera que se ha diseñado en la máquina para contabilizar el tiempo. El reloj de tiempo real (RTC) incorpora un contador dónde

1970 a las 00:00:00 hasta este momento. Conocido el origen de coordenadas y los milisegundos que han transcurrido, se puede

s y año en el que nos encontramos, y la hora con una precisión de milisegundos. Por tanto, el desarrollador de un lenguaje de programación, para acceder hasta la hora del sistema, tendría que acceder al dato almacenado

rto dónde está situado e implementar el algoritmo de conversión, lo que requiere un conocimiento del funcionamiento de la máquina determinado.

Programador. Aprovechando que el desarrollador del lenguaje de programación ha implementado el nivel para acceder a la hora del sistema, puede ofrecer este código al

programador para simplificarle la forma de acceso. Una parte fundamental de un lenguaje de programación es el API que ofrece al programador. En él se encuentra todo el código que ha

sarrollado el desarrollador del lenguaje de programación y que puede utilizar el programador en sus aplicaciones. La evolución de las tecnologías de programación ha dado lugar a dos tipos de

API orientado a objetos. Por ejemplo, el objeto Date es que se debe utilizar para acceder a la hora

Usuario. Simplemente visualizará la hora del sistema tal y como el programador haya realizado la

En este tema aprenderemos los conceptos de la programación orientada a objetos.

El desarrollador de lenguajes de programación debe pensar en facilitar al programador su trabajo, el desarrollo de aplicaciones informáticas, ofreciéndole unas herramientas que le

Page 11: JavaModulo2 _2

©

Las diferentes tecnologías de programación se diferencian en la manera que ofrecen de estructurar los datos y el código que forman una aplicación.

A la hora de plantear el análisis del problema que se quiere resolver por software, todas las tecnologías han optado por dividir dicho problema en parte más pequeñas. La estrategia a seguir es conseguir una estructura en la que cada una de esas partes realcoordinadas por una parte principalinteracción con el usuario. En la actualidad esta interacción se realiza a través de un entorno gráfico y las órdenes se generan mediante eventos.

En los lenguajes procedimentales, orientados a funciones, la estructura se realiza tomando como referencia el código. Cada una de esas partes se denomina subrutina, procedimiento o función dependiendo del lenguaje en el que nos 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{ // Definición de propiedades --> Características del elemento que describimos con la clase.// Definición de los métodos --> Comportamiento y funcionalidades del elemento.}

Analizaremos algunos conceptos básicos para poder comprender el concepto de propiedad (variables), métodos (funciones) y lógicas de funcionamiento.

En este primer ejemplo podemos observar que creamos una clase coche.

Las propiedades de la clase representan características del coche: estado, velocidad actual, velocidad máxima,…

Los métodos representan acciones que podemos realizar sobre el coche: montar, bajar, salir,...

La lógica de funcionamiento se implementa en el código de cada método

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");

Para uso exclusivo de los alumnos de CETICSA S.L.

Las diferentes tecnologías de programación se diferencian en la manera que ofrecen de estructurar los datos y el código que forman una aplicación.

A la hora de plantear el análisis del problema que se quiere resolver por software, todas las tecnologías han optado por dividir dicho problema en parte más pequeñas. La estrategia a seguir es conseguir una estructura en la que cada una de esas partes realice una tarea única e indivisible, coordinadas por una parte principal que obtiene la información de lo que hay que hacer de su interacción con el usuario. En la actualidad esta interacción se realiza a través de un entorno gráfico

n mediante eventos.

En los lenguajes procedimentales, orientados a funciones, la estructura se realiza tomando como referencia el código. Cada una de esas partes se denomina subrutina, procedimiento o función dependiendo del lenguaje en el que nos encontremos.

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:

> Características del elemento que describimos con la clase.> Comportamiento y funcionalidades del elemento.

Analizaremos algunos conceptos básicos para poder comprender el concepto de propiedad (variables), métodos (funciones) y lógicas de funcionamiento.

En este primer ejemplo podemos observar que creamos una clase coche.

Las propiedades de la clase representan características del coche: estado, velocidad actual,

os representan acciones que podemos realizar sobre el coche: montar, bajar, salir,...

La lógica de funcionamiento se implementa en el código de cada método

static boolean estado=false;

Montar en el coche"); Comenzar");

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

2

Clases

Las diferentes tecnologías de programación se diferencian en la manera que ofrecen de estructurar

A la hora de plantear el análisis del problema que se quiere resolver por software, todas las tecnologías han optado por dividir dicho problema en parte más pequeñas. La estrategia a seguir es

ice una tarea única e indivisible, que obtiene la información de lo que hay que hacer de su

interacción con el usuario. En la actualidad esta interacción se realiza a través de un entorno gráfico

En los lenguajes procedimentales, orientados a funciones, la estructura se realiza tomando como referencia el código. Cada una de esas partes se denomina subrutina, procedimiento o función

En los lenguaje orientados a objetos, la estructura se realiza tomando como referencia los datos.

> Características del elemento que describimos con la clase.

Analizaremos algunos conceptos básicos para poder comprender el concepto de propiedad

Las propiedades de la clase representan características del coche: estado, velocidad actual,

os representan acciones que podemos realizar sobre el coche: montar, bajar, salir,...

Page 12: JavaModulo2 _2

©

System.out.println("3.- Parar"); System.out.println("4.- Salir del coche"); System.out.println(""); System.out.println("Introduzca una opción");} public static void montar(){ if (estado==false){ System.out.println("Ya estás 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 } else{ ++velocidad; System.out.println("Velocidad actual= "+velocidad); } menu(); } public static void parar(){ if (velocidad==0){ System.out.println("Si estás parado porque frenas"); } else{ System.out.println("El frenado 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.");

Para uso exclusivo de los alumnos de CETICSA S.L.

Parar"); Salir del coche");

System.out.println("Introduzca una opción");

System.out.println("Ya estás encima del coche.");

System.out.println("Ya estabas arriba, no intentes subir otra vez.");

System.out.println("Primero sube al coche");

if (velocidad== VMAXIMA){ System.out.println("Ya no puedes acelerar más");

System.out.println("Velocidad actual= "+velocidad);

System.out.println("Si estás parado porque frenas");

nado se realiza de golpe");

System.out.println ("No te has subido y ya te bajas");

System.out.println("Primero frena y luego baja");

System.out.println("Acabas de bajar del coche.");

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

3

System.out.println("Ya estabas arriba, no intentes subir otra vez.");

Page 13: JavaModulo2 _2

©

} 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(); case 2: comenzar(); case 3:parar(); case 4: salirCoche (); default:System.out.println("No existe la opción"); } } catch( NumberFormatException e){ System.out.println("La opción debe ser un número"); } }while (true); } }

Para uso exclusivo de los alumnos de CETICSA S.L.

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

BufferedReader i=new BufferedReader(new InputStreamReader(System.in));String opcion;

opcion=i.readLine();

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 opción");

catch( NumberFormatException e){

System.out.println("La opción debe ser un número");

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

4

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

System.out.println("La opción debe ser un número");

Page 14: JavaModulo2 _2

©

Tipos de clases. abstract

Una clase abstract tiene al menos un método 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. 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 tienen que ser importadas.

synchronizable

Este modificador especifica que todos los métodos 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 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 declaración de una variable dentro de la definición 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 de instancia de un objeto de la siguiente manera:

Nombreobjeto.nombrevariabledeinstancia

Estas variables deben ser declaradas fuera de los métodos y dentro de la clase, y son del tipo global por lo que las pueden utilizar cualquier método no estático dmétodos estáticos es necesario instanciar la clase.

Variables estáticas. Si al definir una variable le anteponemos la palabra static conseguimos que todos los objetos de dicha clase compartan dicha variable. Es decir ealgún objeto modifica la variable, quedará modificada para todos los objetos.

Si queremos acceder a una variable de clase no es necesario instanciar ningún objeto de dicha clase, basta con usar:

Nombredeclase.nombredevariableestática

Para uso exclusivo de los alumnos de CETICSA S.L.

tiene al menos un método abstracto. Una clase abstracta no se instancia, sino que se utiliza como clase base para la herencia.

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

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

rimero tienen que ser importadas.

Este modificador especifica que todos los métodos 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

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.

La declaración de una variable dentro de la definición de una clase por defecto es una variable de instancia. Con esto queremos decir que todo objeto que instanciemos de esa clase contiene su

es de instancia de un objeto de la siguiente manera:

Nombreobjeto.nombrevariabledeinstancia

Estas variables deben ser declaradas fuera de los métodos y dentro de la clase, y son del tipo global por lo que las pueden utilizar cualquier método no estático de esa clase, pero para acceder desde métodos estáticos es necesario instanciar la clase.

Si al definir una variable le anteponemos la palabra static conseguimos que todos los objetos de dicha clase compartan dicha variable. Es decir existe una única copia de dicha variable, por tanto, si algún objeto modifica la variable, quedará modificada para todos los objetos.

Si queremos acceder a una variable de clase no es necesario instanciar ningún objeto de dicha clase,

bredeclase.nombredevariableestática

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

5

tiene al menos un método abstracto. Una clase abstracta no se instancia, sino

se declara como la clase que termina una cadena de herencia. No se puede heredar

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

Este modificador especifica que todos los métodos 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

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.

La declaración de una variable dentro de la definición de una clase por defecto es una variable de instancia. Con esto queremos decir que todo objeto que instanciemos de esa clase contiene su

es de instancia de un objeto de la siguiente manera:

Estas variables deben ser declaradas fuera de los métodos y dentro de la clase, y son del tipo global e esa clase, pero para acceder desde

Si al definir una variable le anteponemos la palabra static conseguimos que todos los objetos de xiste una única copia de dicha variable, por tanto, si

algún objeto modifica la variable, quedará modificada para todos los objetos.

Si queremos acceder a una variable de clase no es necesario instanciar ningún objeto de dicha clase,

Page 15: JavaModulo2 _2

©

En este ejemplo definimos una variable estática para la velocidad máxima 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 máxima 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 modificación una vez que sea declarada e inicializada.

Poniendo la palabra final con una variable o clase estát

Si intentamos modificar el valor de la variable nos dará error.

En este ejemplo intentaremos modificar la velocidad máxima a la que puede ir un coche. Como la variable que controla la velocidad máxima es final comprobare

public class Coche{ … … … static final int VMAXIMA=120;//Velocidad máxima a la que podemos circular.… … … } public class Conductor { public static void main(String args[]){ Coche.VMAXIMA=180; System.out.prinln(Coche.VMAXIMA); }

Para uso exclusivo de los alumnos de CETICSA S.L.

En este ejemplo definimos una variable estática para la velocidad máxima a la que puede ir un coche, accederemos al valor de la variable sin necesidad de crear una variable de instancia:

static int VMAXIMA=120;//Velocidad máxima a la que podemos circular.

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 modificación una vez que sea declarada e inicializada.

Poniendo la palabra final con una variable o clase estática, se crean constantes de clase.

Si intentamos modificar el valor de la variable nos dará error.

En este ejemplo intentaremos modificar la velocidad máxima a la que puede ir un coche. Como la variable que controla la velocidad máxima es final comprobaremos que nos saltará un error:

static final int VMAXIMA=120;//Velocidad máxima a la que podemos circular.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

6

En este ejemplo definimos una variable estática para la velocidad máxima a la que puede ir un coche, accederemos al valor de la variable sin necesidad de crear una variable de instancia:

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 modificación una vez que sea declarada e inicializada.

ica, se crean constantes de clase.

En este ejemplo intentaremos modificar la velocidad máxima a la que puede ir un coche. Como la mos que nos saltará un error:

Page 16: JavaModulo2 _2

©

Métodos de clase. Los métodos son funciones que pueden ser llamados dentro de la clase o por otras clases.

La implementación siempre será de dos partes: la declaración y el cuerpo:

[ModificadoresAcceso] TipoRetorno nombreMétodo ([lista_de_argumentos]) [excepciones]{CuerpodelMétodo }

La lista de argumentos es opcional. Los parámetros o argumentos se usan para pasar información al cuerpo del método. Los parámetros se pararán a la hora de llamarlos.

El tipo de retorno 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 aplicación que realizó la llamada.

Para devolver un valor se utiliza la palabra clave return.

Si se declara un método anteponiendo la palabra static, éste se convierte en un método estático o de clase. Las características de estos métodos son:

Pueden ser invocados sin necesidad de que haya que instanciar ningún objeto de la clase.

NombreClase.nombreMétodo(...)

Los métodos estáticos sólo tienen acceso a variables de clase o estáticas; 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 través de ese objeto.

Sobrecarga de métodos o polimorfismoEn Java es posible definir dos o más métodos dentro de la misma clase que compartan el mismo nombre pero las declaraciones de sus parámetros deben ser diferentes. A esto es a lo que se conoce como Sobrecarga de Métodos.

La Sobrecarga es uno de los proceprogramación orientada a objetos es la capacidad que tienen los objetos de una clase de responder al mismo mensaje o evento en función de los parámetros utilizados durante su invocación).

En este ejemplo definimos una clase con 3 métodos sobrecargados:

class Principal{ public void Metodo1() { System.out.println(“Metodo sin Argumentos”); } public void Metodo1(int edad) // Sobrecarga con un parámetro { System.out.print(“Metodo con un System.out.println(“ edad= “ +edad); } public void Metodo1(double edad, double año, double mes) //Sobrecarga con tres parámetros {

Para uso exclusivo de los alumnos de CETICSA S.L.

Los métodos son funciones que pueden ser llamados dentro de la clase o por otras clases.

La implementación siempre será de dos partes: la declaración y el cuerpo:

nombreMétodo ([lista_de_argumentos]) [excepciones]{

La lista de argumentos es opcional. Los parámetros o argumentos se usan para pasar información al cuerpo del método. Los parámetros se pararán a la hora de llamarlos.

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 aplicación que realizó la llamada.

Para devolver un valor se utiliza la palabra clave return.

a un método anteponiendo la palabra static, éste se convierte en un método estático o de clase. Las características de estos métodos son:

Pueden ser invocados sin necesidad de que haya que instanciar ningún objeto de la clase.

Los métodos estáticos sólo tienen acceso a variables de clase o estáticas; 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

Sobrecarga de métodos o polimorfismo . En Java es posible definir dos o más métodos dentro de la misma clase que compartan el mismo nombre pero las declaraciones de sus parámetros deben ser diferentes. A esto es a lo que se conoce

La Sobrecarga es uno de los procedimientos mediante el cual Java implementa el polimorfismo(en programación orientada a objetos es la capacidad que tienen los objetos de una clase de responder al mismo mensaje o evento en función de los parámetros utilizados durante su invocación).

e ejemplo definimos una clase con 3 métodos sobrecargados:

System.out.println(“Metodo sin Argumentos”);

public void Metodo1(int edad) // Sobrecarga con un parámetro

System.out.print(“Metodo con un Argumento:”); System.out.println(“ edad= “ +edad);

public void Metodo1(double edad, double año, double mes) //Sobrecarga con tres parámetros

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

7

Los métodos son funciones que pueden ser llamados dentro de la clase o por otras clases.

nombreMétodo ([lista_de_argumentos]) [excepciones]{

La lista de argumentos es opcional. Los parámetros o argumentos se usan para pasar información al

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 aplicación que realizó la llamada.

a un método anteponiendo la palabra static, éste se convierte en un método estático o

Pueden ser invocados sin necesidad de que haya que instanciar ningún objeto de la clase.

Los métodos estáticos sólo tienen acceso a variables de clase o estáticas; 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

En Java es posible definir dos o más métodos dentro de la misma clase que compartan el mismo nombre pero las declaraciones de sus parámetros deben ser diferentes. A esto es a lo que se conoce

dimientos mediante el cual Java implementa el polimorfismo(en programación orientada a objetos es la capacidad que tienen los objetos de una clase de responder al mismo mensaje o evento en función de los parámetros utilizados durante su invocación).

public void Metodo1(double edad, double año, double mes) //Sobrecarga con tres parámetros

Page 17: JavaModulo2 _2

©

System.out.print(“Metodo con tres Argumentos:”); System.out.println(“ edad= “ +edad+ “ año= “ + } } class Prueba{ public static void main (String [] var) { Principal objeto= new Principal(); //Se crea un Objeto de nombre Objeto para llamar a los Métodos Sobrecargados objeto.Metodo1(); objeto.Metodo1a(30); o } }

Unidad 3 : Identificadores, palabras clave y

Introducción. Al igual que el lenguaje natural que utilizamos para comunicarnos, ya sea de forma oral o por escrito, cualquier lenguaje de programación dispone de unos elementos y reglas que deben conocerse a la hora de programar.

Los elementos del lenguaje natural esas cosas (adjetivos), expresar acciones (verbos), etc.

Las reglas sintácticas (estructura) y semánticas (significado) permiten el entendimiento entre las partes que forman la comunicación.

En los lenguajes de programación también encontramos unas reglas sintácticas que debemos respetar a la hora de confeccionar los programas y una semántica encargada de resolver el problema que queremos programar.

Utilizar comentarios en el código fuente

Comentarios en los programasUn aspecto importante a la hora de confeccionar un programa es comentar lo más detalladamente posible lo que significa cada una de las órdenes que forman parte del programa, con el propósito de poder recordar en un futuro la funcajenas al programa.

Sintaxis.

En java hay tres tipos de comentarios:

Para uso exclusivo de los alumnos de CETICSA S.L.

System.out.print(“Metodo con tres Argumentos:”); System.out.println(“ edad= “ +edad+ “ año= “ + año + “ mes= “ + mes );

public static void main (String [] var)

Principal objeto= new Principal(); //Se crea un Objeto de nombre Objeto para llamar a los Métodos Sobrecargadosobjeto.Metodo1(); objeto.Metodo1a(30); objeto.Metodo1(30.2,76.0,8.6);

Unidad 3 : Identificadores, palabras clave y tipos

Al igual que el lenguaje natural que utilizamos para comunicarnos, ya sea de forma oral o por escrito, cualquier lenguaje de programación 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 sintácticas (estructura) y semánticas (significado) permiten el entendimiento entre las partes que forman la comunicación.

los lenguajes de programación también encontramos unas reglas sintácticas que debemos respetar a la hora de confeccionar los programas y una semántica encargada de resolver el problema que queremos programar.

Utilizar comentarios en el código fuente

mentarios en los programas Un aspecto importante a la hora de confeccionar un programa es comentar lo más detalladamente posible lo que significa cada una de las órdenes que forman parte del programa, con el propósito de poder recordar en un futuro la función que realiza cada una de ellas, y facilitar su estudio a personas

En java hay tres tipos de comentarios:

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

8

año + “ mes= “ + mes );

Principal objeto= new Principal(); //Se crea un Objeto de nombre Objeto para llamar a los Métodos Sobrecargados

Unidad 3 : Identificadores, palabras clave y

Al igual que el lenguaje natural que utilizamos para comunicarnos, ya sea de forma oral o por escrito, cualquier lenguaje de programación dispone de unos elementos y reglas que deben

nos permiten designar cosas (nombres), expresar cualidades de

Las reglas sintácticas (estructura) y semánticas (significado) permiten el entendimiento entre las

los lenguajes de programación también encontramos unas reglas sintácticas que debemos respetar a la hora de confeccionar los programas y una semántica encargada de resolver el

Utilizar comentarios en el código fuente

Un aspecto importante a la hora de confeccionar un programa es comentar lo más detalladamente posible lo que significa cada una de las órdenes que forman parte del programa, con el propósito de

ión que realiza cada una de ellas, y facilitar su estudio a personas

Page 18: JavaModulo2 _2

©

Comentario

//..........

/* ........ */

/** ........*/

Los comentarios de documentación, colocados inmediatamente antes de una declaración de variable o función, indican que ese comentario ha de ser colocado en la documentación que se geautomáticamente cuando se usa la herramienta javadoc.

En todo lenguaje de programación surge la necesidad de utilizar una serie de elementos que debemos designar con algún nombre, por ejemplo:

Elemento

Variables - Elementos utilizados para referenciar posiciones de memoria dónde podremos almacenar datos necesarios para el programa.

Funciones - Elementos utilizados para referenciar posiciones de memoria dónde reside el código del programa.

Objetos - Elementos quemanera que resulta más sencillo modelar los problemas que queremos resolver simplificando el diseño de programas complejos.

etc. - Conforme avancemos iremos conociendo más elementos de los lenguprogramación.

Los identificadores sirven para asignar nombre a los diferentes elementos que forman un programa: variables, métodos, clases, objetos, etc.; cualquier cosa que el programador necesite identificar y que esté contemplado por el lengua

En la siguiente tabla se muestran las reglas sintácticas que debemos cumplir a la hora de elegir un identificador:

Para uso exclusivo de los alumnos de CETICSA S.L.

Descripción

Comentario para una sola línea.

Comentario de una o más líneas

Comentario de documentación de una o más líneas.

Los comentarios de documentación, colocados inmediatamente antes de una declaración de variable o función, indican que ese comentario ha de ser colocado en la documentación que se geautomáticamente cuando se usa la herramienta javadoc.

Identificador

En todo lenguaje de programación surge la necesidad de utilizar una serie de elementos que debemos designar con algún nombre, por ejemplo:

Descripción

Elementos utilizados para referenciar posiciones de memoria dónde podremos almacenar datos necesarios para el programa.

Elementos utilizados para referenciar posiciones de memoria dónde reside el código del programa.

Elementos que encapsulan variables (propiedades) y funciones (métodos) de manera que resulta más sencillo modelar los problemas que queremos resolver simplificando el diseño de programas complejos.

Conforme avancemos iremos conociendo más elementos de los lengu

Los identificadores sirven para asignar nombre a los diferentes elementos que forman un programa: variables, métodos, clases, objetos, etc.; cualquier cosa que el programador necesite identificar y que esté contemplado por el lenguaje de programación.

En la siguiente tabla se muestran las reglas sintácticas que debemos cumplir a la hora de elegir un

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

9

Descripción

Comentario de documentación de una o más líneas.

Los comentarios de documentación, colocados inmediatamente antes de una declaración de variable o función, indican que ese comentario ha de ser colocado en la documentación que se genera

Identificadores

En todo lenguaje de programación surge la necesidad de utilizar una serie de elementos que

Elementos utilizados para referenciar posiciones de memoria dónde podremos

Elementos utilizados para referenciar posiciones de memoria dónde reside el

encapsulan variables (propiedades) y funciones (métodos) de manera que resulta más sencillo modelar los problemas que queremos resolver

Conforme avancemos iremos conociendo más elementos de los lenguajes de

Los identificadores sirven para asignar nombre a los diferentes elementos que forman un programa: variables, métodos, clases, objetos, etc.; cualquier cosa que el programador necesite identificar y

En la siguiente tabla se muestran las reglas sintácticas que debemos cumplir a la hora de elegir un

Page 19: JavaModulo2 _2

©

Primer carácter

Siguientes caracteres

Longitud

Mayúsculas / Minúsculas

No se pueden usar

Palabras reservadas En la siguiente tabla tenemos las palabras claves proporcionadas por la documentación de SUN.

abstract

Boolean

Break

Byte

Case

Catch

Char

Class

Const *

Continue

Default

Do

Para uso exclusivo de los alumnos de CETICSA S.L.

Una letra, subrayado ( _ ) o el símbolo de dólar ($).

Pueden ser letras, números o símbolos.

No hay una longitud máxima establecida.

Se distinguen las mayúsculas de las minúsculas.

Palabras clave.

Palabras reservadas.

En la siguiente tabla tenemos las palabras claves proporcionadas por la documentación de SUN.

abstract double Int static

else Interface super

extends Long switch

final Native synchronized

finally New this

float Null throw

for Package throws

goto * Private transient

if Protected try

Continue implements Public void

import Return volatile

instanceof Short while

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página2

0

Una letra, subrayado ( _ ) o el símbolo de dólar ($).

No hay una longitud máxima establecida.

Se distinguen las mayúsculas de las minúsculas.

En la siguiente tabla tenemos las palabras claves proporcionadas por la documentación de SUN.

Page 20: JavaModulo2 _2

©

Convenios para asignar nombres de las clases, varia bles y métodos.Existe un convenio, no obligatorio, a la hora de nombrar las clases, las variables y métodos. Es recomendable seguirlo debido a que ayuda a dar claridad a los programas.

Clases e interfaces - Deberían ser un nombre o una concatenación de ellos. (FacturaEnero)

- Poner en mayúscula la primera letra de cada nombre utilizado.

Métodos - Deberían ser verbos con nombres. (calcularImporte)

- Mismo regla que en clases pero poniendo con minúscula laverbo. Se aconseja no usar el símbolo de subrayado.

Constantes - En mayúsculas.

- Si se usan varias palabras se aconseja separarlas mediante el símbolo de subrayado.

Variables - Deberían ser un nombre o una concatenación de ellos. (can

- El primero de ellos comenzaría en minúscula y el resto en mayúsculas.

Tipos primitivos Java utiliza cuatro tipos de elementos para abarcar todos los posibles datos básicos que podemos necesitar en el desarrollo de una aplicación.

Enteros, reales en coma flotante, booleanos y caracteres.

La siguiente tabla lista los tipos de datos primitivos

Tipo Tamaño/Formato

(enteros)

byte 8-bit en complemento a 2

short 16-bit en complemento a 2

int 32-bit en complemento a 2

long 64-bit en complemento a 2

(reales en coma

Para uso exclusivo de los alumnos de CETICSA S.L.

Convenios para asignar nombres de las clases, varia bles y métodos.Existe un convenio, no obligatorio, a la hora de nombrar las clases, las variables y métodos. Es recomendable seguirlo debido a que ayuda a dar claridad a los programas.

Deberían ser un nombre o una concatenación de ellos. (FacturaEnero)

Poner en mayúscula la primera letra de cada nombre utilizado.

Deberían ser verbos con nombres. (calcularImporte)

Mismo regla que en clases pero poniendo con minúscula laSe aconseja no usar el símbolo de subrayado.

En mayúsculas.

Si se usan varias palabras se aconseja separarlas mediante el símbolo de

Deberían ser un nombre o una concatenación de ellos. (can

El primero de ellos comenzaría en minúscula y el resto en mayúsculas.

Tipos de datos

Java utiliza cuatro tipos de elementos para abarcar todos los posibles datos básicos que podemos necesitar en el desarrollo de una aplicación.

Enteros, reales en coma flotante, booleanos y caracteres.

La siguiente tabla lista los tipos de datos primitivos soportados por Java, sus tamaños y su formato.

Tamaño/Formato Descripción

bit en complemento a 2 Entero con un byte de longitud.

bit en complemento a 2 Entero corto (de 16 bits)

bit en complemento a 2 Entero.

bit en complemento a 2 Entero largo.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página2

1

Convenios para asignar nombres de las clases, varia bles y métodos. Existe un convenio, no obligatorio, a la hora de nombrar las clases, las variables y métodos. Es

Deberían ser un nombre o una concatenación de ellos. (FacturaEnero)

Poner en mayúscula la primera letra de cada nombre utilizado.

Deberían ser verbos con nombres. (calcularImporte)

Mismo regla que en clases pero poniendo con minúscula la primera letra de

Si se usan varias palabras se aconseja separarlas mediante el símbolo de

Deberían ser un nombre o una concatenación de ellos. (cantidadVariable)

El primero de ellos comenzaría en minúscula y el resto en mayúsculas.

Tipos de datos

Java utiliza cuatro tipos de elementos para abarcar todos los posibles datos básicos que podemos

soportados por Java, sus tamaños y su formato.

Entero con un byte de longitud.

Page 21: JavaModulo2 _2

©

flotante)

float 32-bit IEEE 754

double 64-bit IEEE 754

(Texto)

char Carácter Unicode de 16 bits sin signo.

String Cadena de caracteres codificados en Unicode.

(Lógicos)

boolean true o false

En programación, las variables son estructuras de datos que, como su nombre indica, pueden cambiar de contenido a lo largo de la ejecución de un programa. Hay varios tipos de variables que requieren distintas cantidades de memoria para guardar datos.

Siempre las variables tenemos que declararlas antes de usarlas, esta declaración consiste en una sentencia en la que figura el tipo de dato y el nombre que asignamos a la variable. Después de declararla ya podemos asignarle un valor.

Los tres tipos de variable que podemos utilizar

Variables de instancia: Guardan atributos de un objeto.

Variables de clase: Son muy parecidos a las variables de instancia, con la excepción de que los valores que guardan son los mismos para todos los objetossiguiente 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 de cada coche puede ser diferente

class Coches{ static final int VMAXIMA=120;

Para uso exclusivo de los alumnos de CETICSA S.L.

bit IEEE 754 Coma flotante de simple precisión.

bit IEEE 754 Coma flotante de doble precisión.

Carácter Unicode de 16 bits

Un único carácter o carácter aislado. - Un valor tipo char debe ir entre comillas simples.

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"

Un valor booleano (true

variables son estructuras de datos que, como su nombre indica, pueden cambiar de contenido a lo largo de la ejecución de un programa. Hay varios tipos de variables que requieren distintas cantidades de memoria para guardar datos.

mos que declararlas antes de usarlas, esta declaración consiste en una sentencia en la que figura el tipo de dato y el nombre que asignamos a la variable. Después 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 excepción 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 de cada coche puede ser diferente

static final int VMAXIMA=120;

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página2

2

Coma flotante de simple precisión.

Coma flotante de doble precisión.

Un único carácter o carácter aislado. Un valor tipo char debe ir entre comillas

No es un dato primitivo sino una clase pero por su naturaleza lo incluimos como tipo de dato.

para representar secuencias de caracteres y suele traducirse como cadena.

Un dato de este tipo se delimita entre comillas

true or false).

Variables

variables son estructuras de datos que, como su nombre indica, pueden cambiar de contenido a lo largo de la ejecución de un programa. Hay varios tipos de variables que

mos que declararlas antes de usarlas, esta declaración consiste en una sentencia en la que figura el tipo de dato y el nombre que asignamos a la variable. Después de

en java son locales, de instancia y de clase.

Variables de clase: Son muy parecidos a las variables de instancia, con la excepción de que los 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

Page 22: JavaModulo2 _2

©

int Vactual; //... }

Variables locales: Se utilizan dentro de los métodos. En el siguiente ejemplo Vactual es una variable local al método mostrarVelocidad Una variable local existe desde el momento de su definición hasta el final del bloque en el que se encuentra.

public int mostrarVelocidad(){ int Vactual=velocidad*12; return 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.

Aritméticos (Suma, resta, multiplicación, división,decremento). En la siguiente tabla tenemos las operaciones aritméticas que podemos realizar entre dos operadores.

Actúan sobre enteros y números en coma flotante.

El operador + también se utiliza para concatenar cadenas (strings).

En la siguiente tabla tenemos las operaciones aritméticas sobre un solo operando.

Veamos algunos ejemplos que aclaren estos conceptos:

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

Para uso exclusivo de los alumnos de CETICSA S.L.

Variables locales: Se utilizan dentro de los métodos. En el siguiente ejemplo Vactual es una variable en la que guardamos la velocidad actual a la que circula un coche.

Una variable local existe desde el momento de su definición hasta el final del bloque en el que se

public int mostrarVelocidad(){ int Vactual=velocidad*12; return 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.

Aritméticos (Suma, resta, multiplicación, división, resto, incremento y

En la siguiente tabla tenemos las operaciones aritméticas que podemos realizar entre dos

Actúan sobre enteros y números en coma flotante.

El operador + también se utiliza para concatenar cadenas (strings).

En la siguiente tabla tenemos las operaciones aritméticas sobre un solo operando.

Veamos algunos ejemplos que aclaren estos conceptos:

main(String args[])

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página2

3

Variables locales: Se utilizan dentro de los métodos. En el siguiente ejemplo Vactual es una variable en la que guardamos la velocidad actual a la que circula un coche.

Una variable local existe desde el momento de su definición hasta el final del bloque en el que se

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

resto, incremento y

En la siguiente tabla tenemos las operaciones aritméticas que podemos realizar entre dos

En la siguiente tabla tenemos las operaciones aritméticas sobre un solo operando.

Page 23: JavaModulo2 _2

©

int b=2; int s=5; int div1=s/b; // Al convertirlos los operandos en double estas operaciones tienen pérdida int resto1=s%b; //de precisión, por tanto, obtenemos errores de compilación. double div2=s/b; // Sale mal. double resto2=s%b; System.out.println("El valor de "+b+"+"+s+"="+(b+s),20,50); System.out.println("El valor de "+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 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 próposito de no obtener resultados erróneos} }

Operadores relacionales.

Operadores condicionales.

Operadores a nivel de bit.

Para uso exclusivo de los alumnos de CETICSA S.L.

int div1=s/b; // Al convertirlos los operandos en double estas operaciones tienen

int resto1=s%b; //de precisión, por tanto, obtenemos errores de compilación.

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); 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);

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 próposito de no obtener resultados erróneos

Operadores condicionales.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página2

4

int div1=s/b; // Al convertirlos los operandos en double estas operaciones tienen

int resto1=s%b; //de precisión, por tanto, obtenemos errores de compilación.

System.out.println("El valor de "+s+"%"+b+"="+resto1,20,110);

System.out.println("El valor de "+s+"%"+b+"="+resto2,20,150);

//Con divisiones es necesario que tanto el resultado como los v1erandos sean datos tipo double o float

Page 24: JavaModulo2 _2

©

Es interesante observar que la función 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 función AND se usa con datos numéricos.

El operador condicional se usa sobre booleanos.

Veamos algunos ejemplos que aclaren estos conceptos:

Definimos dos datos tipos short y realizamos operaciones lógicas a nivel de bit con ellos. También 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<< 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 código binario de un dato tipo int. Observar que el código sale al Modificar el código 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; } } }

Para uso exclusivo de los alumnos de CETICSA S.L.

Es interesante observar que la función 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 función AND se usa con datos numéricos.

El operador condicional se usa sobre booleanos.

Veamos algunos ejemplos que aclaren estos conceptos:

Definimos dos datos tipos short y realizamos operaciones lógicas a nivel de bit con ellos. También se diferentes desplazamientos sobre uno de los datos.

public static void main(String args[])

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);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 código binario de un dato tipo int. Observar que el código sale al Modificar el código para que salga bien.

public static void main(String args[])

for (int j=0;j<32;++j){

System.out.println(""+((i>>j)&k),(20+s),50);

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página2

5

Es interesante observar que la función 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).

Definimos dos datos tipos short y realizamos operaciones lógicas a nivel de bit con ellos. También se

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);

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 código binario de un dato tipo int. Observar que el código sale al revés.

Page 25: JavaModulo2 _2

©

Operadores de asignación.Una forma de ahorrar tiempo a la hora de escribir expresiones pero que muchas veces lían las cosas innecesariamente.

Operador ternario if-then- else.Sintaxis:

Expresión ? sentencia 1 : sentencia 2

Si la expresión 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 según SUN se refleja en la siguiente tabla (de más prioritario a menos).

Para uso exclusivo de los alumnos de CETICSA S.L.

Operadores de asignación. Una forma de ahorrar tiempo a la hora de escribir expresiones pero que muchas veces lían las cosas

else.

Expresión ? sentencia 1 : sentencia 2

devuelve como resultado true entonces se ejecuta la sentencia 1, en caso contrario,

Precedencia entre operadores. El orden de precedencia según SUN se refleja en la siguiente tabla (de más prioritario a menos).

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página2

6

Una forma de ahorrar tiempo a la hora de escribir expresiones pero que muchas veces lían las cosas

devuelve como resultado true entonces se ejecuta la sentencia 1, en caso contrario,

El orden de precedencia según SUN se refleja en la siguiente tabla (de más prioritario a menos).

Page 26: JavaModulo2 _2

©

Ver

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.

Solución: 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:

Objetivo Comprender el funcionamiento de los tipos primitivos de java.

Enunciado: Imprimir el ascii de los 256 primeros caracteres.

Solución:

Para uso exclusivo de los alumnos de CETICSA S.L.

Ver Video: Casting Conversion

Laboratorio 1: Definiendo tipos de datos

Comprender el funcionamiento de los tipos primitivos de java.

Crear una clase definir dos variables, la primera será float y la segunda double. Imprimir el

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

Comprender el funcionamiento de los tipos primitivos de java.

Imprimir el ascii de los 256 primeros caracteres.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página2

7

Laboratorio 1: Definiendo tipos de datos

Crear una clase definir dos variables, la primera será float y la segunda double. Imprimir el

Definiendo tipos de datos II

Page 27: JavaModulo2 _2

©

public class Ejemplo { public static void main(String args[]) { System.out.println("Decimal System.out.println(" for (int i=0; i<256; ++i){ System.out.println(" "+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.Solución public class Ejemplo { public static void main(String args[]) { boolean b1=tru boolean b2=false; if(b1){ System.out.println("b1 es "+b1); } if(!b2){ System.out.println("b2 es "+b2); } } }

Para uso exclusivo de los alumnos de CETICSA S.L.

public static void main(String args[])

System.out.println("Decimal\t\t\t\tCaracter"); 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

Comprender el funcionamiento de los tipos primitivos de java.

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

public static void main(String args[])

boolean b1=true; boolean b2=false;

System.out.println("b1 es "+b1);

System.out.println("b2 es "+b2);

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página2

8

");

Laboratorio 3: Definiendo tipos de datos III

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

Page 28: JavaModulo2 _2

©

Unidad 4 : Expresiones y control de flujo

Introducción. En la siguiente tabla se resumen las sentencias que proporciona Java para controlar el flujo de un programa:

Tipos

De decisión.

Bucles

Excepciones

Varios

Permite seleccionar la ejecución de distintos fragmentos de código dependiendo del resultado de la valoración de una expresión booleana.

Su sintaxis es la siguiente:

if (expresion_booleana) { // La expresión booleana expresa . . . // código que se ejecuta si la expresión devuelve true . . . } else { . . . // código que se ejecuta si la expresión devuelve false . . . }

El uso de else es opcional.

La expresión booleana puede contener operado

Ejemplo: Detectar si este es par o impar

public class MostrarPares { public static void main(String args[]) { int dato=13; if (dato%2==0){

Para uso exclusivo de los alumnos de CETICSA S.L.

Unidad 4 : Expresiones y control de flujo

En la siguiente tabla se resumen las sentencias que proporciona Java para controlar el flujo de

Tipos Sentencias

De decisión. if-else, switch-case

Bucles for, while, do-while

Excepciones try-catch-finally, throw

Varios break, continue, label: , return

Permite seleccionar la ejecución de distintos fragmentos de código dependiendo del resultado de la valoración de una expresión booleana.

if (expresion_booleana) { // La expresión booleana expresa condiciones

// código que se ejecuta si la expresión devuelve true

// código que se ejecuta si la expresión devuelve false

La expresión booleana puede contener operadores relacionales para encadenar condiciones.

Ejemplo: Detectar si este es par o impar

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.

Página2

9

Unidad 4 : Expresiones y control de flujo

En la siguiente tabla se resumen las sentencias que proporciona Java para controlar el flujo de

if-else

Permite seleccionar la ejecución de distintos fragmentos de código dependiendo del resultado de la

res relacionales para encadenar condiciones.

Page 29: JavaModulo2 _2

©

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

Se utiliza cuando se quieren analizar muchas posibilidades de una única variable o expresión.

Su sintaxis es la siguiente:

switch (expresión) { 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 expresión puede devolver cualquier tipo básico, 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 expresión 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 no pueden analizarse directamente con switch

Ejemplo que nos devuelve el mes dependiendo del val or 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;

Para uso exclusivo de los alumnos de CETICSA S.L.

System.out.println("El dato "+dato+" es par");

System.out.println("El dato "+dato+" es impar");

Se utiliza cuando se quieren analizar muchas posibilidades de una única variable o expresión.

La expresión puede devolver cualquier tipo básico, 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 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

tring no pueden analizarse directamente con switch-case

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

public static void main(String[] args) {

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.

Página3

0

switch-case

Se utiliza cuando se quieren analizar muchas posibilidades de una única variable o expresión.

La expresión puede devolver cualquier tipo básico, y cada uno de los valores especificados en las

La sentencia default es opcional y se ejecutará en todos los casos en el que el valor devuelto por

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

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

Page 30: JavaModulo2 _2

©

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

Este bucle permite establecer la inicialización de la variable que controla el bucle, su variación y la condición de permanencia, en la propia definición del for.

Su sintaxis:

for (inicialización; condición de permanencia; variación){ ... sentencias ... }

La inicialización hace referencia a la variable de control del bucle.

La condición de permanencia es una expresión booleana donde debe encontrarse la variable de control.

La actualización hace referencia a la variable de control.

Ejempl o: Imprimir en un bucle for los 10 primeros número s 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); } } }

Para uso exclusivo de los alumnos de CETICSA S.L.

case 4: System.out.println("Abril"); break; m.out.println("Mayo"); break;

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

Este bucle permite establecer la inicialización de la variable que controla el bucle, su variación y la condición de permanencia, en la propia definición del for.

for (inicialización; condición de permanencia; variación){

La inicialización hace referencia a la variable de control del bucle.

La condición de permanencia es una expresión booleana donde debe encontrarse la variable de

La actualización hace referencia a la variable de control.

o: Imprimir en un bucle for los 10 primeros número s naturales.

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.

Página3

1

for Este bucle permite establecer la inicialización de la variable que controla el bucle, su variación y la

La condición de permanencia es una expresión booleana donde debe encontrarse la variable de

o: Imprimir en un bucle for los 10 primeros número s naturales.

Page 31: JavaModulo2 _2

©

Ejecuta repetidamente un conjunto de sentencias mientras una expresión booleana sea verdadera.

Su sintaxis es:

while (Expresión_booleana) { //Condición de permanencia... sentencias; ... }

Dentro del bucle se deberá alterar la variable que controla de cumplir la condición.

Se puede realizar un bucle infinito pero se debe incluir la salida dentro del bucle.

Ejercicio: Recoger un número 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 número a analizar:"); 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);

Para uso exclusivo de los alumnos de CETICSA S.L.

Ejecuta repetidamente un conjunto de sentencias mientras una expresión booleana sea verdadera.

while (Expresión_booleana) { //Condición de permanencia

Dentro del bucle se deberá alterar la variable que controla el bucle de lo contrario nunca se dejará

Se puede realizar un bucle infinito pero se debe incluir la salida dentro del bucle.

Ejercicio: Recoger un número por teclado e imprimir todos sus divisores.

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

String numero;

BufferedReader teclado=new BufferedReader(new

System.out.println("Introduzca el número a analizar:");

eclado.readLine();

int num=Integer.parseInt(numero); int i=Integer.parseInt(numero);

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.

Página3

2

while Ejecuta repetidamente un conjunto de sentencias mientras una expresión booleana sea verdadera.

el bucle de lo contrario nunca se dejará

Se puede realizar un bucle infinito pero se debe incluir la salida dentro del bucle.

Ejercicio: Recoger un número por teclado e imprimir todos sus divisores.

System.out.println("Introduzca el número a analizar:");

System.out.println(i+" es divisor de "+numero);

Page 32: JavaModulo2 _2

©

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

Igual que el while, pero las sentencias se ejecutan al menos una vez antes de valorar las expresión.

Su sintaxis:

do { ... sentencias; ... } while (Expresión_booleana);

EJEMPLO: Recoger un número por teclado e imPodremos seguir mientras pulsemos la letra “s”.

import java.io.*; public class Ejemplo { public static void main(String[] args) throws IOException{String numero; String letra;

Para uso exclusivo de los alumnos de CETICSA S.L.

}

--i;

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

Igual que el while, pero las sentencias se ejecutan al menos una vez antes de valorar las expresión.

EJEMPLO: Recoger un número por teclado e im primir todos sus divisores. Podremos seguir mientras pulsemos la letra “s”.

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

String letra;

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página3

3

System.out.println("Pulse cualquier tecla para salir...");

do-while

Igual que el while, pero las sentencias se ejecutan al menos una vez antes de valorar las expresión.

primir todos sus divisores.

Page 33: JavaModulo2 _2

©

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

Permite volver al inicio del bucle para comenzar una nueva iteración sin que la iteración 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;

Para uso exclusivo de los alumnos de CETICSA S.L.

BufferedReader teclado=new BufferedReader(new

System.out.println("Introduzca número:");

numero=teclado.readLine();

int num=Integer.parseInt(numero); int i=Integer.parseInt(numero);

if (num%i==0){

System.out.println(i+" es divisor de "+numero);

}

--i;

System.out.println("Pulse 's' para continuar...");

letra=teclado.readLine(); System.out.println(letra);

}while (letra.equals("s"));

Permite volver al inicio del bucle para comenzar una nueva iteración sin que la iteración actual se

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

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página3

4

tln(i+" es divisor de "+numero);

CONTINUE Permite volver al inicio del bucle para comenzar una nueva iteración sin que la iteración actual se

Page 34: JavaModulo2 _2

©

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

Permite salir del bucle aunque la condición de permanencia todavía se

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á"); } } }

Se utiliza en las funciones cuando queremos retornar al código desde el que se llamó a la función. En el retorno, se puede devolver algún valor.

Cuando un método se declara como void se debe usar la forma de return sin indicarle ningún valor Esto se hace para no ejecutar todo el código del programa:

Ejemplo:

void metodo1(){ if ( condicion == true ) return; }

Para uso exclusivo de los alumnos de CETICSA S.L.

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

Permite salir del bucle aunque la condición de permanencia todavía se cumpla.

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

salimos de los dos bucles

System.out.print("Este mensaje nunca lo imprimirá");

Se utiliza en las funciones cuando queremos retornar al código desde el que se llamó a la función. rno, se puede devolver algún valor.

Cuando un método se declara como void se debe usar la forma de return sin indicarle ningún valor Esto se hace para no ejecutar todo el código del programa:

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página3

5

BREAK cumpla.

return Se utiliza en las funciones cuando queremos retornar al código desde el que se llamó a la función.

Cuando un método se declara como void se debe usar la forma de return sin indicarle ningún valor

Page 35: JavaModulo2 _2

©

Objetivos: Aprender a utilizar el bucle While de Java

Enunciado: • Abrir un proyecto de tipo aplicación de Java.• Crear un algoritmo que imprima los primos entre 1 y 50.

Solución: 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

Ver

Unidad 5: Arrays

Objetivos - Aprender el manejo de arrays unidimensionales y bidimensionales.

- Conocer el concepto de colección.

Para uso exclusivo de los alumnos de CETICSA S.L.

Laboratorio: Uso del bucle While

Aprender a utilizar el bucle While de Java

Abrir un proyecto de tipo aplicación de Java. Crear un algoritmo que imprima los primos entre 1 y 50.

public static void main(String args[]){

if(d == n) System.out.print(n + ", ");

Ver Video: SentenciaSwitch

Ver Video: SentenciaBreak

Unidad 5: Arrays

Aprender el manejo de arrays unidimensionales y bidimensionales.

Conocer el concepto de colección.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página3

6

Laboratorio: Uso del bucle While

Page 36: JavaModulo2 _2

©

Introducción Un array es una colección de elementos del mismo tipo.

Los elementos que puede contener un array pueden ser datos de tipos primitivos u objetos.

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 elemuna posición específica.

Las Matrices o arrays (llamados también arreglos) pueden ser unidimensionales o multidimensionales.

Los arreglos son estáticos, lo que quiere decir que no podemos redimensionar un array. quisiéramos redimiensionar un array sería destruido todo su contenido, perdiendo la información que tuviéramos 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 específica, todos comienzan en cero y su límite superior será el número de elementos totales menos 1.

Los Arrays tienen una propiedad para averiguar el número de elementos que contiene en su interior. Es la propiedad length.

Esta variable nos devuelve el número de elementos que posee el array. que es una variable de solo lectura, es por ello que no podremos reavariable.

Tenemos que tener claro el atributo length nos devuelve el número 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 del array esté creado, podremos comprobarlo a lo largo del módulo. 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 elde que sean objetos referenciados.

Son el concepto que acabamos de explicar ahora mismo, un objeto compuesto por múltiples elementos, dónde cada uno de los elementos tiene una posición en el conjunto.

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

Para uso exclusivo de los alumnos de CETICSA S.L.

Un array es una colección 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 accesibles desde un único objeto a partir de

Las Matrices o arrays (llamados también arreglos) pueden ser unidimensionales o

Los arreglos son estáticos, lo que quiere decir que no podemos redimensionar un array. quisiéramos redimiensionar un array sería destruido todo su contenido, perdiendo la información que tuviéramos almanenada en su interior.

en nuestro arreglo de datos deben estar definidos en cantidad, no en

Los arreglos tienen una cantidad de elementos específica, todos comienzan en cero y su límite superior será el número de elementos totales menos 1.

d para averiguar el número de elementos que contiene en su interior.

Esta variable nos devuelve el número 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 una asignación a dicha

Tenemos que tener claro el atributo length nos devuelve el número de posiciones o huecos que existen en el interior del array, el hecho que hayamos declarado un array con una capacidad

ntenido del array esté creado, podremos comprobarlo a lo largo del 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 elde que sean objetos referenciados.

Arrays Unidimensionales

Son el concepto que acabamos de explicar ahora mismo, un objeto compuesto por múltiples elementos, dónde cada uno de los elementos tiene una posición en el conjunto.

representa por un objeto que tiene un límite 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.

Página3

7

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 entos accesibles desde un único objeto a partir de

Las Matrices o arrays (llamados también arreglos) pueden ser unidimensionales o

Los arreglos son estáticos, lo que quiere decir que no podemos redimensionar un array. Si quisiéramos redimiensionar un array sería destruido todo su contenido, perdiendo la información que

en nuestro arreglo de datos deben estar definidos en cantidad, no en

Los arreglos tienen una cantidad de elementos específica, todos comienzan en cero y su límite

d para averiguar el número de elementos que contiene en su interior.

Hay que tener en cuenta lizar una asignación a dicha

Tenemos que tener claro el atributo length nos devuelve el número de posiciones o huecos que existen en el interior del array, el hecho que hayamos declarado un array con una capacidad

ntenido del array esté creado, podremos comprobarlo a lo largo del 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

Arrays Unidimensionales

Son el concepto que acabamos de explicar ahora mismo, un objeto compuesto por múltiples elementos, dónde cada uno de los elementos tiene una posición en el conjunto.

representa por un objeto que tiene un límite de elementos al ser definido, o en alguna parte de nuestro programa le asignaremos un objeto arreglo de cierto tipo.

Page 37: JavaModulo2 _2

©

Por ejemplo, imaginemos que deseamos almacenar una lista de 6 textos, deberíamos de crearnosun array de 6 elementos, dónde el primer texto estaría en la posición cero y el último texto estaría en la posición 5.

Podemos visualizarlo en éste ejemplo gráfico:

POSICION0 1 2 3 4 5

De forma que si queremos acceder a alguna posición del array para acceder a algún elemento en concreto deberíamos escribir:

Nombrearray[posición];

En nuestro ejemplo concreto, si nuestro array se llamase textos:

Textos[2] � Devolvería el valor de “

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 un array e indicar al compilador que es un arreglo se realiza mediante corchetes, dónde en la creación del objeto es dónde indicaríamos el número de elementos a contener dentro del array.

Para declarar una array unidimensional se puede realizar de var

- Creando el array sin contenido:

int numeros[] = new int[5];

- Creando un array, e inicializando el número de elementos posteriormente en el código.

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:

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

Para uso exclusivo de los alumnos de CETICSA S.L.

Por ejemplo, imaginemos que deseamos almacenar una lista de 6 textos, deberíamos de crearnosun array de 6 elementos, dónde el primer texto estaría en la posición cero y el último texto estaría

Podemos visualizarlo en éste ejemplo gráfico:

POSICION TEXTO ALMACENADOEn Un

Lugar De La

Mancha

queremos acceder a alguna posición del array para acceder a algún elemento en

En nuestro ejemplo concreto, si nuestro array se llamase textos:

Devolvería el valor de “Lugar”.

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).

ear un array e indicar al compilador que es un arreglo se realiza mediante corchetes, dónde en la creación del objeto es dónde indicaríamos el número de elementos a

Para declarar una array unidimensional se puede realizar de varias formas:

Creando el array sin contenido:

Creando un array, e inicializando el número de elementos posteriormente en el código.

= new int[numeroelementos];

Creando un array con contenido e inicializando los valores que deseamos que contenga en su Dos tipos de sintaxis:

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

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página3

8

Por ejemplo, imaginemos que deseamos almacenar una lista de 6 textos, deberíamos de crearnos un array de 6 elementos, dónde el primer texto estaría en la posición cero y el último texto estaría

TEXTO ALMACENADO

queremos acceder a alguna posición del array para acceder a algún elemento en

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

ear un array e indicar al compilador que es un arreglo se realiza mediante corchetes, dónde en la creación del objeto es dónde indicaríamos el número de elementos a

Creando un array, e inicializando el número de elementos posteriormente en el código.

Creando un array con contenido e inicializando los valores que deseamos que contenga en su

Page 38: JavaModulo2 _2

©

En las dos primeras opciones, los elementos internos del array son inicializados a su valor “vacío” o “null”. A diferencia de los objetos simples, cuando utilizamos arrays, los objetos de su interior son inicializados y el compilador nos permite trabajar

Para inicializar los valores de un array, también podemos hacer lo posteriormente por código, igualando el nombre del array y de la posición que deseamos modificar por el valor que necesitamos almacenar.

Nombrearray[posición] = valor;

Llevado a código sería la siguiente instrucción:

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 código en una clase, declarándonos una variable única del tipo int, veremos que el compilador nos muestra una excepción al querer compilar la clase:

public class PruebaArreglos { public static void main(String args[]) { int numero; 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, permitiéndonos compilar sin ningún tipo de excepción:

public class PruebaArreglos { public static void main(String args[]) { int arraynumeros[] = new

Para uso exclusivo de los alumnos de CETICSA S.L.

En las dos primeras opciones, los elementos internos del array son inicializados a su valor “vacío” o 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 aplicación.

Para inicializar los valores de un array, también podemos hacer lo posteriormente por código, igualando el nombre del array y de la posición que deseamos modificar por el valor que necesitamos

valor;

Llevado a código sería la siguiente instrucción:

Veamos la diferencia entre una variable simple y un conjunto de variables simples (array):

escribimos el siguiente código en una clase, declarándonos una variable única del tipo int, veremos que el compilador nos muestra una excepción al querer compilar la clase:

public static void main(String args[])

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.

cambio nos declaramos un array del mismo tipo, veremos que el resultado es totalmente distinto, permitiéndonos compilar sin ningún tipo de excepción:

public static void main(String args[])

int arraynumeros[] = new int[5];

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página3

9

En las dos primeras opciones, los elementos internos del array son inicializados a su valor “vacío” o A diferencia de los objetos simples, cuando utilizamos arrays, los objetos de su interior son

Para inicializar los valores de un array, también podemos hacer lo posteriormente por código, igualando el nombre del array y de la posición que deseamos modificar por el valor que necesitamos

Veamos la diferencia entre una variable simple y un conjunto de variables simples (array):

escribimos el siguiente código en una clase, declarándonos una variable única del tipo int, veremos que el compilador nos muestra una excepción al querer compilar la clase:

System.out.println("El valor del numero es "+numero);

Vemos que como resultado, el programa de Java, impide al compilador utilizar variables que no

cambio nos declaramos un array del mismo tipo, veremos que el resultado es

Page 39: JavaModulo2 _2

©

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

El compilador nos permite generar el archivo class sin ningún problema, si ahora ejecutásemos el código para visualizar la lógica de la clase veremos lo siguiente:

Lo que sucede 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 número cero.

Ahora vamos a visualizar que sucedería en el

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 continuación un conjunto de array.

public class PruebaArreglos { public static void main(String args[]) { MiClasePrueba objetosimple = new MiClasePrueba();

Para uso exclusivo de los alumnos de CETICSA S.L.

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

El compilador nos permite generar el archivo class sin ningún problema, si ahora ejecutásemos el código para visualizar la lógica de la clase veremos lo siguiente:

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

Ahora vamos a visualizar que sucedería en el caso de trabajar con objetos referenciados.

Nos vamos a crear la siguiente clase, para posteriormente, crearnos un array con objetos de dicha

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 continuación un conjunto de

public static void main(String args[])

MiClasePrueba objetosimple = new MiClasePrueba();

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página4

0

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

El compilador nos permite generar el archivo class sin ningún problema, si ahora ejecutásemos el

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

caso de trabajar con objetos referenciados.

Nos vamos a crear la siguiente clase, para posteriormente, crearnos un array con objetos de dicha

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 continuación un conjunto de objetos en un

Page 40: JavaModulo2 _2

©

System.out.println("Valor del Objeto Simple: "+objetosimple.texto); MiClasePrueba objetos[] = new MiClaseP System.out.println("Valor del Objeto Compuesto "+objetos[2].texto); } }

Como podemos comprobar, el mensaje del objeto simple es visualizado después de compilar la clase, pero al llegar a “utilizar” el objeto compuesto nos ofrece una excepció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 algún objeto del array que deseamos

El compilador no detecta ésta excepción, ya que no verifica el interior del contenido del objeto array, sino que solamente detecta la creación del conjunto por si ha sido creado correctamente e inicializados sus valores para que sean utilizados.

La solución de la excepción sería creando un objeto en la posición que deseamos utilizar:

public class PruebaArreglos { public static void main(String args[]) { MiClasePrueba objetosimple = new MiClasePrueba(); System.out.println("Valor del Objeto Simpl 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 después de la compilación sería accederíamos al objeto creado:

Para uso exclusivo de los alumnos de CETICSA S.L.

System.out.println("Valor del Objeto Simple: "+objetosimple.texto);MiClasePrueba objetos[] = new MiClasePrueba[5]; System.out.println("Valor del Objeto Compuesto "+objetos[2].texto);

Como podemos comprobar, el mensaje del objeto simple es visualizado después de compilar la clase, pero al llegar a “utilizar” el objeto compuesto nos ofrece una excepció

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 algún objeto del array que deseamos crear.

El compilador no detecta ésta excepción, ya que no verifica el interior del contenido del objeto array, sino que solamente detecta la creación del conjunto por si ha sido creado correctamente e inicializados sus valores para que sean utilizados.

solución de la excepción sería creando un objeto en la posición que deseamos utilizar:

public static void main(String args[])

MiClasePrueba objetosimple = new MiClasePrueba(); System.out.println("Valor del Objeto 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 después de la compilación sería totalmente diferente y

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página4

1

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

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

Como podemos comprobar, el mensaje del objeto simple es visualizado después de compilar la clase, pero al llegar a “utilizar” el objeto compuesto nos ofrece una excepción de la clase

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

El compilador no detecta ésta excepción, ya que no verifica el interior del contenido del objeto array, sino que solamente detecta la creación del conjunto por si ha sido creado correctamente e

solución de la excepción sería creando un objeto en la posición que deseamos utilizar:

e: "+objetosimple.texto);

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

totalmente diferente y

Page 41: JavaModulo2 _2

©

Debemos pensar en ellos como una tabla, nos permiten almacenar más de un índice por cada elemento. Para entender mejor el concepto, pensemos en un conjunto de personas, ccontiene 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 eldato en cuestión. Para visualizarlo mejor, podemos visualizar la siguiente tabla:

Imaginemos un array compuesto por nombres llamado

FILAS

0 Nacho Llanos1 Andrea 2 Lucia Gutierrez

Según nuestro cuadro, tenemos dos datos almacenados en cada una de las filas, de forma que accederíamos a ellos mediante posición de fila y posteriormente, posición de columna.

nombrearray[POSICION FILA] [

De forma que si deseásemos saber el DNI de Lucía Gutierrez escribiriamos:

datos [2] [1] �98765432P

Para crearnos arrays multidimensionales sucede lo mismo que con arrays unidimensionales, existen múltiples formas dependiendo de lo que

- Declaración y creación de un array multidimensional sin contenido:

int[][] arraymultidimensional = new int[2][3];

Estamos creando un array que contendría dos filas y tres columnas para cada fila.

Para uso exclusivo de los alumnos de CETICSA S.L.

Arrays Multidimensionales

Debemos pensar en ellos como una tabla, nos permiten almacenar más de un índice por cada elemento. Para entender mejor el concepto, pensemos en un conjunto de personas, ccontiene 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 por su posición en el conjunto y el dato en cuestión. Para visualizarlo mejor, podemos visualizar la siguiente tabla:

Imaginemos un array compuesto por nombres llamado datos.

0 1

NOMBRE DNI

Nacho Llanos 12345678N Andrea Serrano 23451235H Lucia Gutierrez 98765432P

Según nuestro cuadro, tenemos dos datos almacenados en cada una de las filas, de forma que accederíamos a ellos mediante posición de fila y posteriormente, posición de columna.

nombrearray[POSICION FILA] [ POSICION COLUMNA]

De forma que si deseásemos saber el DNI de Lucía Gutierrez escribiriamos:

Para crearnos arrays multidimensionales sucede lo mismo que con arrays unidimensionales, existen múltiples formas dependiendo de lo que deseemos realizar o almacenar sobre el array:

Declaración y creación de un array multidimensional sin contenido:

int[][] arraymultidimensional = new int[2][3];

Estamos creando un array que contendría dos filas y tres columnas para cada fila.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página4

2

Arrays Multidimensionales

Debemos pensar en ellos como una tabla, nos permiten almacenar más de un índice por cada elemento. Para entender mejor el concepto, pensemos en un conjunto de personas, cada 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

emento por su posición en el conjunto y el dato en cuestión. Para visualizarlo mejor, podemos visualizar la siguiente tabla:

COLUMNAS

Según nuestro cuadro, tenemos dos datos almacenados en cada una de las filas, de forma que accederíamos a ellos mediante posición de fila y posteriormente, posición de columna.

Para crearnos arrays multidimensionales sucede lo mismo que con arrays unidimensionales, existen deseemos realizar o almacenar sobre el array:

Estamos creando un array que contendría dos filas y tres columnas para cada fila.

Page 42: JavaModulo2 _2

©

- Declarar un array multidimensional y crearlo posteriormente en el código de la aplicación:

int[][] arraymultidimensional; int numerofilas = 2; int numerocolumnas = 3; arraymultidimensional = new int[numerofilas][numerocolumnas];

- Declarar y crear un array creación del objeto:

String [ ][ ] datos = { { "Nacho Llanos", "12345678N" }_ , { "Andrea Serrano" , "23451235H" }_ , { "Lucia Gutierrez" , "98765432P" } };

- Declarar un array multidimensional

String [ ][ ] arraymultidimensional = new String[2][2]; arraymultidimensional[0][0] = "Nacho Llanos";_ arraymultidimensional[0][1] = "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 cómo 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] 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 dimen

Para uso exclusivo de los alumnos de CETICSA S.L.

array multidimensional y crearlo posteriormente en el código de la aplicación:

int[][] arraymultidimensional;

int numerocolumnas = 3; = new int[numerofilas][numerocolumnas];

Declarar y crear un array multidimensional con elementos en su interior, asignados en la

String [ ][ ] datos = { { "Nacho Llanos", "12345678N" }_ , { "Andrea Serrano" , "23451235H" }_ , { "Lucia Gutierrez" , "98765432P" } };

Declarar un array multidimensional y asignar los valores posteriormente:

][ ] arraymultidimensional = new String[2][2]; arraymultidimensional[0][0] = "Nacho Llanos";_

[0][1] = "12345678N";_

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

[1][1] = "23451235H";

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

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 0; z < arraymultidimensional[i].length; z++)

{ //Recorremos las columnas System.out.println("El dato en la fila " + i + ", columna " + z + " es:_

}

Como resultado veremos que hemos recorrido las dos dimensiones del array.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página4

3

array multidimensional y crearlo posteriormente en el código de la aplicación:

= new int[numerofilas][numerocolumnas];

multidimensional con elementos en su interior, asignados en la

y asignar los valores posteriormente:

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

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

System.out.println("El dato en la fila " + i + ", columna " + z + " es:_

siones del array.

Page 43: JavaModulo2 _2

©

Para averiguar la longitud de las filas, bastaría 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 sobrla fila en cuestión y contar el número de columnas existentes para esa fila:

arraymultidimensional[numerofila].length

Un array es una colección 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 declaración debe especificarse el nombre del array y el tipo de datos que se va a almacenar en él.

Para crear arrays en Java hay dos métodos básicos:

int numeros[] = new int[20]; // Define un array de 20 enteros pero sin valores (vacío).

int numeros[]={0,1,2,3,4,5,6,7,8,9,10,11}//Define un array de

De alguna forma hay que especificar el tamaño 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"};

Para uso exclusivo de los alumnos de CETICSA S.L.

Para averiguar la longitud de las filas, bastaría con utilizar la propiedad length sobre el objeto array:

Si deseamos saber la longitud de las columnas de una fila, debemos aplicar el atributo length sobrla fila en cuestión y contar el número de columnas existentes para esa fila:

arraymultidimensional[numerofila].length

Creación de un array

Un array es una colección 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 declaración debe especificarse el nombre del ray y el tipo de datos que se va a almacenar en él.

Para crear arrays en Java hay dos métodos básicos:

int numeros[] = new int[20]; // Define un array de 20 enteros pero sin valores (vacío).

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 tamaño del array.

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

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.

Página4

4

Para averiguar la longitud de las filas, bastaría con utilizar la propiedad length sobre el objeto array:

Si deseamos saber la longitud de las columnas de una fila, debemos aplicar el atributo length sobre

Creación de un array

Un array es una colección de elementos del mismo tipo. En principio crearemos arrays de datos de

Antes de utilizar un array hay que declararlo. En la declaración debe especificarse el nombre del

int numeros[] = new int[20]; // Define un array de 20 enteros pero sin valores (vacío).

12 elementos y los inicializa.

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

Page 44: JavaModulo2 _2

©

for (int i=0;i<enteros.length;++i){ enteros[i]=i; } System.out.println(saludos[0]); System.out.print("Los números básicos 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 tamaño el compilador nos avisará de ello.

public class Ejemplo { public static void main(S { 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 números básicos 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){

Para uso exclusivo de los alumnos de CETICSA S.L.

for (int i=0;i<enteros.length;++i){

enteros[i]=i;

System.out.println(saludos[0]);

System.out.print("Los números básicos 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 tamaño el compilador nos avisará de ello.

public static void main(String 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 números básicos 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.

Página4

5

Ejemplo en el que definimos una serie de arrays e imprimimos sus valores, al no indicarle un

Page 45: JavaModulo2 _2

©

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

Los arrays en Java no se pueden redimensionar de forma dinámica.

En este ejemplo comprobamos como el compilador nos avisaría del error.

Java dispone de las colecciones par

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 números básicos 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]); } }

Para uso exclusivo de los alumnos de CETICSA S.L.

System.out.print(vocales[i]);

System.out.println(""); System.out.println(saludos[1]);

}

Los arrays en Java no se pueden redimensionar de forma dinámica.

En este ejemplo comprobamos como el compilador nos avisaría del error.

Java dispone de las colecciones para redimensionar de forma dinámica.

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 números básicos 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]);

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página4

6

Page 46: JavaModulo2 _2

©

También 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 límites de un array.

Si declaramos un array de dos dimensiones, no es necesario indicar el tamaño de la dimensión secundaria a la hora de la declaración del array, sino que puede declararse posteriormente el tamaño de cada uno de los subarrays.

Todos los arrays en Java tienen una función miemla longitud del array.

int valores[][] = new int[5][2];

valores.length;

Nos dará 5

valores [0].length;

Nos dará 2

Cuando las características de un array se quedan incompletas para la lógicacuando se usan colecciones.

Las colecciones son objetos que contienen un conjunto de objetos a su vez, exactamente igual que un array, además se accede a cada uno de los elementos mediante un índice para recuperar cada uno de los elementos.

La diferencia entre un array una colección es simple. Un array es un objeto con una longitud de elementos estáticos. Es decir, un array al ser creado se le debe especificar el número de elementos que va a contener en su interior, y dicho número de eun array puede contener objetos nulos en su interior y no devolver el número “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 colección es un objeto con un conjunto de elementos dinámico. El número de elementos de la colección puede crecer y decrecer. Una colección se dimensiona al número de elementos reales que contiene. No puede contener huecos nulos en suespecificado mediante código. Son objetos creados para una lógica en la que el programador no sabe el número de elementos que va a tener que almacenar. Además, una colección siempre devolverá el número de elementos que contiene, no la capacidad de elementos que puede almacenar en su interior.

La librería para trabajar con colecciones está ubicada en el paquete

Los objetos que podemos almacenar en una colección son los mismo que en un array, desde tiprimitivos hasta objetos referenciados.

La gran desventaja en el uso de colecciones de Java es la pérdida de la identidad del tipo de datos almacenados cuando se coloca un objeto en su colección. Teniendo en cuenta querer hacer un conjunto de elementos lo más 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.

Para uso exclusivo de los alumnos de CETICSA S.L.

También se pueden crear arrays multidimensionales (arrays de arrays).

int valores[][]={{1,2,3},{4,5,6},{7,8,9}}

Se puede observar el efecto de intentar acceder a elementos fuera de los límites de un array.

array de dos dimensiones, no es necesario indicar el tamaño de la dimensión secundaria a la hora de la declaración del array, sino que puede declararse posteriormente el tamaño de cada uno de los subarrays.

Todos los arrays en Java tienen una función miembro: length(), que se puede utilizar para conocer

Cuando las características de un array se quedan incompletas para la lógica

Las colecciones son objetos que contienen un conjunto de objetos a su vez, exactamente igual que un array, además se accede a cada uno de los elementos mediante un índice para recuperar cada

La diferencia entre un array una colección es simple. Un array es un objeto con una longitud de elementos estáticos. Es decir, un array al ser creado se le debe especificar el número de elementos que va a contener en su interior, y dicho número de elementos no pueden ser modificado. Además, un array puede contener objetos nulos en su interior y no devolver el número “real” de elementos que existen en su interior, sino solamente su capacidad, es decir, puede contener huecos en algunas

Una colección es un objeto con un conjunto de elementos dinámico. El número de elementos de la colección puede crecer y decrecer. Una colección se dimensiona al número de elementos reales que contiene. No puede contener huecos nulos en su interior a no ser que el programador lo haya especificado mediante código. Son objetos creados para una lógica en la que el programador no sabe el número de elementos que va a tener que almacenar. Además, una colección siempre

mentos que contiene, no la capacidad de elementos que puede

La librería para trabajar con colecciones está ubicada en el paquete java.util

Los objetos que podemos almacenar en una colección son los mismo que en un array, desde tiprimitivos hasta objetos referenciados.

La gran desventaja en el uso de colecciones de Java es la pérdida de la identidad del tipo de datos almacenados cuando se coloca un objeto en su colección. Teniendo en cuenta querer hacer un

elementos lo más 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

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página4

7

Se puede observar el efecto de intentar acceder a elementos fuera de los límites de un array.

array de dos dimensiones, no es necesario indicar el tamaño de la dimensión secundaria a la hora de la declaración del array, sino que puede declararse posteriormente el

bro: length(), que se puede utilizar para conocer

Colecciones

Cuando las características de un array se quedan incompletas para la lógica del programador es

Las colecciones son objetos que contienen un conjunto de objetos a su vez, exactamente igual que un array, además se accede a cada uno de los elementos mediante un índice para recuperar cada

La diferencia entre un array una colección es simple. Un array es un objeto con una longitud de elementos estáticos. Es decir, un array al ser creado se le debe especificar el número de elementos

lementos no pueden ser modificado. Además, un array puede contener objetos nulos en su interior y no devolver el número “real” de elementos que existen en su interior, sino solamente su capacidad, es decir, puede contener huecos en algunas

Una colección es un objeto con un conjunto de elementos dinámico. El número de elementos de la colección puede crecer y decrecer. Una colección se dimensiona al número de elementos reales que

interior a no ser que el programador lo haya especificado mediante código. Son objetos creados para una lógica en la que el programador no sabe el número de elementos que va a tener que almacenar. Además, una colección siempre

mentos que contiene, no la capacidad de elementos que puede

java.util.

Los objetos que podemos almacenar en una colección son los mismo que en un array, desde tipos

La gran desventaja en el uso de colecciones de Java es la pérdida de la identidad del tipo de datos almacenados cuando se coloca un objeto en su colección. Teniendo en cuenta querer hacer un

elementos lo más 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

Page 47: JavaModulo2 _2

©

Con la versión de Java 1.5, éste problema se solucionó. Se implementaroque 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 objetodesventaja 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 lógico en concreto.

Podemos diferenciar las colecciones en dos grandes familias:

- Colección (Collection): Son un grupo de elementos individuales. Es lo más parecido que existe a un array unidimensional.

- Mapa (Map): Es un grupo de parejas de elementos, como realizar la misma acción con una colección de parejas, pero el modo de tratarlas dependería de la sincronización que tuviésemos 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 función de las necesidades de la programación.

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 caque aprender el manejo de una colección 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 qu

Todas las colecciones pueden producir un objeto Iterator invocando al método Iterator(). Un Iterator es un enumerador que permite recorrer cada uno de los elementos que existen dentro de la colección hasta llegar al último.

Vamos a visualizar los métodos más importantes dentro de las colecciones Set o List:

• add(object): Incluye un nuevo elemento dentro de la colección.

• addAll(Collection): Inserta todos los elementos que se pasan desde otra coleccióncolección que realiza la llamada.

• clear(): Elimina todos los elementos de la colección, dejando el número de elementos a cero.

• contains(object): Devuelve un boolean indicando si el objeto que se pasa como argumento existe dentro de la colección.

• isEmpty(): Devuelve un boolean indicando si la colección tiene algún elemento ya incluido o no.

• iterator(): Devulve un Iterator que se utiliza para recorrer todos los elementos dentro de la colección uno a uno.

• remove(object): Elimina un objeto de la colecciónobjeto a eliminar.

• removeAll(Collection): Elimina todos los elementos que están dentro de la colección que se envía como argumento.

• size(): Devuelve el número de elementos que existen dentro de la colección. Debemos de recordar que siempre una colección va a devolver el número total de elementos que contiene.

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

Para uso exclusivo de los alumnos de CETICSA S.L.

Con la versión de Java 1.5, éste problema se solucionó. Se implementaroque 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 declaración de la colección. 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

Podemos diferenciar las colecciones en dos grandes familias:

Colección (Collection): Son un grupo de elementos individuales. Es lo más parecido que existe a un array unidimensional. Mapa (Map): Es un grupo de parejas de elementos, como un array bidimensional. Podriamos realizar la misma acción con una colección de parejas, pero el modo de tratarlas dependería de la sincronización que tuviésemos a la hora de almacenar los datos en cada índice para que

mapas pueden ser implementados de muy diversas manera, en función de las

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 una de ellas, por lo que podemos afirmar que aprender el manejo de una colección 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 las características básicas son las mismas para todos.

Todas las colecciones pueden producir un objeto Iterator invocando al método Iterator(). Un Iterator es un enumerador que permite recorrer cada uno de los elementos que existen dentro de la

Vamos a visualizar los métodos más importantes dentro de las colecciones Set o List:

(object): Incluye un nuevo elemento dentro de la colección.

(Collection): Inserta todos los elementos que se pasan desde otra coleccióncolección que realiza la llamada.

(): Elimina todos los elementos de la colección, dejando el número de elementos a cero.

(object): Devuelve un boolean indicando si el objeto que se pasa como argumento existe dentro de la colección.

(): Devuelve un boolean indicando si la colección tiene algún elemento ya incluido o

(): Devulve un Iterator que se utiliza para recorrer todos los elementos dentro de la

(object): Elimina un objeto de la colección, pasando como argumento el propio

(Collection): Elimina todos los elementos que están dentro de la colección que se

(): Devuelve el número de elementos que existen dentro de la colección. Debemos de ecordar que siempre una colección va a devolver el número total de elementos que contiene.

(): Convierte la colección en un array y devuelve todos los elementos para poder ser

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página4

8

Con la versión de Java 1.5, éste problema se solucionó. Se implementaron 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

ya está escrita en la propia declaración de la colección. 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

Colección (Collection): Son un grupo de elementos individuales. Es lo más parecido que

un array bidimensional. Podriamos realizar la misma acción con una colección de parejas, pero el modo de tratarlas dependería de la sincronización que tuviésemos a la hora de almacenar los datos en cada índice para que

mapas pueden ser implementados de muy diversas manera, en función de las

Dentro de éstas dos familias que acabamos de nombrar, existen tres tipos de colecciones: Map, List da una de ellas, por lo que podemos afirmar

que aprender el manejo de una colección implica saber el resto de colecciones. Es parecido al mundo real, con saber conducir un coche, podemos conducir cualquier tipo de coche,

e las características básicas son las mismas para todos.

Todas las colecciones pueden producir un objeto Iterator invocando al método Iterator(). Un Iterator es un enumerador que permite recorrer cada uno de los elementos que existen dentro de la

Vamos a visualizar los métodos más importantes dentro de las colecciones Set o List:

(Collection): Inserta todos los elementos que se pasan desde otra colección a la

(): Elimina todos los elementos de la colección, dejando el número de elementos a cero.

(object): Devuelve un boolean indicando si el objeto que se pasa como argumento

(): Devuelve un boolean indicando si la colección tiene algún elemento ya incluido o

(): Devulve un Iterator que se utiliza para recorrer todos los elementos dentro de la

, pasando como argumento el propio

(Collection): Elimina todos los elementos que están dentro de la colección que se

(): Devuelve el número de elementos que existen dentro de la colección. Debemos de ecordar que siempre una colección va a devolver el número total de elementos que contiene.

(): Convierte la colección en un array y devuelve todos los elementos para poder ser

Page 48: JavaModulo2 _2

©

Unidad 6: Diseño de clases

Introducción Para poder diseñar bien un conjunto de clase debemos tener en cuenta los siguientes conceptos:

Un API donde el programador encuentre ya desarrolladas unas funcionalidades básicas que podrá utilizar en sus aplicaciones.

Un kit de desarrollo donde se encuentren el compdemás herramientas que permitan la ejecución de las aplicaciones desarrolladas. Todo este kit puede estar integrado en un entorno de desarrollo.

Una tecnología que permita al programador estructurar su posible de tal forma que su análisis e implementación alcancen un nivel de abstracción tal que su desarrollo sea lo más ordenado y claro posible.

Es un tipo específico de método que siempre tiene el misconstruir objetos de esa clase.

No tiene tipo de dato específico 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 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 después de la palabra reservada new y asignarlo a una referencia declarada previvez que se crea un objeto, el propósito de este procedimiento es el de inicializar los datos del objeto. El nombre del constructor siempre es igual al nombre de la clase.

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

Constructor con parámetros class facturar { int total, importe; facturar (String cliente) { total=0; importe=0; } }

Varios constructores

Para uso exclusivo de los alumnos de CETICSA S.L.

Unidad 6: Diseño de clases

diseñar bien un conjunto de clase debemos tener en cuenta los siguientes conceptos:

Un API donde el programador encuentre ya desarrolladas unas funcionalidades básicas que podrá

Un kit de desarrollo donde se encuentren el compilador, el depurador, el intérprete si es necesario y demás herramientas que permitan la ejecución de las aplicaciones desarrolladas. Todo este kit puede estar integrado en un entorno de desarrollo.

Una tecnología que permita al programador estructurar su aplicación de la manera más sencilla posible de tal forma que su análisis e implementación alcancen un nivel de abstracción tal que su desarrollo sea lo más ordenado y claro posible.

Constructores

Es un tipo específico de método que siempre tiene el mismo nombre de la clase y se utiliza para

No tiene tipo de dato específico 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.

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 después de la palabra reservada new y asignarlo a una referencia declarada previamente. Un constructor es un método que se ejecuta cada vez que se crea un objeto, el propósito de este procedimiento es el de inicializar los datos del objeto. El nombre del constructor siempre es igual al nombre de la clase.

facturar () { total=0; importe=0; } // el constructor

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

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página4

9

Unidad 6: Diseño de clases

diseñar bien un conjunto de clase debemos tener en cuenta los siguientes conceptos:

Un API donde el programador encuentre ya desarrolladas unas funcionalidades básicas que podrá

ilador, el depurador, el intérprete si es necesario y demás herramientas que permitan la ejecución de las aplicaciones desarrolladas. Todo este kit

aplicación de la manera más sencilla posible de tal forma que su análisis e implementación alcancen un nivel de abstracción tal que su

Constructores

mo nombre de la clase y se utiliza para

No tiene tipo de dato específico de retorno, ni siquiera void. Esto se debe a que el tipo que debe

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 después de la palabra reservada new y amente. Un constructor es un método que se ejecuta cada

vez que se crea un objeto, el propósito de este procedimiento es el de inicializar los datos del

Page 49: JavaModulo2 _2

©

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, característica muy potente que permite definir una clase tomando como base a otra clase ya existente. Esto es una de las bases de la reutilización de código y especialización.

Dentro de un mismo tipo de objetos (por ejemplo, los empleados), existe una variedad de modelos (administrativos, programador, gerente, etc) que dificuejemplo, si defino los métodos incentivos() y vacacionesNavidad(), estos métodos sólo se podrán aplicar a aquellos empleados que tengan incentivos y vacaciones en navidad.

Para resolver este tipo de problemas, lLa herencia consiste en definir una clase a partir de otra ya existente. De esta forma podemos definir un empleado genérico y mediante herencia crear otras clases más especializadas que respondan a las necesidades de cada tipo de empleado. La profundidad en la jerarquía de clases no tiene límite.

La herencia se consigue mediante el uso de extends.

Una clase sólo puede heredar de una única superclase directamente (no existe la herencia múltiple). Los interfaces (estudiados más adelante) permitirán simular la herencia múltiple.

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;

Para uso exclusivo de los alumnos de CETICSA S.L.

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

Java permite el empleo de la herencia, característica muy potente que permite definir una clase se a otra clase ya existente. Esto es una de las bases de la reutilización de código

Dentro de un mismo tipo de objetos (por ejemplo, los empleados), existe una variedad de modelos (administrativos, programador, gerente, etc) que dificulta la definición de la clase genérica. Por ejemplo, si defino los métodos incentivos() y vacacionesNavidad(), estos métodos sólo se podrán aplicar a aquellos empleados que tengan incentivos y vacaciones en navidad.

Para resolver este tipo de problemas, la programación 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 genérico y mediante herencia crear otras clases más especializadas que

a las necesidades de cada tipo de empleado. La profundidad en la jerarquía de clases no

La herencia se consigue mediante el uso de extends.

Una clase sólo puede heredar de una única superclase directamente (no existe la herencia múltiple). Los interfaces (estudiados más adelante) permitirán simular la herencia múltiple.

public void setNombre(String nombre)

public class Programador extends Empleado{

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página5

0

Java permite el empleo de la herencia, característica muy potente que permite definir una clase se a otra clase ya existente. Esto es una de las bases de la reutilización de código

Dentro de un mismo tipo de objetos (por ejemplo, los empleados), existe una variedad de modelos lta la definición de la clase genérica. Por

ejemplo, si defino los métodos incentivos() y vacacionesNavidad(), estos métodos sólo se podrán aplicar a aquellos empleados que tengan incentivos y vacaciones en navidad.

a programación 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 genérico y mediante herencia crear otras clases más especializadas que

a las necesidades de cada tipo de empleado. La profundidad en la jerarquía de clases no

Una clase sólo puede heredar de una única superclase directamente (no existe la herencia múltiple). Los interfaces (estudiados más adelante) permitirán simular la herencia múltiple.

Page 50: JavaModulo2 _2

©

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("Gómez"); Programador ProgramadorDos = new Programador("Pepe"); ProgramadorDos.setApellido("Pillos"); System.out.println("Programador 1 System.out.println("Programador 2 }}

Variables y métodos en las Las subclases heredan el estado (propiedades) y el comportamiento (métodos) d

Sin embargo, las subclases no están limitadas al estado y comportamiento de la superclases. subclases pueden añadir variables y métodos

Además, las subclases pueden sobrescribir los métodos que heredan de la superclasesnecesitan, para especializar más su funcionalidad. Para sobrescribir un método bastla subclase uno que se llame igual, tenga el mismo tipo de retorno y la misma lista de parámetros.

Las clases que son declaradas como finales no pueden ser derivadas.

Los métodos que son declarados como finales

Una clase abstracta es una clase que ha dejado alguno de sus métodos definido pero no lo ha implementado. La definición de un método consiste en especificar su nombre, el tipo de retornolos argumentos de entrada.

Para uso exclusivo de los alumnos de CETICSA S.L.

public Programador(String nombre)

void setApellido(String apellido) {

return this.nombre+" "+this.apellido;

public static void main (String args[]) { Programador Programador = new Programador();

Programador.setNombre("Pepe"); Programador.setApellido("Gómez"); Programador ProgramadorDos = new Programador("Pepe"); ProgramadorDos.setApellido("Pillos"); System.out.println("Programador 1 ->\t"+Programador.getNombre());

System.out.println("Programador 2 ->\t"+ProgramadorDos.getNombre());

Variables y métodos en las el estado (propiedades) y el comportamiento (métodos) d

Sin embargo, las subclases no están limitadas al estado y comportamiento de la superclases. pueden añadir variables y métodos que las diferenciaran de las otras subclases.

las subclases pueden sobrescribir los métodos que heredan de la superclasesnecesitan, para especializar más su funcionalidad. Para sobrescribir un método bastla subclase uno que se llame igual, tenga el mismo tipo de retorno y la misma lista de parámetros.

Clases y Métodos finalesLas clases que son declaradas como finales no pueden ser derivadas.

Los métodos que son declarados como finales, no pueden ser sobrescritos por las subclases.

Clases abstractas

Una clase abstracta es una clase que ha dejado alguno de sus métodos definido pero no lo ha implementado. La definición de un método consiste en especificar su nombre, el tipo de retorno

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página5

1

Nombre());

Variables y métodos en las subclases el estado (propiedades) y el comportamiento (métodos) de la superclase.

Sin embargo, las subclases no están limitadas al estado y comportamiento de la superclases. Las que las diferenciaran de las otras subclases.

las subclases pueden sobrescribir los métodos que heredan de la superclases, si lo necesitan, para especializar más su funcionalidad. Para sobrescribir un método basta con definir en la subclase uno que se llame igual, tenga el mismo tipo de retorno y la misma lista de parámetros.

Clases y Métodos finales

, no pueden ser sobrescritos por las subclases.

Clases abstractas

Una clase abstracta es una clase que ha dejado alguno de sus métodos definido pero no lo ha implementado. La definición de un método consiste en especificar su nombre, el tipo de retorno y

Page 51: JavaModulo2 _2

©

public abstract class Empleado{ // variables que heredarán las subclases.//Métodos comunes que sí se implementan en la clase abstracta.//Métodos abstractos que deberán implementar las subclases.// Estamos obligando a que todos los empleados // tengan vacaciones y pagas public abstract void Vacaciones(); public abstract void pagas(); }

Otros métodos si pueden estar implementados.

Si una clase tiene un método abstracto, ella también tiene que se

De una clase abstracta no se pueden crear objetos porque el compilador no sabría qué hacer con los métodos que no están implementados. Por eso no tiene sentido el constructor.

Las clases abstractas no pueden tener métodos estáticoscual 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 podrán usar nunca.

Cuando se necesita establecer seguridad, o simplemente cuando el número de clases que aparecen 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 relacionque proporcionan protección en el acceso y gestión de nombres.

Las clases se agrupan en paquetes por varios motivos:

• Los programadores pueden determinar fácilmente que clases e interfaces están relacionados. • Se facilita la búsqueda de una clase 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

package empleado; public class Empleado { ….. } package empleado;

Para uso exclusivo de los alumnos de CETICSA S.L.

// variables que heredarán las subclases. //Métodos comunes que sí se implementan en la clase abstracta. //Métodos abstractos que deberán implementar las subclases. // Estamos obligando a que todos los empleados

Otros métodos si pueden estar implementados.

Si una clase tiene un método abstracto, ella también tiene que ser declarada abstracta.

De una clase abstracta no se pueden crear objetos porque el compilador no sabría qué hacer con los métodos que no están implementados. Por eso no tiene sentido el constructor.

Las clases abstractas no pueden tener métodos estáticos 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 podrán usar nunca.

ablecer seguridad, o simplemente cuando el número de clases que aparecen 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 relacionque proporcionan protección en el acceso y gestión de nombres.

Las clases se agrupan en paquetes por varios motivos:

Los programadores pueden determinar fácilmente que clases e interfaces están relacionados. Se facilita la búsqueda de una clase determinada. Se evitan conflictos con los nombres de las clases. Se pueden establecer restricciones de seguridad

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.

En este ejemplo agrupamos las clases empleado y programador en un paquete llamado

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página5

2

r declarada abstracta.

De una clase abstracta no se pueden crear objetos porque el compilador no sabría qué hacer con los métodos que no están implementados. Por eso no tiene sentido el constructor.

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 podrán usar nunca.

Paquetes

ablecer seguridad, o simplemente cuando el número de clases que aparecen 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

Los programadores pueden determinar fácilmente que clases e interfaces están relacionados.

Para decirle al compilador que una clase o un interface pertenece a un paquete en concreto, basta

En este ejemplo agrupamos las clases empleado y programador en un paquete llamado empleados.

Page 52: JavaModulo2 _2

©

public class Programador extends Empleado{ …… }

Modificadores de acceso

Método

de instancia (no static). - Para poder invocar al método es necesario crear objeto.

static - Se puede invocar al método a través del nombre de la clase.

no final - El método puede ser sobre escrito en el proceso de herencia.

final - El método no puede ser sobrescrito en el proceso de

private - El acceso al método sólo se puede realizar desde la propia clase.

protected

- El acceso al método sólo se puede realizar desde las clases que se encuentren en el paquete.

public

- El acceso al método se puede realizar desde cualquier otra clase independientemente del paquete en el que se encuentre.

abstract

- Este método no tiene cuerpo y deberá ser implementado en las subclases.

Para uso exclusivo de los alumnos de CETICSA S.L.

public class Programador extends Empleado{ ……

Método Propiedad

Para poder invocar al método es necesario crear objeto.

- Cada objeto creado de una clase tiene su propia copia de la propiedad.

-

Se puede invocar al método a través del nombre de la clase.

- Todos los objetos creados a partir de la clase comparten las propiedades declaradas así.

-

El método puede ser sobre escrito en el proceso de herencia.

- La variable puede modificar su valor.

-herencia dicha clase.

El método no puede ser sobrescrito en el proceso de herencia.

- La variable es una constante y su valor no puede ser modificado.

-extender más por herencia.

El acceso al método sólo se puede realizar desde la propia clase.

- El acceso a la variable sólo se puede realizar desde la propia clase.

-

El acceso al método sólo se puede realizar desde las clases que se encuentren en el paquete.

- El acceso a la propiedad sólo se puede realizar desde las clases que se encuentre en el paquete.

-

El acceso al método se puede realizar desde cualquier otra clase independientemente del paquete en el que se encuentre.

- El acceso a la propiedad se puede realizar desde cualquier otra clase independientemente del paquete en el que se encuentre.

-sobre la clase.

Este método no tiene cuerpo y deberá ser implementado en las subclases.

- No está permitido.

-clases que tienen alguno de sus miembros abstractos.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página5

3

Clase

- No tiene sentido.

- No se puede usar.

- Se puede extender por herencia dicha clase.

- La clase no se puede extender más por herencia.

- No se puede usar.

- No se puede usar.

- El que debe aplicarse sobre la clase.

- Se aplica sobre las clases que tienen alguno de sus miembros abstractos.

Page 53: JavaModulo2 _2

©

Un interface declara lo métodos de una clase sin implementarlos (nombres de métodos, listas de argumentos, tipos de retorno) los cuales serán implementados por otra clase.

La diferencia entre una interface y una clase abstracta es que la interface es simplemde métodos no implementados, además puede incluir la declaración de constantes. Una clase abstracta puede incluir métodos implementados y no implementados o abstractos, miembros dato constantes y otros no constantes.

Una clase solamente puede derivar extends de una clase base, pero puede implementar varios interfaces. Los nombres de los interfaces se colocan separados por una coma después de la palabra reservada implements.

Creación interface

En este ejemplo creamos una interface con los

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 IOExceptipublic void menu(); } Implementación 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 continuación 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{………….. }

Para uso exclusivo de los alumnos de CETICSA S.L.

interface declara lo métodos de una clase sin implementarlos (nombres de métodos, listas de argumentos, tipos de retorno) los cuales serán implementados por otra clase.

La diferencia entre una interface y una clase abstracta es que la interface es simplemde métodos no implementados, además puede incluir la declaración de constantes. Una clase abstracta puede incluir métodos implementados y no implementados o abstractos, miembros dato

e derivar extends de una clase base, pero puede implementar varios interfaces. Los nombres de los interfaces se colocan separados por una coma después de la palabra

En este ejemplo creamos una interface con los métodos que queremos que se implementen.

public void cambiarVMaxima(int VMAXIMA);

public void usar() throws IOException;

Implementación 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

y a continuación implements seguido del nombre de la clase.

public class NombreClase extends SuperClase implements Interfaz1, Interfaz2,... {

public abstract class Conductor implements InterfazCoches{

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página5

4

Interfaces

interface declara lo métodos de una clase sin implementarlos (nombres de métodos, listas de argumentos, tipos de retorno) los cuales serán implementados por otra clase.

La diferencia entre una interface y una clase abstracta es que la interface es simplemente una lista de métodos no implementados, además puede incluir la declaración de constantes. Una clase abstracta puede incluir métodos implementados y no implementados o abstractos, miembros dato

e derivar extends de una clase base, pero puede implementar varios interfaces. Los nombres de los interfaces se colocan separados por una coma después de la palabra

métodos que queremos que se implementen.

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

public class NombreClase extends SuperClase implements Interfaz1, Interfaz2,... {

Page 54: JavaModulo2 _2

©

Unidad 7: Características avanzadas de

Introducción En java podemos realizar operaciones muy complejas con clases. Podremos realizar acciones más allá de los conceptos básicos en el diseño de las clases.

Java incluye un valor de referencia especial llamado this, que se utiliza dentro de cualquier método para referirse al objeto actual. El valor this se refiere al objeto sobre el que ha sido llamado el método actual. Se puede utilizar this siempre que se requiera una referencia a uuna clase actual. Si hay dos objetos que utilicen el mismo código, seleccionados a través 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 constru

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

La palabra reservada super sirve para indicar que una variable o un método es de la superclase. Es decir, que si queremos hacer referencia a una variable o método 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();

Para uso exclusivo de los alumnos de CETICSA S.L.

Unidad 7: Características avanzadas de clases

En java podemos realizar operaciones muy complejas con clases. Podremos realizar acciones más allá de los conceptos básicos en el diseño de las clases.

referencia especial llamado this, que se utiliza dentro de cualquier método para referirse al objeto actual. El valor this se refiere al objeto sobre el que ha sido llamado el método actual. Se puede utilizar this siempre que se requiera una referencia a uuna clase actual. Si hay dos objetos que utilicen el mismo código, seleccionados a través 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 constru

La palabra reservada super sirve para indicar que una variable o un método es de la superclase. Es decir, que si queremos hacer referencia a una variable o método de la clase que heredamos

En el siguiente ejemplo vemos como podemos imprimir el valor de la edad del padre y el valor de la

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página5

5

Unidad 7: Características avanzadas de

En java podemos realizar operaciones muy complejas con clases. Podremos realizar acciones más

this y super

referencia especial llamado this, que se utiliza dentro de cualquier método para referirse al objeto actual. El valor this se refiere al objeto sobre el que ha sido llamado el método actual. Se puede utilizar this siempre que se requiera una referencia a un objeto del tipo de una clase actual. Si hay dos objetos que utilicen el mismo código, seleccionados a través de otras

Un ejemplo muy habitual es construir un objeto y que este llame a otro constructor.

La palabra reservada super sirve para indicar que una variable o un método es de la superclase. Es decir, que si queremos hacer referencia a una variable o método de la clase que heredamos

En el siguiente ejemplo vemos como podemos imprimir el valor de la edad del padre y el valor de la

Page 55: JavaModulo2 _2

©

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 también podemos apreciar como llimprimiendo 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());} }

La destrucción de los objetosLa destrucción de un objeto se le denomina a la acción 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 obj

Destrucción automática

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 tmás quebraderos de cabeza le producen, olvidarse de liberar la memoria reservada.

El recolector de basura se encargará de liberar una zona de memoria dinámica que había sido reservada mediante el operador new, cuando el objeto ya no va a ser utiprograma.

El sistema de recogida de basura se ejecuta periódicamente, buscando objetos que ya no estén referenciados.

Para uso exclusivo de los alumnos de CETICSA S.L.

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 también podemos apreciar como llamamos al constructor de la superclase B imprimiendo en pantalla el valor 43.

public String toString() {

public String toString() { return super.toString() + "3";

public static void main(String[] args) { System.out.println(new B());

Destrucción de objetos

La destrucción de los objetos La destrucción de un objeto se le denomina a la acción 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

En aplicaciones Java se puede destruir un objeto de forma automática o bien personalizada.

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 tmás quebraderos de cabeza le producen, olvidarse de liberar la memoria reservada.

El recolector de basura se encargará de liberar una zona de memoria dinámica que había sido reservada mediante el operador new, cuando el objeto ya no va a ser uti

El sistema de recogida de basura se ejecuta periódicamente, buscando objetos que ya no estén

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página5

6

System.out.println("LEl valor de la variable de la superclase es: " + super.edad);

amamos al constructor de la superclase B

Destrucción de objetos

La destrucción de un objeto se le denomina a la acción 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

eto de forma automática o bien personalizada.

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 que más quebraderos de cabeza le producen, olvidarse de liberar la memoria reservada.

El recolector de basura se encargará de liberar una zona de memoria dinámica que había sido reservada mediante el operador new, cuando el objeto ya no va a ser utilizado más durante el

El sistema de recogida de basura se ejecuta periódicamente, buscando objetos que ya no estén

Page 56: JavaModulo2 _2

©

Podríamos forzar la ejecución del recolector de basura para decidir nosotros que lo haga en un determinado momento mediante el método gc de la clase System.

System.gc(); Destrucción personalizada

El método 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() { // Liberación del recurso no Java o recurso compartido } }

El intérprete de Java llama al método finalize(), si existe cuandoobjeto, mediante la recogida de basura.

Debe observarse que el método finalize() es de tipo protected void y por lo tanto deberá siempre lo debemos sobrescribir de la misma manera.

Los tipos enumerados se incorporaron con la versión 1.5 de java y sirven para restringir la selección de valores a algunos previamente definidos.

Un ejemplo sería una aplicación java donde queramos crear jugadores de fútbol. Si queremos que las posiciones de los jugadores sean exclusivamente: PORTERO, DEFENSA, CENTROCAMPISTA y DELANTERO podríamos 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;

Para uso exclusivo de los alumnos de CETICSA S.L.

Podríamos forzar la ejecución del recolector de basura para decidir nosotros que lo haga en un mediante el método gc de la clase System.

El método finalize es llamado justo antes que el Garbage Collector libere la memoria. En este instante se puede aprovechar para realizar otras operaciones.

// Reserva del recurso no Java o recurso compartido

// Liberación del recurso no Java o recurso compartido

El intérprete de Java llama al método finalize(), si existe cuando vaya a reclamar el espacio de ese objeto, mediante la recogida de basura.

Debe observarse que el método finalize() es de tipo protected void y por lo tanto deberá siempre lo debemos sobrescribir de la misma manera.

Crear y usar tipos enumerados

pos enumerados se incorporaron con la versión 1.5 de java y sirven para restringir la selección a algunos previamente definidos.

licación java donde queramos crear jugadores de fútbol. Si queremos que las posiciones de los jugadores sean exclusivamente: PORTERO, DEFENSA, CENTROCAMPISTA y DELANTERO podríamos crear un enumerado como el siguiente:

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.

Página5

7

Podríamos forzar la ejecución del recolector de basura para decidir nosotros que lo haga en un

El método finalize es llamado justo antes que el Garbage Collector libere la memoria. En este

vaya a reclamar el espacio de ese

Debe observarse que el método finalize() es de tipo protected void y por lo tanto deberá siempre lo

Crear y usar tipos enumerados

pos enumerados se incorporaron con la versión 1.5 de java y sirven para restringir la selección

licación java donde queramos crear jugadores de fútbol. Si queremos que las posiciones de los jugadores sean exclusivamente: PORTERO, DEFENSA, CENTROCAMPISTA y

static public enum posicion{ PORTERO,DEFENSA, CENTROCAMPISTA,DELANTERO };

Page 57: JavaModulo2 _2

©

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

Las importaciones estáticas nos permiten llamar a un método o propiedad estática 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 importación estática ha de usarse cuando sea necesario acceder frecuentemente a atributos de clase (estáticos).

Sintaxis Un solo método o propiedad

import static paquete. NombreClase.metodo_o_propiedad_static;

Todos los elementos estáticos de la clase

import static paquete.NombreClase.*;

Ejemplo El siguiente ejemplo podemos apreciar como no es necesario acceder a las variables estáticas prediciéndolas del nombre de la clase.

Supongamos que tenemos una clase llamada Jugador con tres propiedades: nombreposición.

package ejemplos; class Jugador{ public static String nombre = "Casillas";public static int edad= 29; public static String posicion= "PORTERO";}

Ahora crearemos una clase llamada impresión que nos permita acceder a los miembros estátiesta clase.

import static ejemplos.Jugador.*; public class Impresion{ public Impresion(){ nombre+=" ,Iker"; System.out.println(nombre); } public static void main(String[] args) { new Impresion(); } }

Para uso exclusivo de los alumnos de CETICSA S.L.

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

Importaciones estáticasimportaciones estáticas nos permiten llamar a un método o propiedad estática 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 a de usarse cuando sea necesario acceder frecuentemente a atributos de clase

import static paquete. NombreClase.metodo_o_propiedad_static;

Todos los elementos estáticos de la clase

import static paquete.NombreClase.*;

El siguiente ejemplo podemos apreciar como no es necesario acceder a las variables estáticas prediciéndolas del nombre de la clase.

Supongamos que tenemos una clase llamada Jugador con tres propiedades: nombre

public static String nombre = "Casillas";

public static String posicion= "PORTERO";

Ahora crearemos una clase llamada impresión que nos permita acceder a los miembros estáti

public static void main(String[] args) {

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página5

8

Importaciones estáticas importaciones estáticas nos permiten llamar a un método o propiedad estática sin necesidad de

Para acceder a atributos de clase es necesario hacer referencia a la clase en la que se definen. La a de usarse cuando sea necesario acceder frecuentemente a atributos de clase

El siguiente ejemplo podemos apreciar como no es necesario acceder a las variables estáticas

Supongamos que tenemos una clase llamada Jugador con tres propiedades: nombre, edad y

Ahora crearemos una clase llamada impresión que nos permita acceder a los miembros estáticos de

Page 58: JavaModulo2 _2

©

No ha sido necesario acceder a la propiedad Jugador.nombre.

Objetivo Diseño de clases eficiente

Enunciado • Realizar una clase que contenga algunos métodos de la clase String, pero esta vez debemos

tratarla como un objeto desde otra clase externa.• Los métodos que tendrá serán convertirMayusculas, convertirMinusculas, longitud, isNumeric.

Solución:

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;

Para uso exclusivo de los alumnos de CETICSA S.L.

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

Laboratorio: Clase Objeto cadena

Realizar una clase que contenga algunos métodos de la clase String, pero esta vez debemos desde otra clase externa.

Los métodos que tendrá serán convertirMayusculas, convertirMinusculas, longitud, isNumeric.

public static void main(String args[])

cad="123a"; CadenaObjeto c=new CadenaObjeto("Hola Mafsundo");if (c.isNumeric(cad.toCharArray())==true)

System.out.println("Es un Numero");

System.out.println("NO SON Numeros");

System.out.println(c.convertirMayusculas()); System.out.println(c.convertirMinusculas());

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página5

9

nombre anteponiendo el nombre de la clase:

Laboratorio: Clase Objeto cadena

Realizar una clase que contenga algunos métodos de la clase String, pero esta vez debemos

Los métodos que tendrá serán convertirMayusculas, convertirMinusculas, longitud, isNumeric.

CadenaObjeto c=new CadenaObjeto("Hola Mafsundo");

Page 59: JavaModulo2 _2

©

public CadenaObjeto(String palabra) { this.palabra=palabra; } public static void menu() { System.out.println(""); System.out.println("1. System.out.println("2. System.out.println("3. System.out.println("4. System.out.println("5. System.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++) { } return true; } catch (NumberFormatException e) { return false; } } }

Ver Video: OrganizandoClases

Para uso exclusivo de los alumnos de CETICSA S.L.

public CadenaObjeto(String palabra)

this.palabra=palabra;

public static void menu()

System.out.println(""); System.out.println("1.-Convertir a Mayusculas"); System.out.println("2.-Longitud"); System.out.println("3.-Convertir a Minusculas"); System.out.println("4.-Comprobar si son numeros"); System.out.println("5.-Salir");

stem.out.println("");

public String convertirMayusculas()

return this.palabra.toUpperCase();

public String convertirMinusculas()

return this.palabra.toLowerCase();

return this.palabra.length();

public static boolean isNumeric(char letras[])

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.

Página6

0

num=Integer.parseInt(String.valueOf(letras[i]));

Page 60: JavaModulo2 _2

©

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.

Introducción Java implementa excepciones y aserciones con el propósito de conseguir código robusto.

En esta unidad veremos los pasos necesarios para poder controlar los posibles errores en nuestra aplicación en tiempo de diseño y/o programación.

A veces, cuando llamamos a un método, puede que algo vaya mal dentro del método y no pueda devolvernos un resultado. Por ejemplo, puede que le pasemos parámetros al método que no le gustan, como algún null, algún valor fuera de rango, etc. Es posible que el método quiera accedeun 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 métodos o funciones, en lenguajes como C, devolvían un valor que se reconocía como no válido. Podía ser un NULL o más habitualmente, un open() de C intenta abrir un fichero. Si lo consigue, devuelve un entero que es el descriptor del fichero. Si no lo consigue, devuelve

Esta opción no es la más elegante. Muchas veces no podemos devolver un valor para indicar error. Por ejemplo, a la función atoi() de C se le pasa una cadena de texto como "123" y devuelve el entero 123. Esta función no puede devolver cadena "-1", debería devolver justamente

Por ello, los métodos en los lenguajes más modernos como C++ o Java, además de devolver un valor, pueden "lanzar una excepción". Por ejemplo, la clase Writer de java, en su método write(), se le pasan unos bytes para escribir en algún sitio, un fichero por ejemplo. Si hay algún error, "lanza una excepción" IOException, para indicar que ha habido algún error.

Una excepción es una condición que interrumpe el flujo normal de operaciones dentro programa. Imagina una excepción como una condición de error, un error de programación inesperado, como una división entre cero o un posible error que ocurra en tiempo de ejecución, como un "disco completo" mientras escribe un archivo. Cuando ocurre ude instrucciones se rompe. En concreto, se lanza la excepción y el flujo continua en el punto en el que se capturó la excepción. Al arrojarse la excepción se permite la eliminación del código controlador de excepciones del fluadecuadamente, pueden aparecer resultados incorrectos u otras condiciones anormales.

El constructor de lenguaje para controlar excepciones en un programa de Java es el bloque trycatch. Básicamente, las declaraciones que podrían arrojar una excepción se encuentran dentro del

Para uso exclusivo de los alumnos de CETICSA S.L.

Unidad 8: Excepciones y aserciones

Conocer la forma que tiene java de controlar los errores en nuestras aplicaciones.

Trabajar con las aserciones de java.

Java implementa excepciones y aserciones con el propósito de conseguir código robusto.

En esta unidad veremos los pasos necesarios para poder controlar los posibles errores en nuestra aplicación en tiempo de diseño y/o programación.

os a un método, puede que algo vaya mal dentro del método y no pueda devolvernos un resultado. Por ejemplo, puede que le pasemos parámetros al método que no le gustan, como algún null, algún valor fuera de rango, etc. Es posible que el método quiera accedeun 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 métodos o funciones, en lenguajes como C, devolvían un valor que se onocía como no válido. Podía ser un NULL o más habitualmente, un -1. Por ejemplo, la función

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.

s elegante. Muchas veces no podemos devolver un valor para indicar error. Por ejemplo, a la función atoi() de C se le pasa una cadena de texto como "123" y devuelve el entero 123. Esta función no puede devolver -1 para indicar error, puesto que si le pasam

1", debería devolver justamente -1.

Por ello, los métodos en los lenguajes más modernos como C++ o Java, además de devolver un valor, pueden "lanzar una excepción". Por ejemplo, la clase Writer de java, en su método write(), se

s bytes para escribir en algún sitio, un fichero por ejemplo. Si hay algún error, "lanza una excepción" IOException, para indicar que ha habido algún error.

Una excepción es una condición que interrumpe el flujo normal de operaciones dentro programa. Imagina una excepción como una condición de error, un error de programación inesperado, como una división entre cero o un posible error que ocurra en tiempo de ejecución, como un "disco completo" mientras escribe un archivo. Cuando ocurre una excepción, el flujo normal de instrucciones se rompe. En concreto, se lanza la excepción y el flujo continua en el punto en el que se capturó la excepción. Al arrojarse la excepción se permite la eliminación del código controlador de excepciones del flujo regular de operaciones. Si la condición 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 trysicamente, las declaraciones que podrían arrojar una excepción se encuentran dentro del

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página6

1

Unidad 8: Excepciones y aserciones

Conocer la forma que tiene java de controlar los errores en nuestras aplicaciones.

Java implementa excepciones y aserciones con el propósito de conseguir código robusto.

En esta unidad veremos los pasos necesarios para poder controlar los posibles errores en nuestra

os a un método, puede que algo vaya mal dentro del método y no pueda devolvernos un resultado. Por ejemplo, puede que le pasemos parámetros al método que no le gustan, como algún null, algún valor fuera de rango, etc. Es posible que el método quiera acceder a un fichero o a una base de datos y tenga problemas porque no existe el fichero, no tiene permisos

Tradicionalmente estos métodos o funciones, en lenguajes como C, devolvían un valor que se 1. Por ejemplo, la función

open() de C intenta abrir un fichero. Si lo consigue, devuelve un entero que es el descriptor del

s elegante. Muchas veces no podemos devolver un valor para indicar error. Por ejemplo, a la función atoi() de C se le pasa una cadena de texto como "123" y devuelve el

1 para indicar error, puesto que si le pasamos la

Por ello, los métodos en los lenguajes más modernos como C++ o Java, además de devolver un valor, pueden "lanzar una excepción". Por ejemplo, la clase Writer de java, en su método write(), se

s bytes para escribir en algún sitio, un fichero por ejemplo. Si hay algún error, "lanza

Excepciones

Una excepción es una condición que interrumpe el flujo normal de operaciones dentro de un programa. Imagina una excepción como una condición de error, un error de programación inesperado, como una división entre cero o un posible error que ocurra en tiempo de ejecución,

na excepción, el flujo normal de instrucciones se rompe. En concreto, se lanza la excepción y el flujo continua en el punto en el que se capturó la excepción. Al arrojarse la excepción se permite la eliminación del código

jo regular de operaciones. Si la condición 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 try-sicamente, las declaraciones que podrían arrojar una excepción se encuentran dentro del

Page 61: JavaModulo2 _2

©

bloque try. Si se produce una excepción, se controlará mediante cláusulas catch ejecutadas con éxito. Si hay varias cláusulas catch, se ejecutará el bloque de código paexcepción que concuerde. Este es el aspecto de una estructura try

try { body } catch( ExceptionClassl exceptionvariablel ) { manejador1 } catch ( ExceptionClass2 exceptionvariable2 ) { manejador2 }

ExceptionClass1 y ExceptionClass2 del ejemplo anterior serían reemplazadas por los nombres de clase de la excepción. Las variables exceptionvariable1 y exceptionvariable2 pueden reemplazarse por cualquier nombre de variable válido, pero no importa el nombre que emplee, cadlocal 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). programación denominada gestión de excepciones.

Mediante las excepciones se podrá evitar repetir continuamente código, en busca de un posible error, y avisar a otros objetos de una condición anormal de ejecución durante un programa.

Durante este capítulo estudiaremos la gestión de excepciones y errores, sin pretender profundizar demasiado, pero sí fijando la base conceptual de lo que este modo de programación supone.

Mediante la gestión de excepciones se prescindirá de sentencias de control de errores de

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 sistemacomo 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 método puede devolver una excepción (declarando un throws).

Unchecked Exceptions (excepciones no controladas). Son excepciones no previstas ni controladas, y por tanto puede provocar inconsistencia de datos y la finalización inesperada del sistema : lo que hemos definido anteriormente como errores en tiempo de ejecusubclases 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 métodos pueden lanzarlas. NullPointerException o IllegalArgumentEx

Manejo de Excepciones en una arquitectura JavaAl invocar un método deberíamos obtener como resultado o bien el resultado normal de la ejecución o bien no hacer absolutamente nada. Las excepciones nos servirsuperiores información sobre por qué no se ha hecho nada si fuese necesario.

Para uso exclusivo de los alumnos de CETICSA S.L.

bloque try. Si se produce una excepción, se controlará mediante cláusulas catch ejecutadas con éxito. Si hay varias cláusulas catch, se ejecutará el bloque de código paexcepción que concuerde. Este es el aspecto de una estructura try-catch básica:

} catch( ExceptionClassl exceptionvariablel ) {

} catch ( ExceptionClass2 exceptionvariable2 ) {

ExceptionClass2 del ejemplo anterior serían reemplazadas por los nombres de clase de la excepción. Las variables exceptionvariable1 y exceptionvariable2 pueden reemplazarse por cualquier nombre de variable válido, pero no importa el nombre que emplee, cadlocal 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 más allá, mediante una técnica programación denominada gestión de excepciones.

Mediante las excepciones se podrá evitar repetir continuamente código, en busca de un posible error, y avisar a otros objetos de una condición anormal de ejecución durante un programa.

o estudiaremos la gestión de excepciones y errores, sin pretender profundizar demasiado, pero sí fijando la base conceptual de lo que este modo de programación supone.

Mediante la gestión de excepciones se prescindirá de sentencias de control de errores de

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

finally o a declarar que el método puede devolver una excepción (declarando un

nchecked Exceptions (excepciones no controladas). Son excepciones no previstas ni controladas, y por tanto puede provocar inconsistencia de datos y la finalización inesperada del sistema : lo que hemos definido anteriormente como errores en tiempo de ejecución. 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 métodos pueden lanzarlas. NullPointerException o IllegalArgumentException son dos ejemplos de estas excepciones.

Manejo de Excepciones en una arquitectura Java Al invocar un método deberíamos obtener como resultado o bien el resultado normal de la ejecución o bien no hacer absolutamente nada. Las excepciones nos servirán para comunicar a las capas superiores información sobre por qué no se ha hecho nada si fuese necesario.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página6

2

bloque try. Si se produce una excepción, se controlará mediante cláusulas catch ejecutadas con éxito. Si hay varias cláusulas catch, se ejecutará el bloque de código para el primer tipo de

catch básica:

ExceptionClass2 del ejemplo anterior serían reemplazadas por los nombres de clase de la excepción. Las variables exceptionvariable1 y exceptionvariable2 pueden reemplazarse por cualquier nombre de variable válido, pero no importa el nombre que emplee, cada variable es

El control de flujo en un programa Java puede hacerse mediante las ya conocidas sentencias Pero Java va mucho más allá, mediante una técnica de

Mediante las excepciones se podrá evitar repetir continuamente código, en busca de un posible error, y avisar a otros objetos de una condición anormal de ejecución durante un programa.

o estudiaremos la gestión de excepciones y errores, sin pretender profundizar demasiado, pero sí fijando la base conceptual de lo que este modo de programación supone.

Mediante la gestión de excepciones se prescindirá de sentencias de control de errores del tipo:

Checked Exceptions (excepciones controladas). Se corresponden a errores previstos, controlados en recuperarse. Son lo que hemos definido anteriormente

como excepciones. El compilador Java es una gran ayuda ya que te obliga a capturarlas en un finally o a declarar que el método puede devolver una excepción (declarando un

nchecked Exceptions (excepciones no controladas). Son excepciones no previstas ni controladas, y por tanto puede provocar inconsistencia de datos y la finalización inesperada del sistema : lo que

ción. 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 métodos pueden lanzarlas.

ception son dos ejemplos de estas excepciones.

Al invocar un método deberíamos obtener como resultado o bien el resultado normal de la ejecución án para comunicar a las capas

superiores información sobre por qué no se ha hecho nada si fuese necesario.

Page 62: JavaModulo2 _2

©

La utilización de bloques try - catch recursos que la utilización de bloques if

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 más fácilmente mantenibles.

Tampoco es recomendable capturar una excepción en un bloque catnada más que lanzarla nuevamente.

Es aconsejable que las excepciones no rompan la encapsulación. Por ejemplo si en una capa inferior se produce una excepción (por ejemplo una SQLException en la capa de persistencia), a la capsuperior no le interesa conocer los detalles de implementación, sino:

si se puede recuperar del error, es aconsejable transformar la excepción original en otra excepción controlada o checked con la información necesaria para recuperar que la capa superirrecuperar.

o si no puede recuperarse del error pasamos a la capa superior una excepción no controlada o unchecked si no se debe continuar el flujo normal, o bien un resultado nulo si no se quiere hacer nada especial.

Sólo deberíamos de crear excepciones propias cuando aporten algo útil como información extra cuando sean capturadas o comportamientos propios (como un tratamiento especial en un log).

Al capturar excepciones también capturamos las que heredan de ésta. Por tanto al capturar una excepción del tipo java.lang.Exception también 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.

Jerarquía de clases para el manejo de excepciones en Java

Para uso exclusivo de los alumnos de CETICSA S.L.

catch - finally es más costoso en términos de tiempo de ejecución y recursos que la utilización 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 más fácilmente

Tampoco es recomendable capturar una excepción en un bloque catch y no hacer nada, o no hacer nada más que lanzarla nuevamente.

Es aconsejable que las excepciones no rompan la encapsulación. Por ejemplo si en una capa inferior se produce una excepción (por ejemplo una SQLException en la capa de persistencia), a la capsuperior no le interesa conocer los detalles de implementación, sino:

si se puede recuperar del error, es aconsejable transformar la excepción original en otra excepción controlada o checked con la información necesaria para recuperar que la capa superir

o si no puede recuperarse del error pasamos a la capa superior una excepción no controlada o unchecked si no se debe continuar el flujo normal, o bien un resultado nulo si no se quiere hacer

excepciones propias cuando aporten algo útil como información extra cuando sean capturadas o comportamientos propios (como un tratamiento especial en un log).

Al capturar excepciones también capturamos las que heredan de ésta. Por tanto al capturar una epción del tipo java.lang.Exception también 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.

el manejo de excepciones en Java

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página6

3

finally es más costoso en términos de tiempo de ejecución y

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 más fácilmente

ch y no hacer nada, o no hacer

Es aconsejable que las excepciones no rompan la encapsulación. Por ejemplo si en una capa inferior se produce una excepción (por ejemplo una SQLException en la capa de persistencia), a la capa

si se puede recuperar del error, es aconsejable transformar la excepción original en otra excepción controlada o checked con la información necesaria para recuperar que la capa superiro se pueda

o si no puede recuperarse del error pasamos a la capa superior una excepción no controlada o unchecked si no se debe continuar el flujo normal, o bien un resultado nulo si no se quiere hacer

excepciones propias cuando aporten algo útil como información extra cuando sean capturadas o comportamientos propios (como un tratamiento especial en un log).

Al capturar excepciones también capturamos las que heredan de ésta. Por tanto al capturar una epción del tipo java.lang.Exception también estamos capturando todas las unchecked (ya que

heredan de java.lang.RuntimeException y ésta hereda de java.lang.Exception). Hay que tener

el manejo de excepciones en Java

Page 63: JavaModulo2 _2

©

Clase Throwable No hay restricciones a lo que la cláusula catch de un bloque trycláusula catch, ésta usará probablemente uno de los siguientes métodos:

• getMessage(): Todos los objetos Throwable pueden tener un mensaje de error asociado. se invoca este método, devolverá el mensaje si encuentra alguno.

• getLocalizedMessage(): Si el mensaje de error ha sido traducido al idioma del usuario, este método obtiene la versión traducida del mensaje. getMessage().

• printStackTrace(): Este método envía el seguimiento stack a la consola del sistema o a otro punto. Un seguimiento stack es una lista de llamadas de método que condde excepción. También incluye números de línea y nombres de archivo, si se encuentran disponibles. El seguimiento stack imprimirá el comportamiento predefinido de una excepción de tiempo de ejecución cuando no es atrapada de forma explíc

Cuando ocurre un error en un programa, el código que encuentra el error lanza una excepción que se puede capturar desde la aplicación con el propósito de recuperarse de ella.

Existen dos modos de tratar las excepciones:

No tratarlas de forma detallada dejando a la máquina virtual de Java que realice la tarea que tenga programada por defecto. Esto se realiza mediante la cláusula throws.

Tratamiento de la excepciónNo tratando la excepción

public static void main(String args[]) throws IOException,... Código que puede lanzar las excepciones especificadas;}

Tratando la excepción public static void main(String args[]) {try{ Código que puede lanzar las excepciones} catch( Excepción esperada) { Tratamiento de la excepción } catch(Otra Excepcion esperada){ Tratamiento de la excepción } finally{ Código que se ejecuta siempre, aunque se lance la excepción}

Para uso exclusivo de los alumnos de CETICSA S.L.

No hay restricciones a lo que la cláusula catch de un bloque try-catch puede hacer. Una vez en la cláusula catch, ésta usará probablemente uno de los siguientes métodos:

getMessage(): Todos los objetos Throwable pueden tener un mensaje de error asociado. se invoca este método, devolverá el mensaje si encuentra alguno.

getLocalizedMessage(): Si el mensaje de error ha sido traducido al idioma del usuario, este ene la versión traducida del mensaje. En caso contrario, devuelve lo mismo que

printStackTrace(): Este método envía el seguimiento stack a la consola del sistema o a otro punto. Un seguimiento stack es una lista de llamadas de método que condde excepción. También incluye números de línea y nombres de archivo, si se encuentran disponibles. El seguimiento stack imprimirá el comportamiento predefinido de una excepción de tiempo de ejecución cuando no es atrapada de forma explícita

try-

Cuando ocurre un error en un programa, el código que encuentra el error lanza una excepción que se puede capturar desde la aplicación con el propósito de recuperarse de ella.

Existen dos modos de tratar las excepciones:

rlas de forma detallada dejando a la máquina virtual de Java que realice la tarea que tenga Esto se realiza mediante la cláusula throws.

Tratamiento de la excepción

public static void main(String args[]) throws IOException,... { Código que puede lanzar las excepciones especificadas;

public static void main(String args[]) {

Código que puede lanzar las excepciones

Código que se ejecuta siempre, aunque se lance la excepción

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página6

4

catch puede hacer. Una vez en la

getMessage(): Todos los objetos Throwable pueden tener un mensaje de error asociado. Si

getLocalizedMessage(): Si el mensaje de error ha sido traducido al idioma del usuario, este En caso contrario, devuelve lo mismo que

printStackTrace(): Este método envía el seguimiento stack a la consola del sistema o a otro punto. Un seguimiento stack es una lista de llamadas de método que conduce a la condición de excepción. También incluye números de línea y nombres de archivo, si se encuentran disponibles. El seguimiento stack imprimirá el comportamiento predefinido de una excepción

-catch-finally

Cuando ocurre un error en un programa, el código que encuentra el error lanza una excepción que se puede capturar desde la aplicación con el propósito de recuperarse de ella.

rlas de forma detallada dejando a la máquina virtual de Java que realice la tarea que tenga

Page 64: JavaModulo2 _2

©

} La sentencia finally es opcional.

Ejemplo de excepción 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("Despues del for"); System.exit(0); } catch(ArrayIndexOutOfBoundsException e) //Asigno la excepcion a la variable e { //Cuando se produzca la excepcion hace esto System.out.println("No hay más 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 código pueda lanzar varias excepciones.

Necesidad de conocer las excepciones asociadas a cada clase que utilicemos. Todas las excepciones que se pueden generar, salvo las de

Creación de excepción propia:En Java podemos crear una excepción propia creando una clase que extienda de la clase Exception. En este ejemplo creamos una exception llama OpcionErroneaException que exception.

public class OpcionErroneaException extends Exception{ public OpcionErroneaException(){ } public String mensaje(){ return("OPCION ERRONEA"); } }

Podemos crear una clase en Java que lance la excepción creada por el progr

Para uso exclusivo de los alumnos de CETICSA S.L.

Ejemplo de excepción con la sentencia Finally:

public static void main(String[] args) {

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);

rayIndexOutOfBoundsException e) //Asigno la excepcion a la variable e

//Cuando se produzca la excepcion hace esto System.out.println("No hay más elementos");

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 código pueda

Necesidad de conocer las excepciones asociadas a cada clase que utilicemos. Todas las excepciones que se pueden generar, salvo las del paquete java.lang, serán avisadas por el compilador

Creación de excepción propia: En Java podemos crear una excepción propia creando una clase que extienda de la clase Exception. En este ejemplo creamos una exception llama OpcionErroneaException que

public class OpcionErroneaException extends Exception{ public OpcionErroneaException(){

public String mensaje(){ return("OPCION ERRONEA");

Podemos crear una clase en Java que lance la excepción creada por el programador.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página6

5

System.out.println("Salida"+ matriz[i]);

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 código pueda

Necesidad de conocer las excepciones asociadas a cada clase que utilicemos. Todas las excepciones l paquete java.lang, serán avisadas por el compilador

En Java podemos crear una excepción propia creando una clase que extienda de la clase Exception. En este ejemplo creamos una exception llama OpcionErroneaException que hereda de la clase

amador.

Page 65: JavaModulo2 _2

©

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:"); if (num%2==0){ }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") || continua.equals("S")); //Para compara se pone .equals }catch (NumberFormatException e){ System.out.println("Debe introducir numeros"); }catch (OpcionErroneaException e){ teclado.readLine(); } } }

La técnica de las aserciones consiste en sembrar el código 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 atrás las causas que han llevado a un fallo.

Para uso exclusivo de los alumnos de CETICSA S.L.

public static void main(String args[]) throws IOException{ BufferedReader teclado=new BufferedReader(new InputStreamReader(System.in));

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");

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();

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();

La técnica de las aserciones consiste en sembrar el código 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

estar trazando marcha atrás las causas que han llevado a un fallo.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página6

6

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

System.out.println("El numero: "+ num +" es par");

System.out.println("El numero: "+ num +" es impar");

System.out.println("Debe introducir numeros");

System.out.println(e.mensaje());

ASERCIONES

La técnica de las aserciones consiste en sembrar el código 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

estar trazando marcha atrás las causas que han llevado a un fallo.

Page 66: JavaModulo2 _2

©

USO DE LAS ASERCIONES:Distintas formas de utilizar una aserción:

assert dato > 15; afirme dato==x+1; assert Conectar();

Todas estas expresiones deben devolver un boolean. Si la condicióejecución continúa normalmente, si no se lanza un AssertionError.

ACTIVAR/DESACTIVAR ASERCIONES:Java no chequea las aserciones salvo que le indiquemos explícitamente 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 sólo 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 sólo 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); } }

Para uso exclusivo de los alumnos de CETICSA S.L.

USO DE LAS ASERCIONES: Distintas formas de utilizar una aserción:

Todas estas expresiones deben devolver un boolean. Si la condición que evaluamos es verdad, la ejecución continúa normalmente, si no se lanza un AssertionError.

ACTIVAR/DESACTIVAR ASERCIONES: Java no chequea las aserciones salvo que le indiquemos explícitamente que queremos que lo haga:

activa las aserciones de mi programa

activa las aserciones de mi programa; pero sólo en la clase class

desactiva las aserciones de la clase class

activa las aserciones de mi programa; pero sólo en el paquete package

desactiva las aserciones del paquete package

public static void main(String[] args) {

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.

Página6

7

n que evaluamos es verdad, la

Java no chequea las aserciones salvo que le indiquemos explícitamente que queremos que lo haga:

Page 67: JavaModulo2 _2

©

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 1. Error al dividir " + x + " entre 2: " + y; System.out.println("El resultado de n es :"+x); } }

Resultado:

Unidad 9: API Colecciones y genéricos

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

Como corresponde a un lenguaje tan orientado a objetos, estas clases e interfaces están estructuradas en una jerarquía. A medida que se va descendiendo a niveles más específicos aumentan los requerimientos y lo que se le pide a ese objeto que sepa hacer.

Para uso exclusivo de los alumnos de CETICSA S.L.

static void main(String[] args) {

nTraza 1. Error al dividir " + x + " entre 2: " + y; System.out.println("El resultado de n es :"+x);

Ver Video: Excepciones

Unidad 9: API Colecciones y genéricos

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

Como corresponde a un lenguaje tan orientado a objetos, estas clases e interfaces están una jerarquía. A medida que se va descendiendo a niveles más específicos

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.

Página6

8

Unidad 9: API Colecciones y genéricos

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

Como corresponde a un lenguaje tan orientado a objetos, estas clases e interfaces están una jerarquía. A medida que se va descendiendo a niveles más específicos

aumentan los requerimientos y lo que se le pide a ese objeto que sepa hacer.

Page 68: JavaModulo2 _2

©

A partir de la versión 5 de Java se implementan los genéricos, gracias a los genéricos ya no será necesario hacer casting de objetos.

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 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. Colección sin

Queue: Colección ordenada con extracción por el principio e inserción por el principio (LIFO) o por el final (FIFO)

Map. Un grupo de pares objeto llave

La desventaja principal de un contenedtoma referencias a Object, por lo que no hay restricción 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 misión es la de recorrer a través 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

Los iteradores separan a los algoritmos del tipo específico 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 losQueue o Set ya que extienden de collection pero que pueden incluir alguna restricción.

import java.util.*; public class EjemploColecciones { public static void main(String[] args) { Collection<String> col1 = new HashSet<String>();Collection<String> col2 = Arrays.asList("valor1", "valor2");Collection<String> col3 = Collections.singleton("valor3");

Para uso exclusivo de los alumnos de CETICSA S.L.

A partir de la versión 5 de Java se implementan los genéricos, gracias a los genéricos ya no será io hacer casting de objetos.

En Java las principales interfaces que disponemos para trabajar con colecciones son: Collection, Set,

El paquete Java Collections Framework (JCF)

Contiene un conjunto de clases e interfaces del paquete java.util para gestionar colecciones de

Collection. Un grupo de elementos individuales, frecuentemente con alguna regla aplicada a ellos.

List. Elementos en una secuencia particular.

Set. No puede haber duplicados. Colección sin duplicados

Colección ordenada con extracción por el principio e inserción por el principio (LIFO) o por el

Map. Un grupo de pares objeto llave-valor. Un mapa es también llamado un array asociativo.

La desventaja principal de un contenedor es que no trata con tipos desconocidos. Un contenedor toma referencias a Object, por lo que no hay restricción sobre lo que se coloca en dicho contenedor. Sin embargo se debe hacer un cast para cada elemento del contenedor.

objeto cuya misión es la de recorrer a través 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

a los algoritmos del tipo específico de contenedor con el cual un algoritmo

Los iteradores son la parte central para usar algoritmos.

En este primer ejemplo veremos que cualquiera de de los métodos podríamos utilizarlos con List, Queue o Set ya que extienden de collection pero que pueden incluir alguna restricción.

public static void main(String[] args) {

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

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página6

9

A partir de la versión 5 de Java se implementan los genéricos, gracias a los genéricos ya no será

Colecciones

En Java las principales interfaces que disponemos para trabajar con colecciones son: Collection, Set,

paquete java.util para gestionar colecciones de

Collection. Un grupo de elementos individuales, frecuentemente con alguna regla aplicada a ellos.

Colección ordenada con extracción por el principio e inserción por el principio (LIFO) o por el

valor. Un mapa es también llamado un array asociativo.

or es que no trata con tipos desconocidos. Un contenedor toma referencias a Object, por lo que no hay restricción sobre lo que se coloca en dicho contenedor.

objeto cuya misión es la de recorrer a través 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.

a los algoritmos del tipo específico de contenedor con el cual un algoritmo

métodos podríamos utilizarlos con List, Queue o Set ya que extienden de collection pero que pueden incluir alguna restricción.

Page 69: JavaModulo2 _2

©

// add() y addAll() devuelven true si cambian// la colección. Importa en conjuntosif (col1.add("cero")) System.out.println ("col1 modificada");if (col1.addAll(col2)) System.out.println ("col1 modificada");// Copiamos usando un copy constructorCollection<String> copia = new ArrayList<String>(col1);col1.remove("cero"); // eliminar un elementocol1.removeAll(col3); // eliminar los elementos en e de ccol1.retainAll(col2); // elimina de c los que no están en dcol1.clear(); // eliminar todos boolean b =col1.isEmpty(); // b == trueint s = col1.size(); // s == 0 // Recuperamos en c la copia b = col1.addAll(copia); // b == trueb = col1.contains("cero"); // b == trueb = col1.containsAll(col2); // b == true;// Recorremos col1 Iterator<String> iterador = col1.iterator();while(iterador.hasNext()) System.out.println(iterador.next()); for(Iterator<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();// Obtenemos una copia String[] strings = col1.toArray(new String[col1.size()]);//Sin necesidad de saber el tamñaostrings = col1.toArray(new String[0]);} }

Resultado:

Para uso exclusivo de los alumnos de CETICSA S.L.

// add() y addAll() devuelven true si cambian // la colección. Importa en conjuntos

System.out.println ("col1 modificada");

System.out.println ("col1 modificada"); // Copiamos usando un copy constructor Collection<String> copia = new ArrayList<String>(col1); col1.remove("cero"); // eliminar un elemento

l(col3); // eliminar los elementos en e de c col1.retainAll(col2); // elimina de c los que no están en d

boolean b =col1.isEmpty(); // b == true

col1.addAll(copia); // b == true b = col1.contains("cero"); // b == true b = col1.containsAll(col2); // b == true;

Iterator<String> iterador = col1.iterator();

System.out.println(iterador.next());

String> i = col1.iterator(); i.hasNext();)

for(String word : col1) System.out.println(word); // Las colecciones tienen toString()

oArray();

String[] strings = col1.toArray(new String[col1.size()]); //Sin necesidad de saber el tamñao strings = col1.toArray(new String[0]);

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página7

0

Page 70: JavaModulo2 _2

©

Los métodos más interesantes de una colección son:

Los elementos de una colección pueden pasarse a un array mediante

List El orden es la característica más importante de una lista, ya que mantiene elementos en una secuencia particular. Podemos movernos en ambas direcciones de la lista a través de un List

Son muy similares a un array, pero con tamaño 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 ventapuede 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 posición anterior, para cubrir el hueco que deja el elemento. Esto hace que sacar elementos del medio o del principio sea costoso.

La segunda implementación 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 implementación de List necesita entonces empezar desde el comienzo, la desventaja es que usar el elemento diez implica realizar diventaja 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 inserción 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");

Para uso exclusivo de los alumnos de CETICSA S.L.

Los métodos más interesantes de una colección son:

Los elementos de una colección pueden pasarse a un array mediante

El orden es la característica más importante de una lista, ya que mantiene elementos en una secuencia particular. Podemos movernos en ambas direcciones de la lista a través de un List

Son muy similares a un array, pero con tamaño 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 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

los que le siguen a la posición anterior, para cubrir el hueco que deja el elemento. Esto hace que sacar elementos del medio o del principio sea costoso.

La segunda implementación es LinkedList . En ésta, los elementos son mantenidos en una serie de atados entre sí como eslabones de una cadena. Cada uno de estos nodos apunta a su

antecesor y al elemento que le sigue. Esta implementación de List necesita entonces empezar desde el comienzo, la desventaja es que usar el elemento diez implica realizar diventaja 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 inserción y borrado en medio de la

public static void main(String[] args) {

Iterator iterador = lista1.iterator();

String elemento = (String) iterador.next(); System.out.print(elemento + " ");

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página7

1

El orden es la característica más importante de una lista, ya que mantiene elementos en una secuencia particular. Podemos movernos en ambas direcciones de la lista a través de un ListIterator.

ja 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

los que le siguen a la posición anterior, para cubrir el hueco que deja el elemento.

La segunda implementación es LinkedList . En ésta, los elementos son mantenidos en una serie de atados entre sí como eslabones de una cadena. Cada uno de estos nodos apunta a su

antecesor y al elemento que le sigue. Esta implementación de List necesita entonces empezar desde el comienzo, la desventaja es que usar el elemento diez implica realizar diez 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 inserción y borrado en medio de la

Page 71: JavaModulo2 _2

©

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

Set Colección sin duplicados. Cada elemento 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()

Los métodos 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 métodos son: put(), get(), remove()

HashMap se basa en una tabla hash, por lo que es preferible utilizar Hash

TreeMap se basa en una implementación de árboles rojo

EJEMPLO:

import java.util.*; public class Ejemplo { public static void main(String args[]) { // Definir un HashMap HashMap global = new HashMap(); // Insertar valores "key" 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();) {

Para uso exclusivo de los alumnos de CETICSA S.L.

Iterator iterador2 = lista2.iterator(); LinkedList--");

String elemento = (String) iterador2.next(); System.out.print(elemento + " ");

ArrayList--");

Colección 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().

cuando la clase definida será colocada en un HashSet.

Los métodos add(o) y addAll(o) devuelven false si o ya estaba en el conjunto

En un mapa se pueden buscar objetos utilizando otro objeto. Tabla que asocia claves a valores. No

Los principales métodos son: put(), get(), remove()

HashMap se basa en una tabla hash, por lo que es preferible utilizar HashMap en vez de HashTable.

TreeMap se basa en una implementación de árboles rojo-negro.

public static void main(String args[])

HashMap global = new HashMap();

Insertar valores "key"-"value" 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.

Página7

2

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().

cuando la clase definida será colocada en un HashSet.

Los métodos add(o) y addAll(o) devuelven false si o ya estaba en el conjunto

En un mapa se pueden buscar objetos utilizando otro objeto. Tabla que asocia claves a valores. No

Map en vez de HashTable.

Page 72: JavaModulo2 _2

©

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

hashCode() El código hash es una manera de tomar parte de la información de un objeto y convertirla en un entero único relativo con lo que las búsquedas se pueden hacer con mucha rapidez.

Un código hash debe estar basado en el

Queue:

Es una colección ordenada de elementos con métodos 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 inserción 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á vacía o llena, Queue proporciona métodos para interrogar, que devuelven null. Por ello no se suele permitir inserción de null como valor

BlockingQueue: put()/take() se bloquean hasta que hay espacio/hay elementos.

Para añadir elementos

add() : en BoundedQueue eleva excepción si está llena

offer() : devuelve false si está llena,

put() : Es de BlockinQueue y se bloquea si está llena

Para extraer elementos

remove() : extrae el elemento del principio. Excep. si vacío

poll() : como remove() pero si está vacía devuelve ull

take() : Es de BlockinQueue y se bloquea si

drainTo() : Es de BlockinQueue: vacía y devuelve colección

Para consultar sin extraer

element() : Devuelve, sin extraerlo, el primer elemento. Excep. si vacía

peek() : Como element() pero devuelve null si vacía

Implementaciones:

LinkedList: FIFO sin límite de capacidad. Permite elementos null.

PriorityQueue mantiene ordenados los elementos de menor a mayor

Para uso exclusivo de los alumnos de CETICSA S.L.

String s = (String)it.next(); String s1 = (String)global.get(s);

System.out.println("Alumno: "+s + " - " + "Telefono: "+s1);

El código hash es una manera de tomar parte de la información de un objeto y convertirla en un entero único relativo con lo que las búsquedas se pueden hacer con mucha rapidez.

Un código hash debe estar basado en el contenido del objeto.

Es una colección ordenada de elementos con métodos 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

El orden de inserción puede ser por el final (FIFO) o por el principio

Se permiten elementos duplicados (en Set no)

En lugar de elevar excepciones cuando está vacía o llena, Queue proporciona métodos para l. Por ello no se suele permitir inserción de null como valor

BlockingQueue: put()/take() se bloquean hasta que hay espacio/hay elementos.

add() : en BoundedQueue eleva excepción si está llena

offer() : devuelve false si está llena, no eleva excepción

put() : Es de BlockinQueue y se bloquea si está llena

remove() : extrae el elemento del principio. Excep. si vacío

poll() : como remove() pero si está vacía devuelve ull

take() : Es de BlockinQueue y se bloquea si está vacía

drainTo() : Es de BlockinQueue: vacía y devuelve colección

element() : Devuelve, sin extraerlo, el primer elemento. Excep. si vacía

peek() : Como element() pero devuelve null si vacía

sin límite de capacidad. Permite elementos null.

PriorityQueue mantiene ordenados los elementos de menor a mayor

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página7

3

El código hash es una manera de tomar parte de la información de un objeto y convertirla en un entero único relativo con lo que las búsquedas se pueden hacer con mucha rapidez.

Es una colección ordenada de elementos con métodos 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

En lugar de elevar excepciones cuando está vacía o llena, Queue proporciona métodos para l. Por ello no se suele permitir inserción de null como valor

BlockingQueue: put()/take() se bloquean hasta que hay espacio/hay elementos.

Page 73: JavaModulo2 _2

©

En java.util.concurrent hay implementaciones para BlockingQueue

Otras colecciones singleton(), singletonList(), singletonMap()

Devuelven conjunto, lista y mapa inmutables, con un único

elemento. Útiles para pasar un elemento a un método que espera

una colección.

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 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 de apoyo que será utilizada para los métodos de ordenamiento. Esto se logra implementando la interfaz java.util.Comparator.

Cuando nosotros creamos una clase de algún tipo, podemos especificar el orden natural de los objetos de esa clase cuando se encComparable que declara el método:

int compareTo(Object o)

El método compareTo () devuelve un entero con las siguientes características:

Negativo -> Si thisObject <anotherObjectCero -> Si thisObject == anotherObjectPositivo -> Si thisObject> anotherObject

Por lo tanto las dos posibles soluciones para comparar

Ejemplo: En este ejemplo comparamos cadenas ignorando mayúsculas y minúsculas e imprimiendo lo resultado por orden alfabético.

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");

Para uso exclusivo de los alumnos de CETICSA S.L.

En java.util.concurrent hay implementaciones para BlockingQueue

singleton(), singletonList(), singletonMap()

unto, lista y mapa inmutables, con un único

elemento. Útiles para pasar un elemento a un método que espera

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 ordenados, y esos objetos son de una clase que hemos hecho, es necesario que nuestra clase implemente la interfaz java.lang.Comparable.

lase de apoyo que será utilizada para los métodos de ordenamiento. Esto se logra implementando la interfaz java.util.Comparator.

Cuando nosotros creamos una clase de algún tipo, podemos especificar el orden natural de los objetos de esa clase cuando se encuentran en una lista, simplemente implementando el interfaz Comparable que declara el método:

El método compareTo () devuelve un entero con las siguientes características:

> Si thisObject <anotherObject Object == anotherObject

> Si thisObject> anotherObject

Por lo tanto las dos posibles soluciones para comparar

Ejemplo: En este ejemplo comparamos cadenas ignorando mayúsculas y minúsculas e imprimiendo

public static void main(String[] args) { TreeSet ts = new TreeSet(new Comparacion ());

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página7

4

Para que un objeto sea comparable, su clase debe implementar la interfaz java.lang.Comparable.

o un conjunto - tenga sus elementos ordenados, y esos objetos son de una clase que hemos hecho, es necesario que nuestra clase

lase de apoyo que será utilizada para los métodos de ordenamiento. Esto se

Cuando nosotros creamos una clase de algún tipo, podemos especificar el orden natural de los uentran en una lista, simplemente implementando el interfaz

El método compareTo () devuelve un entero con las siguientes características:

Ejemplo: En este ejemplo comparamos cadenas ignorando mayúsculas y minúsculas e imprimiendo

Page 74: JavaModulo2 _2

©

ts.add("Emilio"); ts.add("Gómez"); 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 }}

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 nulosthis.Nombre = Nombre;

Para uso exclusivo de los alumnos de CETICSA S.L.

class Comparacion implements Comparator { public int compare(Object o1, Object o2) { return ((String) o1).compareToIgnoreCase((String) o2);

may/min

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

public static void main(String[] args) {

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"));

class Persona implements Comparable {

public Persona(String Nombre, String apellido) { if (Nombre==null || apellido==null) throw new NullPointerException();//Comprobar los nulos

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página7

5

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

Page 75: JavaModulo2 _2

©

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

Los tipos genéricos permiten forzar la seguridad de los tipos, en tiempo de compilación, en las colecciones (u otras clases y métodos que utilicen tipos parametrizados).

En este ejemplo definimos dos 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) objetos.get (i);System.out.println (temp); } }}

Para uso exclusivo de los alumnos de CETICSA S.L.

public String Nombre(){return Nombre;} public String apellido() {return apellido;}

return false;//método equals retorna false si argumento Persona n = (Persona)o;//no es del tipo adecuado o es nulo return n.Nombre.equals(Nombre) &&

return 31*Nombre.hashCode() + apellido.hashCode(); }//hashcode tiene en cuenta ambos campos public String toString() {return Nombre + " " + apellido;}

Persona n = (Persona)o;//arroja ClassCastException si argumento no int lastCmp = apellido.compareTo(n.apellido);//es del tipo Name

apellidos y si son iguales

Los tipos genéricos permiten forzar la seguridad de los tipos, en tiempo de compilación, en las colecciones (u otras clases y métodos que utilicen tipos parametrizados).

os objetos de tipo String:

public static void main(String[] args) {

objetos.add(new String("Deportes")); objetos.add(new String("Lectura")); for(int i = 0; i < objetos.size(); i++)

g) objetos.get (i);

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página7

6

Genéricos

Los tipos genéricos permiten forzar la seguridad de los tipos, en tiempo de compilación, en las

Page 76: JavaModulo2 _2

©

Sin colecciones genéricas tendríamos 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 permite almacenar objetos T o cualquier subtiuna interface).

Cuando se utilizan colecciones genéricas, no es necesario castear los objetos cuando se obtienen de la misma.

Se puede pasar una colección genérica como parámetro a un método que toma una colección no genérica, pero los resultados pueden ser inesperados.

Compilar sin ningún error no es lo mismo que compilar sin ninguna advertencia. Una advertencia de compilación no es considerado un error de compilación.

La información genérica de tipo no existe en tiempo den tiempo de compilación. Mezclando genéricos con código legal se puede compilar correctamente, pero dicho código puede arrojar una excepción.

Las asignaciones polimórficas aplican solo al tipo base, no al pa

List<Deportes> l = new ArrayList< Deportes >(); // válidoList< Deportes > l = new ArrayList<Futbol>(); // invalidoLa regla de asignación polimórfica aplica en cualquier lugar en donde se pueda realizar una asignación: void foo(List< Deportes > l) { } // no puede tomar un argumento List< Futbol >List< Deportes > bar() { } // no puede devolver un List< Futbol >La sintaxis comodín permite a un método genérico, aceptar subtipos (o supertipos) de un tipo declarado como argumento de método: List<? extends Deportes >Cuando se utiliza un comodin <? extends Futbol>, la colección puede ser accedida pero no modificada. Cuando se utiliza el comodin List<?>, cualquier tipo genérico puede ser asignado a la referencia, pero solo para acceso, no para modificaciones.List<?> es igual a List<? extends Object>.

Para uso exclusivo de los alumnos de CETICSA S.L.

Sin colecciones genéricas tendríamos que resolver el ejemplo de la siguiente manera:

args) {

lista.get(0);

permite almacenar objetos T o cualquier subtipo del mismo. (T también puede ser

Cuando se utilizan colecciones genéricas, no es necesario castear los objetos cuando se obtienen de

Se puede pasar una colección genérica como parámetro a un método que toma una colección no rica, pero los resultados pueden ser inesperados.

Compilar sin ningún error no es lo mismo que compilar sin ninguna advertencia. Una advertencia de compilación no es considerado un error de compilación.

La información genérica de tipo no existe en tiempo de ejecución, es solo para la seguridad de tipos en tiempo de compilación. Mezclando genéricos con código legal se puede compilar correctamente, pero dicho código puede arrojar una excepción.

Las asignaciones polimórficas aplican solo al tipo base, no al parámetro de tipo genérico:

List<Deportes> l = new ArrayList< Deportes >(); // válido List< Deportes > l = new ArrayList<Futbol>(); // invalido La regla de asignación polimórfica aplica en cualquier lugar en donde se pueda realizar una

foo(List< Deportes > l) { } // no puede tomar un argumento List< Futbol >List< Deportes > bar() { } // no puede devolver un List< Futbol > La sintaxis comodín permite a un método genérico, aceptar subtipos (o supertipos) de un tipo

argumento de método: List<? extends Deportes > Cuando se utiliza un comodin <? extends Futbol>, la colección puede ser accedida pero no

Cuando se utiliza el comodin List<?>, cualquier tipo genérico puede ser asignado a la referencia, 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.

Página7

7

Sin colecciones genéricas tendríamos que resolver el ejemplo de la siguiente manera:

po del mismo. (T también puede ser

Cuando se utilizan colecciones genéricas, no es necesario castear los objetos cuando se obtienen de

Se puede pasar una colección genérica como parámetro a un método que toma una colección no

Compilar sin ningún error no es lo mismo que compilar sin ninguna advertencia. Una advertencia de

e ejecución, es solo para la seguridad de tipos en tiempo de compilación. Mezclando genéricos con código legal se puede compilar correctamente,

rámetro de tipo genérico:

La regla de asignación polimórfica aplica en cualquier lugar en donde se pueda realizar una

foo(List< Deportes > l) { } // no puede tomar un argumento List< Futbol >

La sintaxis comodín permite a un método genérico, aceptar subtipos (o supertipos) de un tipo

Cuando se utiliza un comodin <? extends Futbol>, la colección puede ser accedida pero no

Cuando se utiliza el comodin List<?>, cualquier tipo genérico puede ser asignado a la referencia,

Page 77: JavaModulo2 _2

©

Las convenciones de declaración utilizan la letra T para tipos y E para elementos de una colección.

Se puede utilizar más de un tipo parametrizado en una declaración.

Se puede declarar un tipo genérico utilizando un tipo que no esté definido en la clase:

public <T> void makeList(T t) { }

Por convención los tipos parametrizados son letras solitarias mayúsculas, sin esta convención sería difícil leer el código y decir la difernombre 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().g} public static void main(String[] args) {Principal<Integer> integerBox = new Principal<Integer>();integerBox.add(new Integer(10));integerBox.inspeccion("una cadena de texto");} }

Para uso exclusivo de los alumnos de CETICSA S.L.

Las convenciones de declaración utilizan la letra T para tipos y E para elementos de una colección.

Se puede utilizar más de un tipo parametrizado en una declaración.

declarar un tipo genérico utilizando un tipo que no esté definido en la clase:

Por convención los tipos parametrizados son letras solitarias mayúsculas, sin esta convención sería difícil leer el código y decir la diferencia entre una variable parametrizada y una clase ordinaria o un

Elemento (Usado extensivamente en las colecciones en java)

System.out.println("T: " + t.getClass().getName()); System.out.println("U: " + u.getClass().getName());

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.

Página7

8

Las convenciones de declaración utilizan la letra T para tipos y E para elementos de una colección.

declarar un tipo genérico utilizando un tipo que no esté definido en la clase:

Por convención los tipos parametrizados son letras solitarias mayúsculas, sin esta convención sería encia entre una variable parametrizada y una clase ordinaria o un

Page 78: JavaModulo2 _2

©

Unidad 10 :

Introducción En java todas las operaciones que constituyen un flujo de información 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 través de 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 información.

Argumentos de la línea 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 siguient

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 parámetros que enviamos al ejecutar el programa.

Java impresiones Madrid Valencia Sevilla

El código 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]); } }

Para uso exclusivo de los alumnos de CETICSA S.L.

: Principios básicos de E/S

java todas las operaciones que constituyen un flujo de información del programa se les denomina

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 través de 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 información.

Argumentos de la línea de comandos

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á

Este comando puede tener argumentos como se explica en el siguiente ejemplo:

Los argumentos "Pepe", "Riesgo" y "25" se reciben en un Array de strings en el main:

public static void main(String[] args) { ... }

ejemplo imprime en pantalla los parámetros que enviamos al ejecutar el programa.

Java impresiones Madrid Valencia Sevilla

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.

Página7

9

Principios básicos de E/S

java todas las operaciones que constituyen un flujo de información del programa se les denomina

Siempre que hablemos de E/S podemos estar haciendo referencia a la E/S por teclado desde el

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 información.

Argumentos de la línea de comandos

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á

e ejemplo:

Los argumentos "Pepe", "Riesgo" y "25" se reciben en un Array de strings en el main:

ejemplo imprime en pantalla los parámetros que enviamos al ejecutar el programa.

Page 79: JavaModulo2 _2

©

En ocasiones es importante conocer las características del sistema donde ejecutamos nuestros programas para evaluar el rendimiento que éste pueda tener o simplemente para propósitos informativos. La clase System del paquete java.lang nos permite hacer uso del método getProperty paraobtener la siguiente información:

java.version : Versión del entorno de desarrollo de Ja

java.vendor : Nombre de la distribución del JRE.

java.home: Directorio de instalación de la máquina virtual.

os.name: Nombre del sistema operativo.

os.arch: Arquitectura del sistema operativo.

os.version: Versión del sistema operativo.

user.name : Nombre de usuario del sistema.

user.home : Ruta del directorio del usuario del sistema.

java.vm.name: Nombre de la máquina virtual instalada.

java.vm.version: Versión de la máquina v

El siguiente ejemplo mostrará información de nuestra máquina 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 TemporalSystem.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");;propSO += System.getProperty("line.separator") + "Usuario: " + System.getProperty("user.name"); System.out.println(propSO); } }

Para uso exclusivo de los alumnos de CETICSA S.L.

Propiedades d

En ocasiones es importante conocer las características del sistema donde ejecutamos nuestros el rendimiento que éste pueda tener o simplemente para propósitos

informativos. La clase System del paquete java.lang nos permite hacer uso del método getProperty paraobtener la siguiente información:

Versión del entorno de desarrollo de Java (JRE).

Nombre de la distribución del JRE.

Directorio de instalación de la máquina virtual.

Nombre del sistema operativo.

Arquitectura del sistema operativo.

del sistema operativo.

Nombre de usuario del sistema.

Ruta del directorio del usuario del sistema.

ombre de la máquina virtual instalada.

Versión de la máquina virtual instalada.

El siguiente ejemplo mostrará información de nuestra máquina con WindAows 2003

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

String propSO = "Nombre: " + System.getProperty("os.name"); System.getProperty("line.separator") + "Version: " + System.getProperty("os.version");

propSO += System.getProperty("line.separator") + "Arquitectura: " +

propSO += System.getProperty("line.separator") + "Directorio 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: " +

.separator");; propSO += System.getProperty("line.separator") + "Usuario: " + System.getProperty("user.name");

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página8

0

Propiedades del Sistema

En ocasiones es importante conocer las características del sistema donde ejecutamos nuestros el rendimiento que éste pueda tener o simplemente para propósitos

informativos. La clase System del paquete java.lang nos permite hacer uso del método getProperty

El siguiente ejemplo mostrará información de nuestra máquina con WindAows 2003

System.getProperty("line.separator") + "Version: " + System.getProperty("os.version");

: " +

propSO += System.getProperty("line.separator") + "Separador de Ficheros: " +

propSO += System.getProperty("line.separator") + "Separador de Path: " +

Page 80: JavaModulo2 _2

©

CLASE PROPERTIES La clase Properties permite manejar el conjunto de propiedades de un programa.

Las clase Properties representa un conjunto de propiedades persistentes.

La clase Properties es una tipo especial de tabla hash con las siguientes características:

– La clave y el valor de la tabla son strings– La tabla puede ser grabada y recuperada de un stream con sólo – Valores por defecto pueden ser definidos en una tabla secundaria– Debido a que Properties hereda de Hashtable , los métodos put y putAll se pueden aplicar a un

objeto Properties .

Métodos 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 enumeración de todas las claves del archivo de propiedades.

Creación de archivo de propiedadesSiempre un archivo de propiedades lun .TXT, ya que es la mejor forma de reconocerlos.

Guardaremos en C:\configuracion.properties la siguiente información:

# Nombre del servidor servidor.nombre=PC9915 # Usuario para la conexión servidor.usuario=Pepe # Password para la conexión servidor.password=poijasfr

Recuperación de la información de un archivo de pro piedadesPara 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.*;

Para uso exclusivo de los alumnos de CETICSA S.L.

La clase Properties permite manejar el conjunto de propiedades de un programa.

rties representa un conjunto de propiedades persistentes.

La clase Properties es una tipo especial de tabla hash con las siguientes características:

La clave y el valor de la tabla son strings La tabla puede ser grabada y recuperada de un stream con sólo una operaciónValores por defecto pueden ser definidos en una tabla secundaria Debido a que Properties hereda de Hashtable , los métodos put y putAll se pueden aplicar a un

Métodos de la clase Properties

Devuelve un string con el valor de la clave especificada.

setProperty ( String key): Devuelve un string con el valor de la clave especificada.

():Returns an enumeration of all the keys in this property list, including distinct keys

default property list if a key of the same name has not already been found from the main properties

Devuelve una enumeración de todas las claves del archivo de propiedades.

Creación de archivo de propiedades Siempre un archivo de propiedades lo guardaremos con extensión .PROPERTIES, .XML, .CONFIG o un .TXT, ya que es la mejor forma de reconocerlos.

configuracion.properties la siguiente información:

Recuperación de la información de un archivo de pro piedadesPara poder hacer uso del archivo de propiedades recurriremos a la clase Properties del paquete

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

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página8

1

La clase Properties permite manejar el conjunto de propiedades de un programa.

La clase Properties es una tipo especial de tabla hash con las siguientes características:

una operación

Debido a que Properties hereda de Hashtable , los métodos put y putAll se pueden aplicar a un

Devuelve un string con el valor de la clave especificada.

setProperty ( String key): Devuelve un string con el valor de la clave especificada.

():Returns an enumeration of all the keys in this property list, including distinct keys

default property list if a key of the same name has not already been found from the main properties

o guardaremos con extensión .PROPERTIES, .XML, .CONFIG o

Recuperación de la información de un archivo de pro piedades Para poder hacer uso del archivo de propiedades recurriremos a la clase Properties del paquete

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

Page 81: JavaModulo2 _2

©

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"); prop.load(is); } catch(IOException e) { System.out.println(e.toString()); } // Acceder a las propiedades por su nombreSystem.out.println("Propiedades por nombre:");System.out.println("-----------------------System.out.println(prop.getProperty("servidor.nombre"));System.out.println(prop.getProperty("serSystem.out.println(prop.getProperty("servidor.usuario"));// Recorrer todas sin conocer los nombres de las propiedadesSystem.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()));} } }

Para uso exclusivo de los alumnos de CETICSA S.L.

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

Properties prop = new Properties();

configuracion.properties");

// Acceder a las propiedades por su nombre System.out.println("Propiedades por nombre:");

-----------------------"); System.out.println(prop.getProperty("servidor.nombre")); 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:");

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

(Enumeration e = prop.keys(); e.hasMoreElements() ; ) {

System.out.println(obj + ": " + prop.getProperty(obj.toString()));

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página8

2

Page 82: JavaModulo2 _2

©

Dispositivos de soporte magnético que se los programas java.

La información 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 básicas

– Apertura del fichero – Lectura de la información – Escritura sobre el fichero – Cierre del fichero.

El trabajo con ficheros se realiza a través de flujos.

Los flujos son clases de java que proporcionan los mecanismos necesarios para información entre objetos.

Esta información puede estar codificada de dos formas:

– Byte – Caracteres

CLASES DEL PAQUETE IOCLASE READER

Clase base que permite la lectura de la información de cualquier soporte de caracteres.

CLASE WRITER

Clase base que permite la escritura de la información en cualquier soporte de caracteres.

CLASE INPUTSTREAM

Clase base que permite leer la información de cualquier objeto en bytes

CLASE OUTPUTSTREAM

Clase base que permite escribir la información de cualquier o

TIPOS DE FICHEROS Ficheros secuenciales: Se caracterizan por manejar información de distinta longitud. En un operación 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.

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

Para uso exclusivo de los alumnos de CETICSA S.L.

Dispositivos de soporte magnético que se utilizan para guardar información de forma persistente de

La información 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 básicas para trabajar con ficheros:

El trabajo con ficheros se realiza a través de flujos.

Los flujos son clases de java que proporcionan los mecanismos necesarios para

Esta información puede estar codificada de dos formas:

CLASES DEL PAQUETE IO

Clase base que permite la lectura de la información de cualquier soporte de caracteres.

e base que permite la escritura de la información en cualquier soporte de caracteres.

Clase base que permite leer la información de cualquier objeto en bytes

Clase base que permite escribir la información de cualquier objeto en bytes

Ficheros secuenciales: Se caracterizan por manejar información de distinta longitud. En un operación de lectura inicialmente se lee todo el contenido del fichero de principio a fin, la escritura se puede

o al final del fichero.

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

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página8

3

FICHEROS utilizan para guardar información de forma persistente de

Los flujos son clases de java que proporcionan los mecanismos necesarios para el intercambio de

Clase base que permite la lectura de la información de cualquier soporte de caracteres.

e base que permite la escritura de la información en cualquier soporte de caracteres.

Ficheros secuenciales: Se caracterizan por manejar información de distinta longitud. En un operación de lectura inicialmente se lee todo el contenido del fichero de principio a fin, la escritura se puede

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

Page 83: JavaModulo2 _2

©

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

– 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 métodos:

Utilizando la función createNewFile().

Escribir al menos un byte de información.

EJEMPLOS:

- File carpeta= new File(“C:\\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:

- File archivo2 = new File(“C:\\Ejemplos”,”Ejemplo2.txt”)

Crea un fichero llamado ejemplo2 dentro de c:

- File archivo3= new File(“C:\\Ejemplos

Crea un fichero llamado ejemplo2 dentro de c:

- File carpeta= new File(“Ejemplos”)

Al no poner ruta crea la carpeta donde se está ejecutando la aplicación.

- File archivo3= new File(“Ejemplo3.txt”)

Al no poner ruta crea el fichero donde se está ejecutando la aplicación.

Métodos:

canRead(): Boolean. True si se puede hacer una operación de lectura

canWrite(): Boolean. True si se puede hacer una operación de escritura en un fichero o carpeta.

canNewFile(): Permite crear en el sistema un fichero o carpeta que inicialmente está vacio.

Para uso exclusivo de los alumnos de CETICSA S.L.

Se utiliza para manipular ficheros y/o carpetas que pueden o no existir dentro del sistema de

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

objeto de la clase que es un fichero. La ruta o nombre se pasa como

Cuando se crea un objeto de la clase File el fichero no se crea directamente en el sistema, para que

Utilizando la función createNewFile().

l menos un byte de información.

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.

Ejemplos”,”Ejemplo2.txt”)

Crea un fichero llamado ejemplo2 dentro de c:\Ejemplos.

Ejemplos\\Ejemplo2.txt”)

Crea un fichero llamado ejemplo2 dentro de c:\Ejemplos.

File carpeta= new File(“Ejemplos”)

r ruta crea la carpeta donde se está ejecutando la aplicación.

File archivo3= new File(“Ejemplo3.txt”)

Al no poner ruta crea el fichero donde se está ejecutando la aplicación.

canRead(): Boolean. True si se puede hacer una operación de lectura en un fichero o carpeta.

canWrite(): Boolean. True si se puede hacer una operación 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.

Página8

4

Se utiliza para manipular ficheros y/o carpetas que pueden o no existir dentro del sistema de

File(String, String): Crea un objeto de la clase que es un fichero. Se encuentra en la ruta que 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

objeto de la clase que es un fichero. La ruta o nombre se pasa como

Cuando se crea un objeto de la clase File el fichero no se crea directamente en el sistema, para que

en un fichero o carpeta.

canWrite(): Boolean. True si se puede hacer una operación de escritura en un fichero o carpeta.

canNewFile(): Permite crear en el sistema un fichero o carpeta que inicialmente está vacio.

Page 84: JavaModulo2 _2

©

delete(): Boolean. Se utiliza para eliminar

deleteOnExit(): Permite eliminar un fichero o carpeta al finalizar la aplicación.

equals(): Boolean.True si son iguales los ficheros que se comparan.

exists(): Boolean. True si el fichero o carpeta

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 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 dentro de un path absoluto que no exista en el sistema, se crea de manera completa.

Ejemplo: Con mkdir C:\Nueva\Ejemplo solo crearía Nueva y com mkdirs nueva y ejemplo.

renameTo(): Permite cambiar el nombre de un fiargumento. Devuelve true si lo ha cambiado.

setReadOnly(): Para establecer un fichero o carpeta de solo lectura.

Constantes:

pathSeparator: Devuelve un string indicando el carácter que se utiliza dentro separar cada una de las cadenas de la variable path. En Windows es “;”.

pathSeparatorChar: Idem del anterior pero lo devuelve como carácter.

separator: Devuelve un string indicando el carácter que se utiliza dentro del sistema para la ruta a los recursos. En Windows es “

separatorChar: Idem del anterior pero lo devuelve como carácter.

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 subelementosFile carpeta= new File("c:" +separador+ "Trabajos");

Para uso exclusivo de los alumnos de CETICSA S.L.

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 aplicación.

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

getName(): Indica el nombre del fichero o carpeta.

isDirectory(): Devuelve true cuando el objeto File es una carpeta.

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

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 solo crearía Nueva y com mkdirs nueva y ejemplo.

renameTo(): Permite cambiar el nombre de un 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.

pathSeparator: Devuelve un string indicando el carácter que se utiliza dentro separar cada una de las cadenas de la variable path. En Windows es “;”.

pathSeparatorChar: Idem del anterior pero lo devuelve como carácter.

separator: Devuelve un string indicando el carácter que se utiliza dentro del sistema para la ruta a los recursos. En Windows es “\”.

separatorChar: Idem del anterior pero lo devuelve como carácter.

En el siguiente ejemplo mostramos todos los ficheros exe que tenemos en la carpeta trabajos.

public static void main(String args[]){ //separador alamacena el tipo de separador utilizado en la plataforma, en windows

//En carpeta almaceno el path de la carpeta que quiero mirar sus subelementos

File("c:" +separador+ "Trabajos");

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página8

5

un fichero o carpeta. Devuelve true si se puede eliminar.

deleteOnExit(): Permite eliminar un fichero o carpeta al finalizar la aplicación.

getAbsolutePath(): Devuelve una cadena indicando la ruta completa donde se encuentra el archivo o

list(): Devuelve una matriz de tipo string con el nombre de todos los archivos y carpetas que haya

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.

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 solo crearía Nueva y com mkdirs nueva y ejemplo.

chero o carpeta por el del objeto que se pasa como

pathSeparator: Devuelve un string indicando el carácter que se utiliza dentro del sistema para

separator: Devuelve un string indicando el carácter que se utiliza dentro del sistema para establecer

En el siguiente ejemplo mostramos todos los ficheros exe que tenemos en la carpeta trabajos.

//separador alamacena el tipo de separador utilizado en la plataforma, en windows \

//En carpeta almaceno el path de la carpeta que quiero mirar sus subelementos

Page 85: JavaModulo2 _2

©

//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 número de carpetas dentro de la que le di System.out.println("Los ficheros .exe son: for (int i=0;i<elementos.length;i++){ if (elementos[i].endsWith("exe") || elementos[i].endsWith("EXE")){ separador+elementos[i]); } } } }

Objetivo Utilizar las propiedades y métodos más interesantes de la clase File.Enunciado Crear en la unidad “c” de vuestra máquina una carpeta con el nombre TrabajosCurso.Desarrollar una clase que nos permita carpeta. Solución import java.io.*; public class NumeroFicheros { public static void main(String args[]){ String separador= File.separator; //En carpeta almaceno el path de la carsubelementos 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");

Para uso exclusivo de los alumnos de CETICSA S.L.

//En elementos almaceno la matriz con todos los nombres de los archivos y carpetas dentro_

String[] elementos=carpeta.list();

//Mostramos el número de carpetas dentro de la que le diSystem.out.println("Los ficheros .exe son:\n");

for (int i=0;i<elementos.length;i++){ if (elementos[i].endsWith("exe") || elementos[i].endsWith("EXE")){

System.out.println("\t"+carpeta.getAbsolutePath()+_

}

Laboratorio: Uso de la clase File

Utilizar las propiedades y métodos más interesantes de la clase File.

Crear en la unidad “c” de vuestra máquina una carpeta con el nombre TrabajosCurso.Desarrollar una clase que nos permita recorrer y mostrar el número de ficheros que tenemos en esta

public static void main(String args[]){

String separador= File.separator;

//En carpeta almaceno el path de la carpeta que quiero mirar sus

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é

elementos=carpeta.list();

//Mostramos el numero de carpetas dentro de la que le dijeSystem.out.println("La carpeta " + carpeta.getAbsolutePath() +_

" tiene "+ elementos.length + " subelementos");

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página8

6

//En elementos almaceno la matriz con todos los nombres de los archivos y carpetas dentro_

//Mostramos el número de carpetas dentro de la que le dije

if (elementos[i].endsWith("exe") || elementos[i].endsWith("EXE")){ t"+carpeta.getAbsolutePath()+_

Laboratorio: Uso de la clase File

Crear en la unidad “c” de vuestra máquina una carpeta con el nombre TrabajosCurso. recorrer y mostrar el número de ficheros que tenemos en esta

peta que quiero mirar sus

File carpeta= new File("c:" +separador+ "TrabajosCurso");

//En elementos almaceno la matriz con todos los nombres de los archivos y_

//Mostramos el numero de carpetas dentro de la que le dije System.out.println("La carpeta " + carpeta.getAbsolutePath() +_

Page 86: JavaModulo2 _2

©

} }

CLASE FILEOUTPUTSTREAM

Se utiliza para escribir información 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 automáticamente 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 automáticamente 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 automáticamente y en el caso de que exista si el segundo argumento es true añade, y si es falso sobrescribe.

Los tres constructores propagan una excepción IOException.

Métodos:

void write(byte[],int,int): El primer argumento es una matriz de tipo byte con la información que se va a escribir en el fichero, el segundo argumento es la posición dentro de la matriz a partir de la cual voy a escribir en el fichero y el tercero y último es el número de byte de la matriz que se van a escribir.

void close(): Cierra el flujo de escritura a un fichero. Si el flujo de información 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

Este constructor propaga la excepción 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 objeto file en el argumento.

Para uso exclusivo de los alumnos de CETICSA S.L.

escribir información en formato byte.

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

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 automáticamente y en el

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 automáticamente y en el

do argumento es true añade, y si es falso sobrescribe.

Los tres constructores propagan una excepción IOException.

void write(byte[],int,int): El primer argumento es una matriz de tipo byte con la información que se l segundo argumento es la posición dentro de la matriz a partir de la

cual voy a escribir en el fichero y el tercero y último es el número de byte de la matriz que se van a

void close(): Cierra el flujo de escritura a un fichero. Si el flujo de escritura no se cierra, la información del fichero no se escribe y puede perder su contenido.

Se utiliza para abrir un flujo de lectura en byte asociado a un fichero.

FileInputStream(String): Crea un objeto, flujo de lectura en bytes asociado a un fichero.

Este constructor propaga la excepción 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

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página8

7

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

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 automáticamente y en el

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 automáticamente y en el

do argumento es true añade, y si es falso sobrescribe.

void write(byte[],int,int): El primer argumento es una matriz de tipo byte con la información que se l segundo argumento es la posición dentro de la matriz a partir de la

cual voy a escribir en el fichero y el tercero y último es el número de byte de la matriz que se van a

escritura no se cierra, la

lectura en bytes asociado a un fichero.

Este constructor propaga la excepción FileNotFoundException(se genera cuando el fichero al que se

en bytes del fichero que se pasa como

Page 87: JavaModulo2 _2

©

Métodos:

int read(byte[],int,int): El primer argumento es una matriz de tipo byte con la información leida del fichero, el segundo argumento es la posición dentro de la matriz a partir tercero y último es el número de byte de la matriz que se van a leer.

Devuelve el número de byte leidos por del fichero.

Propaga excepción IOException.

void close(): Cierra el flujo de lectura a un fichero. Si el flujo de lecturde 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()){ } File 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,nom 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){

Para uso exclusivo de los alumnos de CETICSA S.L.

int read(byte[],int,int): El primer argumento es una matriz de tipo byte con la información leida del fichero, el segundo argumento es la posición dentro de la matriz a partir de la cual voy a leer y el tercero y último es el número de byte de la matriz que se van a leer.

Devuelve el número de byte leidos por del fichero.

void close(): Cierra el flujo de lectura a un fichero. Si el flujo de 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

static FileOutputStream fescritura;

public static void main (String[] args){

String nombre="PEPE SANCHEZ";

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

fescritura.write(nombre.getBytes(),0,nombre.length());System.out.println("SE HA ESCRITO EN EL FICHERO");

}catch (IOException ioe){ System.out.println("ERROR DE ENTRADA SALIDA DE DATOS");

if(fescritura !=null){ try{

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página8

8

int read(byte[],int,int): El primer argumento es una matriz de tipo byte con la información leida del de la cual voy a leer y el

a no se cierra, para el resto

El siguiente ejemplo nos permite abrir un fichero mediante la clase FileOutputStream y escribir en el

archivo= new File (carpeta,"Nombres.dat");

fescritura= new FileOutputStream(archivo);

System.out.println("ERROR GRAVE EN EL SISTEMA DE E/S EN EL

bre.length()); System.out.println("SE HA ESCRITO EN EL FICHERO");

System.out.println("ERROR DE ENTRADA SALIDA DE DATOS");

Page 88: JavaModulo2 _2

©

} } } }

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){ } } } }

Para uso exclusivo de los alumnos de CETICSA S.L.

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

static FileInputStream flectura;

public static void main (String[] args){

archivo = new File("Ficheros"+ File.separator + "Nombres.dat");flectura=new FileInputStream( archivo );

}catch (FileNotFoundException e){ System.out.println("ERROR GRAVE: El fichero " + archivo.getAbsolutePath()+

return;

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");

if (flectura!=null){ try{ flectura.close(); }catch (IOException ioe){ System.out.println("ERROR GRAVE DE E/S DE DATOS"); } }

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página8

9

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

archivo = new File("Ficheros"+ File.separator + "Nombres.dat");

System.out.println("ERROR GRAVE: El fichero " + archivo.getAbsolutePath()+

byte[] matriz = new byte[ (byte) archivo.length()] ; int leidos = flectura.read(matriz,0,matriz.length); System.out.println(new String (matriz,0, leidos));

System.out.println("ERROR DE ENTRADA SALIDA DE DATOS");

.println("ERROR GRAVE DE E/S DE DATOS");

Page 89: JavaModulo2 _2

©

Laboratorio: Uso de las clases FileOutputStream y

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 teel 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

Solución: import java.io.*; class Trabajar_Ficheros{ static File archivo; //Para trabajar con el fichero con el que voy a escribir o del que voy a leer

Para uso exclusivo de los alumnos de CETICSA S.L.

Laboratorio: Uso de las clases FileOutputStream y

FileInputStream

Aprender a escribir y leer sobre ficheros.

Crear un menú como el que se muestra en la imagen. ----------------------------------------------------

----------------------------------------------------

Podremos escribir en un fichero elegido un texto y posteriormente recuperar el contenido escrito en

INTRODUCE EL NOMBRE DEL FICHERO DONDE ESCRIBIR: datos.txt

INTRODUCE TEXTO EN EL FICHERO:

----------------------------------------------------

----------------------------------------------------

INTRODUCE EL NOMBRE DEL FICHERO A LEER: datos.txt

EL CONTENIDO DEL FICHERO datos.txt

static File archivo; //Para trabajar con el fichero con el que voy a escribir o del que voy a

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página9

0

Laboratorio: Uso de las clases FileOutputStream y

FileInputStream

xto y posteriormente recuperar el contenido escrito en

static File archivo; //Para trabajar con el fichero con el que voy a escribir o del que voy a

Page 90: JavaModulo2 _2

©

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 añadir o sobreescribir do{ System.out.println(""); System.out.println(" System.out.println(" System.out.println(" System.out.println("\n"); do{ InputStreamReader _ (System.in)).readLine().trim()); }while (opc==Integer.MIN_VALUE); if (opc==1){ DONDE _ ESCRIBIR: "); (System.in))_ .readLine().trim(); SOBREESCRIBIRLO (S)I (N)O?"); InputStreamReader (System.in))._readLine().trim();

Para uso exclusivo de los alumnos de CETICSA S.L.

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 añadir o sobreescribir

System.out.println("----------------------------------------------------

System.out.println("\t1.- ESCRITURA EN FICHERO");System.out.println("\t2.- LECTURA EN FICHERO");System.out.println("\t3.- SALIR"); System.out.println("----------------------------------------------------

do{

System.out.print("Introduce una opcion: "); opc = Integer.parseInt( new BufferedReader (new

}while (opc==Integer.MIN_VALUE);

if (opc==1){

System.out.print("\n INTRODUCE EL NOMBRE DEL FICHERO

String fichero = new BufferedReader (new Inp

archivo = new File (fichero);

if (archivo.exists()){

System.out.println("\n EL FICHERO YA EXISTE. ¿QUIERE _ String resp= new BufferedReader (new

Reader (System.in))._

if (resp.compareToIgnoreCase("S")==0) { agregar = false; }else{ agregar = true; } }

System.out.println ("\nINTRODUCE TEXTO EN EL FICHERO:");

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página9

1

boolean agregar = false ; //para saber cuando hay que añadir o sobreescribir

----------------------------------------------------

ESCRITURA EN FICHERO"); LECTURA EN FICHERO");

----------------------------------------------------

System.out.print("Introduce una opcion: "); BufferedReader (new

n INTRODUCE EL NOMBRE DEL FICHERO

String fichero = new BufferedReader (new InputStreamReader

n EL FICHERO YA EXISTE. ¿QUIERE _

String resp= new BufferedReader (new

if (resp.compareToIgnoreCase("S")==0) {

nINTRODUCE TEXTO EN EL FICHERO:");

Page 91: JavaModulo2 _2

©

(System.in)).readLine().trim(); (archivo.getName(),agregar); información en el fichero "+ _ archivo.getName()); correctamente _ el flujo de escritura asociado al fichero "+ archivo.getName()); }else if (opc ==2){ LEER: "); (System.in))._ readLine().trim(); nombre archivo.getName()+"\n es: \n"); comunicacion con el fichero "+_ archivo.getName()); del fichero "+_ archivo.getName());

Para uso exclusivo de los alumnos de CETICSA S.L.

String cadena = new BufferedReader (new InputStreamReader _

cadena = cadena +"\n"; byte[] matriz = cadena.getBytes();

try{ fescritura = new FileOutputStream

fescritura.write(matriz,0,matriz.length); }catch (IOException e){ System.out.println("No se ha podido escribir la

}finally{ try{ if(fescritura!=null){ fescritura.close(); } }catch(IOException e){ System.out.println("No se ha podido cerrar

el flujo de escritura asociado al fichero "+ archivo.getName()); } }

}else if (opc ==2){

System.out.print("\nINTRODUCE EL NOMBRE DEL FICHERO A

String fichero = new BufferedReader (new InputStreamReader

archivo = new File (fichero); //Creo un objeto File asociado a ese

byte [] matriz= new byte [(int) archivo.length()];

try{ flectura= new FileInputStream(archivo); int leidos = flectura.read(matriz,0,matriz.length); System.out.println("\nEL CONTENIDO DEL FICHERO "+_

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

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página9

2

BufferedReader (new InputStreamReader _

fescritura = new FileOutputStream

ngth);

System.out.println("No se ha podido escribir la

if(fescritura!=null){ fescritura.close();

System.out.println("No se ha podido cerrar

nINTRODUCE EL NOMBRE DEL FICHERO A

fichero = new BufferedReader (new InputStreamReader

archivo = new File (fichero); //Creo un objeto File asociado a ese

byte [] matriz= new byte [(int) archivo.length()];

putStream(archivo); int leidos = flectura.read(matriz,0,matriz.length);

nEL CONTENIDO DEL FICHERO "+_

System.out.println(new String(matriz,0,leidos));

System.out.println("No se ha podido establecer

System.out.println("No se ha podido leer la informacion

Page 92: JavaModulo2 _2

©

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 información 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 automáticamente 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 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 automáticamente caso de que exista lo sobrescribe.

Métodos:

void write(char[],int,int): El primer argumento es una matriz de tipo char con la información que se va a escribir en el fichero, el segundo argumento es la posición dentro de la matriz a partir de la cual voy a escribir en el fichero y el tercero y último es el número 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. información del fichero no

se escribe y puede perder su contenido.

Los tres métodos propagan una excepción IOException.

Para uso exclusivo de los alumnos de CETICSA S.L.

}finally{ try{ if(flectura!=null){ flectura.close(); } }catch(IOException e){ System.out.println("No se ha podido cerrar

el flujo asociado al fichero "+ archivo.getName()); } } }

}while(opc!=3);

Clase que se utiliza para crear un flujo que te permite escribir información que va en caracteres en

FileWriter(File): Crea un objeto que permite escribir en el fichero File que se pasa como argumento. caso de que el fichero no exista lo crea automáticamente y en el caso de que exista lo

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 automáticamente y en el caso de que

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 automáticamente

void write(char[],int,int): El primer argumento es una matriz de tipo char con la información que se va a escribir en el fichero, el segundo argumento es la posición dentro de la matriz a partir de la al voy a escribir en el fichero y el tercero y último es el número de byte de la matriz que se van a

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

se escribe y puede perder su contenido.

Los tres métodos propagan una excepción IOException.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página9

3

flectura.close();

System.out.println("No se ha podido cerrar

Clase que se utiliza para crear un flujo que te permite escribir información que va en caracteres en

FileWriter(File): Crea un objeto que permite escribir en el fichero File que se pasa como argumento. caso de que el fichero no exista lo crea automáticamente y en el caso de que exista lo

FileWriter (String): Crea un objeto que permite escribir en el fichero cuyo nombre y/o path se pasa lo crea automáticamente y en el caso de que

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 automáticamente y en el

void write(char[],int,int): El primer argumento es una matriz de tipo char con la información que se va a escribir en el fichero, el segundo argumento es la posición dentro de la matriz a partir de la al voy a escribir en el fichero y el tercero y último es el número de byte de la matriz que se van a

void write(String): Útil para escribir la cadena que se pasa como argumento en el fichero.

Si el flujo de escritura no se cierra, la

Page 93: JavaModulo2 _2

©

CLASE FILEREADER

Clase que se utiliza para crear un flujo que te permite leer información que va en caracteres en un fichero.

Constructores:

FileReader(File): Abre un flujo para leer información del fichero que se pasa como objeto file en el argumento.

FileReader (String): Crea un objeto para poder leer del fichero cuyo path y/o nombre se pasa como argumento.

Cualquiera de los dos constructores propaga una excepción de la clase FileNotFoundException.

Métodos:

int read(char[],int,int): El primer argumento es una matriz de tipo char en información leída del fichero, el segundo argumento es la posición dentro de la matriz a partir de la cual voy a escribir en el fichero y el tercero y último es el número de caracteres de la matriz que se van a escribir.

void close(): Cierra el flujo de lectura a un fichero. Si el flujo de escritura no se cierra, la información del fichero no se escribe y puede perder su contenido.

Los dos métodos propagan una excepción 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.

Métodos:

void writeUTF(String): Para escribir la cadena que se pasa como argumento. Este formato incluye información 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 el tipo double que se pasaargumento.

• 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

Para uso exclusivo de los alumnos de CETICSA S.L.

iliza para crear un flujo que te permite leer información que va en caracteres en un

FileReader(File): Abre un flujo para leer información del fichero que se pasa como objeto file en el

to para poder leer del fichero cuyo path y/o nombre se pasa como

Cualquiera de los dos constructores propaga una excepción de la clase FileNotFoundException.

int read(char[],int,int): El primer argumento es una matriz de tipo char en información leída del fichero, el segundo argumento es la posición dentro de la matriz a partir de la cual voy a escribir en el fichero y el tercero y último es el número de caracteres de la matriz que se

erra el flujo de lectura a un fichero. Si el flujo de escritura no se cierra, la información del fichero no se escribe y puede perder su contenido.

Los dos métodos propagan una excepción IOException.

CLASE DATAOUTPUTSTREAM

escritura que permiten manejar los tipos primitivos de java y la clase

DataOutputStream(OutputStream): Esta clase OutputStream es una clase abstracta. Es la clase base que se utiliza para crear cualquier flujo de escritura en bytes.

void writeUTF(String): Para escribir la cadena que se pasa como argumento. Este formato incluye información sobre la longitud exacta de la cadena, nos permite recuperar la cadena con facilidad debido a que conocemos la longitud del fichero.

writeBoolean(boolean): Para escribir la variable de tipo boolean que se pasa como

void writeByte(int): Para escribir como byte el tipo int que se pasa como argumento.

void writeDouble(double): Para escribir como byte el tipo double que se pasa

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.

Página9

4

iliza para crear un flujo que te permite leer información que va en caracteres en un

FileReader(File): Abre un flujo para leer información del fichero que se pasa como objeto file en el

to para poder leer del fichero cuyo path y/o nombre se pasa como

Cualquiera de los dos constructores propaga una excepción de la clase FileNotFoundException.

int read(char[],int,int): El primer argumento es una matriz de tipo char en donde se gurda la información leída del fichero, el segundo argumento es la posición dentro de la matriz a partir de la cual voy a escribir en el fichero y el tercero y último es el número de caracteres de la matriz que se

erra el flujo de lectura a un fichero. Si el flujo de escritura no se cierra, la

escritura que permiten manejar los tipos primitivos de java y la clase

DataOutputStream(OutputStream): Esta clase OutputStream es una clase abstracta. Es la clase

void writeUTF(String): Para escribir la cadena que se pasa como argumento. Este formato incluye información sobre la longitud exacta de la cadena, nos permite recuperar la cadena con facilidad

writeBoolean(boolean): Para escribir la variable de tipo boolean que se pasa como

void writeByte(int): Para escribir como byte el tipo int que se pasa como argumento.

void writeDouble(double): Para escribir como byte 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.

que se pasa como argumento.

Page 94: JavaModulo2 _2

©

• void writeChar(char): Para escribir como carácter el tipo entero que se pasa como argumento(el código ASCII del caracter).

• void close(): Cierra el flujo de escritura a un fichero. Si el flujo de escritura no se cierra, la información 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 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 if (archivo.exists()){ SBOREESCRIBIR (SI/NO)?"); (System.in)).readLine().trim(); } //compareToIgnoreCase es que cy minusculas if (respuesta.compareToIgnoreCase("si")==0){ FileOutputStream(nombrefich)); }else{ 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 DETECLADO: "); int codigo = Integer.parseInt(new BufferedReader (new InputStreamReader (System.in))._

Para uso exclusivo de los alumnos de CETICSA S.L.

void writeChar(char): Para escribir como carácter el tipo entero que se pasa como argumento(el código ASCII del caracter).

void close(): Cierra el flujo de escritura a un fichero. Si el flujo de escritura no se cierra, la mación del fichero no se escribe y puede perder su contenido.

El siguiente ejemplo permite escribir con la clase DataOutputStream.

static DataOutputStream flujoescritura;

atic void main (String[] args){

String respuesta=""; System.out.println("INTRODUCE EL FICHERO DE CLAVES POR TECLADO")

String nombrefich= new BufferedReader (new InputStreamReader

archivo= new File (nombrefich) if (archivo.exists()){ System.out.println ("EL FICHERO YA EXISTE ¿DESEA

respuesta= new BufferedReader (new InputStreamReader

} //compareToIgnoreCase es que compare sin distinguir mayusculas

if (respuesta.compareToIgnoreCase("si")==0){ flujoescritura = new DataOutputStream ( new }else{ flujoescritura= new DataOutputStream (new

FileOutputStream(nombrefich,true)); } System.out.println ("INTRODUCE EL NOMBRE DE USUARIO POR

String nombre= new BufferedReader (new InputStreamReader

System.out.println ("INTRODUCE EL CODIGO DE

int codigo = Integer.parseInt(new BufferedReader (new InputStreamReader (System.in))._

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página9

5

void writeChar(char): Para escribir como carácter el tipo entero que se pasa como

void close(): Cierra el flujo de escritura a un fichero. Si el flujo de escritura no se cierra, la

System.out.println("INTRODUCE EL FICHERO DE CLAVES POR TECLADO") ;

String nombrefich= new BufferedReader (new InputStreamReader

;

System.out.println ("EL FICHERO YA EXISTE ¿DESEA

respuesta= new BufferedReader (new InputStreamReader

ompare sin distinguir mayusculas

if (respuesta.compareToIgnoreCase("si")==0){ flujoescritura = new DataOutputStream ( new

flujoescritura= new DataOutputStream (new

System.out.println ("INTRODUCE EL NOMBRE DE USUARIO POR

String nombre= new BufferedReader (new InputStreamReader

System.out.println ("INTRODUCE EL CODIGO DE USUARIO POR

int codigo = Integer.parseInt(new BufferedReader (new

Page 95: JavaModulo2 _2

©

readLine().trim()); flujoescritura.writeInt(codigo); flujoescritura.writeUTF(nombre); }catch (IOException ioe){ System.oINFORMACION EN EL FICHERO " + _archivo.getName()); }finally{ try{ }catch (IOException ioe){ CORRECTAMENTE EL FLUJO _ DEL FICHERO EL FICHERO " + archivo.getName()); } } } } CLASE DATAINPUTSTREAM

Para crear un flujo que permite leer información 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 información de los tipos primitivos de java, incluyendo la clase String.

Métodos:

Tiene los mismos métodos que la clase anterior:

writeUTF�readUTF

write...�read....

...................

Los métodos propagan una excepción IOException.

Hay una excepción EOFExeption cuando intentas leer de un fichero que ya no tiene información.

Para leer la información a través de la 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.*;

Para uso exclusivo de los alumnos de CETICSA S.L.

flujoescritura.writeInt(codigo); flujoescritura.writeUTF(nombre);

}catch (IOException ioe){ System.out.println("NO SE HA PODIDO ESCRIBIR LA

INFORMACION EN EL FICHERO " + _

try{ if (flujoescritura!=null){ flujoescritura.close(); } }catch (IOException ioe){ System.out.println("NO SE HA PODIDO CERRAR

DEL FICHERO EL FICHERO " + archivo.getName()); }

Para crear un flujo que permite leer información y recuperarla directamente comom un tipo primitivo de java, incluyendo la clase String.

DataInputStream(InputStream): La clase InputStream es una clase abstracta, es la clase base para cualquier tipo de flujo que lea información de los tipos primitivos de java, incluyendo la clase String.

clase anterior:

Los métodos propagan una excepción IOException.

Hay una excepción EOFExeption cuando intentas leer de un fichero que ya no tiene información.

Para leer la información a través de la clase DataInputStream, obligatoriamente esa información 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.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página9

6

ut.println("NO SE HA PODIDO ESCRIBIR LA

System.out.println("NO SE HA PODIDO CERRAR

Para crear un flujo que permite leer información y recuperarla directamente comom un tipo primitivo

DataInputStream(InputStream): La clase InputStream es una clase abstracta, es la clase base para cualquier tipo de flujo que lea información de los tipos primitivos de java, incluyendo la clase String.

Hay una excepción EOFExeption cuando intentas leer de un fichero que ya no tiene información.

clase DataInputStream, obligatoriamente esa información

Page 96: JavaModulo2 _2

©

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 (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){ flujolectura.readInt()); flujolectura.readUTF()); } }catch (FileNotFoundException e){ " + _ 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{ }catch (IOExcepti CORRECTAMENTE EL _ FLUJO DEL FICHERO " + archivo.getName()); } } } }

Para uso exclusivo de los alumnos de CETICSA S.L.

static DataInputStream flujolectura;

public static void main (String[] args){

System.out.println("INTRODUCE EL FICHERO DE CLAVES POR TECLADO")

archivo= new File (new BufferedReader (new InputStreamReader

flujolectura= new DataInputStream (new

//Ojo el orden al leer tiene que ser el mismo que al escribirwhile (true){ System.out.println ("CODIGO DE USUARIO: "+ System.out.println ("NOMBRE DE USUARIO: "+

}

}catch (FileNotFoundException e){ System.out.println("NO SE HA PODIDO ENCONTRAR EL FICHERO

}catch (EOFException e){ }catch (IOException ioe){

System.out.println("NO SE HA PODIDO LEER LA INFORMACION EN

try{ if (flujolectura!=null){ flujolectura.close(); } }catch (IOException ioe){ System.out.println("NO SE HA PODIDO CERRAR

FLUJO DEL FICHERO " + archivo.getName()); }

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página9

7

System.out.println("INTRODUCE EL FICHERO DE CLAVES POR TECLADO") ;

BufferedReader (new InputStreamReader

//Ojo el orden al leer tiene que ser el mismo que al escribir

ln ("CODIGO DE USUARIO: "+

System.out.println ("NOMBRE DE USUARIO: "+

System.out.println("NO SE HA PODIDO ENCONTRAR EL FICHERO

System.out.println("NO SE HA PODIDO LEER LA INFORMACION EN

System.out.println("NO SE HA PODIDO CERRAR

Page 97: JavaModulo2 _2

©

CLASE OBJECTOUTPUTSTREAM

Flujo que se utiliza para poder escribir objetos de cualquier clase java a cualquier otro

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 métodos que DataOutputStream mas:

void writeObject(Object): Para escribir a través del flujo que está asociado al objeto que se pasa como argumento.

Propagan la excepción IOException.

Para poder utilizar este flujo los objetos han dde un flujo se encarga de almacenar los valores de sus variables miembro.

La serialización es el proceso por el cual un objeto o una colección de objetos se convierten en una serie de bytes que pueden ser 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 son aquellos que pertenecen a las clases que implementan la interface serializable, esta interface que pertenece al paquete IO de java no tiene métodos, únicamente avisa al compilador que los objetos que pertenecen a esa clase se encargan ellos mismosinformación 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 número de objetos a través del flEn el caso particular de que el objeto destino sea un fichero, solo va a permitir una operación de lectura.

Si se utilizan flujos de lectura y escritura de objetos en distintas aplicaciones, las clases de dichos objetos tienen que estar obligatoriamenfichero que la aplicación.

CLASE OBJECTINPUTSTREAM

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

Constructores:

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

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

Para uso exclusivo de los alumnos de CETICSA S.L.

CLASE OBJECTOUTPUTSTREAM

Flujo que se utiliza para poder escribir objetos de cualquier clase java a cualquier otro

ObjectOutputStream(): Para crear un objeto que permite escribir objetos de java sobre cualquier

ObjectOutputStream(OutputStream): Crea un flujo que permite escribir objetos de java en el objeto como argumento.

Mismos métodos que DataOutputStream mas:

void writeObject(Object): Para escribir a través del flujo que está asociado al objeto que se pasa

Propagan la excepción IOException.

Para poder utilizar este flujo los objetos han de ser PERSISTENTES: Aquel que al ser escrito a través de un flujo se encarga de almacenar los valores de sus variables miembro.

La serialización es el proceso por el cual un objeto o una colección de objetos se convierten en una 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.

ntes son aquellos que pertenecen a las clases que implementan la interface serializable, esta interface que pertenece al paquete IO de java no tiene métodos, únicamente avisa al compilador que los objetos que pertenecen a esa clase se encargan ellos mismos

Si una clase tiene como variable miembro un objeto de otra clase, a su vez debe implementar la

La clase ObjectOutputStream permite la escritura de cualquier número de objetos a través del flEn el caso particular de que el objeto destino sea un fichero, solo va a permitir una operación de

Si se utilizan flujos de lectura y escritura de objetos en distintas aplicaciones, las clases de dichos objetos tienen que estar obligatoriamente en un paquete. Estas clases no pueden estar en el mismo

CLASE OBJECTINPUTSTREAM

Es la clase que representa un flujo de lectura de objetos java que previamente han sido escritos con

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

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

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página9

8

Flujo que se utiliza para poder escribir objetos de cualquier clase java a cualquier otro objeto.

ObjectOutputStream(): Para crear un objeto que permite escribir objetos de java sobre cualquier

ObjectOutputStream(OutputStream): Crea un flujo que permite escribir objetos de java en el objeto

void writeObject(Object): Para escribir a través del flujo que está asociado al objeto que se pasa

e ser PERSISTENTES: Aquel que al ser escrito a través

La serialización es el proceso por el cual un objeto o una colección de objetos se convierten en una 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

ntes son aquellos que pertenecen a las clases que implementan la interface serializable, esta interface que pertenece al paquete IO de java no tiene métodos, únicamente avisa al compilador que los objetos que pertenecen a esa clase se encargan ellos mismos de guardar la

Si una clase tiene como variable miembro un objeto de otra clase, a su vez debe implementar la

La clase ObjectOutputStream permite la escritura de cualquier número de objetos a través del flujo. En el caso particular de que el objeto destino sea un fichero, solo va a permitir una operación de

Si se utilizan flujos de lectura y escritura de objetos en distintas aplicaciones, las clases de dichos te en un paquete. Estas clases no pueden estar en el mismo

Es la clase que representa un flujo de lectura de objetos java que previamente han sido escritos con

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

ObjectInputStream (InputStream): Crea un flujo que permite leer objetos de java en el objeto

Page 98: JavaModulo2 _2

©

Métodos:

Mismos métodos 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 los métodos propagan una excepción de la clase IOException.

El método readObject propaga la excepción ClassNotFoundException(Cuando se intenta hacer un cast al objeto que se ha leído de una case que no es), y la excepción StreamCorruptedException(cuando 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 información

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 = b; m_telefono = c ; m_email = d; } public String Obtener_Nombre() {return m_nombre ;} public String Obtener_Apellidos() {return m_apellidos ;} public String Obtener_Telefono() {return m_telefono ;} public String Obtener_Email() {return }

Creamos la clase Escritura, esta clase será la encargada de guardar la información de los clientes en un fichero de texto. La escritura la realizaremos a través de la creación de un objeto Persona.

package ejemplos; import java.io.*; import Utilidades.*; class Escritura { static ObjectOutputStream flujoescritura; static File archivo, carpeta;

Para uso exclusivo de los alumnos de CETICSA S.L.

métodos 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();

s los métodos propagan una excepción de la clase IOException.

El método readObject propaga la excepción ClassNotFoundException(Cuando se intenta hacer un cast al objeto que se ha leído de una case que no es), y la excepción StreamCorruptedException(cuando se intenta hacer más de una operación de lectura a través de la

Creamos la clase persona en el paquete utilidades. La clase Persona implementará la clase serializable, y será la encargada de guardar la información serializada.

public class Persona implements java.io.Serializable{

private String m_nombre, m_apellidos, m_telefono, m_email;

public Persona (String a,String b,String c, String d){

m_nombre = a ; os = b;

m_telefono = c ; m_email = d;

public String Obtener_Nombre() {return m_nombre ;} public String Obtener_Apellidos() {return m_apellidos ;} public String Obtener_Telefono() {return m_telefono ;} public String Obtener_Email() {return m_email ;}

Creamos la clase Escritura, esta clase será la encargada de guardar la información de los clientes en un fichero de texto. La escritura la realizaremos a través de la creación de un objeto Persona.

static ObjectOutputStream flujoescritura; static File archivo, carpeta;

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página9

9

object readObject(): Para leer un objeto asociado al flujo y devolverlo de tipo Object. Hay que hacer

El método readObject propaga la excepción ClassNotFoundException(Cuando se intenta hacer un cast al objeto que se ha leído de una case que no es), y la excepción

se intenta hacer más de una operación de lectura a través de la

Creamos la clase persona en el paquete utilidades. La clase Persona implementará la clase

Creamos la clase Escritura, esta clase será la encargada de guardar la información de los clientes en un fichero de texto. La escritura la realizaremos a través de la creación de un objeto Persona.

Page 99: JavaModulo2 _2

©

public static void main (String[] args){ carpeta= new File ("Clientes"); if (!carpeta.exists()){ } archivo = new File try{ flujoescritura = new ObjectOutputStream ( new FileOutputStream (archivo)); flujoescritura.writeObject( new Persona ("Pepe", "Salas Pérez", "919622314","[email protected]")); System.out.println("SE HA ESCRITO EN EL FICH }catch (IOException e){ System.out.println("NO SE HA PODIDO ESCRIBIR LA INFORMACION EN EL FICHERO "+ archivo); }finally{ try { }catch(IOException e){ CORRECTAMENTE _ EL FLUJO ASOCIADO AL FICHERO "+ archivo); } } } }

La clase Lectura utilizará un objeto ObjectInputStream para realizar la lectura de la información 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 (archivo)); Persona obj = (Persona) flujolectura.readObject(); System.out.println("NOMBRE "+obj.Obtener_Nombre()+ " APELLIDOS "+_ obj.Obtener_Apellidos()); System.out.println("TELEFONO "+obj.Obtener_Telefono()+ " EMAIL "+ _ obj.Obtener_Email());

Para uso exclusivo de los alumnos de CETICSA S.L.

public static void main (String[] args){ carpeta= new File ("Clientes"); if (!carpeta.exists()){

carpeta.mkdir();

archivo = new File (carpeta, "Correos.txt");

flujoescritura = new ObjectOutputStream ( new FileOutputStream (archivo));flujoescritura.writeObject( new Persona ("Pepe", "Salas Pérez",

"919622314","[email protected]")); System.out.println("SE HA ESCRITO EN EL FICHERO "+ archivo);

}catch (IOException e){ System.out.println("NO SE HA PODIDO ESCRIBIR LA INFORMACION EN EL FICHERO "+

try { if (flujoescritura!=null){ flujoescritura.close(); } }catch(IOException e){ System.out.println("NO SE HA PODIDO CERRAR

EL FLUJO ASOCIADO AL FICHERO "+ archivo); }

La clase Lectura utilizará un objeto ObjectInputStream para realizar la lectura de la información

static ObjectInputStream flujolectura;

public static void main (String args[]){ archivo = new File ("Clientes","Correos.txt");

flujolectura = new ObjectInputStream (new FileInputStream

Persona obj = (Persona) flujolectura.readObject();System.out.println("NOMBRE "+obj.Obtener_Nombre()+ "

System.out.println("TELEFONO "+obj.Obtener_Telefono()+ "

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

00

flujoescritura = new ObjectOutputStream ( new FileOutputStream (archivo));

System.out.println("NO SE HA PODIDO ESCRIBIR LA INFORMACION EN EL FICHERO "+

System.out.println("NO SE HA PODIDO CERRAR

La clase Lectura utilizará un objeto ObjectInputStream para realizar la lectura de la información

(new FileInputStream

Persona obj = (Persona) flujolectura.readObject(); System.out.println("NOMBRE "+obj.Obtener_Nombre()+ "

System.out.println("TELEFONO "+obj.Obtener_Telefono()+ "

Page 100: JavaModulo2 _2

©

}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{ }catch(IOException e){ _ EL FLUJO ASOCIADO AL FICHERO"); } } } }

CLASE RANDOMACCESSFILE

Es la clase encargada de crear ficheromovernos hacia la derecha, hacia la izquierda, saltar posiciones,…

Se puede escribir partes del fichero sin necesidad de cerrarlo y añadir información al final del fichero.

Cuando queramos abrir 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: sólo lectura "r", o lectura/escritura "r/w".

RandomAccessFile Fichero = new RandomAccessFile ("

En el siguiente ejemplo crearemos una aplicación 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 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;

Para uso exclusivo de los alumnos de CETICSA S.L.

}catch(ClassNotFoundException e){ System.out.println("NO SE HA PODIDO CONVERTIR LA

}catch(IOException e){ System.out.println("NO SE HA PODIDO LEER LA INFORMACION

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 aleatorios, son los más fáciles 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 añadir información al final del

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: sólo lectura "r", o lectura/escritura "r/w".

= new RandomAccessFile ("datos.txt","rw");

En el siguiente ejemplo crearemos una aplicación 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

private static final int TAM_MAX=50; private static final int NOMBRE_MAX=30; private static final int MODULO_MAX=15;

static RandomAccessFile nota;

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

01

System.out.println("NO SE HA PODIDO CONVERTIR LA

System.out.println("NO SE HA PODIDO LEER LA INFORMACION

System.out.println("NO SE HA PODIDO CERRAR CORECTAMENTE

s aleatorios, son los más fáciles de tratar ya que nos permiten

Se puede escribir partes del fichero sin necesidad de cerrarlo y añadir información al final del

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: sólo

En el siguiente ejemplo crearemos una aplicación que nos permita guradar datos de los alumnos de un curso en un fichero de texto con RandomAccesFile.Crearemos un menú para poder seleccionar

completo, Ver notas de un alumno, Modificar nota y

Page 101: JavaModulo2 _2

©

//--------------------------------------------------------------- public static void Listar (String[] opc){ System.out.println(" for (int i=1; i<=opc.length ; System.out.println(" } System.out.println(" } //--------------------------------------------------------------- public static String Datos(String s){ try{ System.out.println("----"); System.out.print(s); return (new BufferedReader (new InputStreamReader (System.in)))._ readLine().trim(); }catch (IOException ioe){ System.out.println("entrada/salida\n"); } return ""; } //--------------------------------------------------------------- public static void meterNotaEnFichero(){ try{ String aux=""; nota.seek( NumRegistros( do{ --------------"); }while(aux.l nota.writeUTF(aux);

Para uso exclusivo de los alumnos de CETICSA S.L.

--------------------------------------------------------------- public static void Listar (String[] opc){

System.out.println("--------------------------------------------------------for (int i=1; i<=opc.length ; i++){

System.out.println("\t\t"+i+".- "+opc[i-1]);

System.out.println("--------------------------------------------------------

--------------------------------------------------------------- public static String Datos(String s){

System.out.println("----------------------------------------------------

System.out.print(s); return (new BufferedReader (new InputStreamReader

}catch (IOException ioe){ System.out.println("\nError interno en sistema de

---------------------------------------------------------------

public static void meterNotaEnFichero(){

String aux="";

nota.seek( NumRegistros()* TAM_MAX);

do{ aux=Datos("Introduce nombre: "); if (aux.length()>=NOMBRE_MAX){ System.out.println("\nNombre demasiado largo System.out.println("------------------------------------------

} }while(aux.length()>=NOMBRE_MAX);

nota.writeUTF(aux);

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

02

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

1]);

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

----------------------------------------------------

return (new BufferedReader (new InputStreamReader

nError interno en sistema de

nNombre demasiado largo\n"); ------------------------------------------

Page 102: JavaModulo2 _2

©

do{ largo"); --------------"); }while(aux.length()>=MODULO_MAX); nota.writeUTF(aux); System.out.println("----"); otro:do{ }while(false); }catch(IOException ioe){ System.out.print(" } } //--------------------------------------------------------------- public static void listadoCompleto(){ if (NumRegistros()!=0){ System.out.println("-----------"); System.out.println(" try{ for (int i=0; i<NumRegistros();i++){ -----"); }

Para uso exclusivo de los alumnos de CETICSA S.L.

do{ aux=Datos("Introduce modulo: "); if (aux.length()>=MODULO_MAX){ System.out.println("\nNombre de modulo demasiado

System.out.println("------------------------------------------

} }while(aux.length()>=MODULO_MAX);

nota.writeUTF(aux); 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){ t.print("\nError "+ioe.toString());

---------------------------------------------------------------

public static void listadoCompleto(){

if (NumRegistros()!=0){ System.out.println("\n\t LISTADO COMPLETO\n----------------------------------

System.out.println("\n---------------------------------------------

for (int i=0; i<NumRegistros();i++){ nota.seek(i* TAM_MAX); System.out.println("\nNombre: "+ 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.

Página1

03

nNombre de modulo demasiado

------------------------------------------

----------------------------------------------------

aux=Datos("Introduce nota: "); nota.writeInt(Integer.parseInt(aux));

System.out.println("Debes introducir un numero");

----------------------------------

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

nNombre: "+ nota.readUTF()); System.out.println("Modulo: "+ nota.readUTF()); System.out.println("Nota: "+ nota.readInt());

----------------------------------------

Page 103: JavaModulo2 _2

©

}catch (IOException ioe){ System.out.println(" } }else{ System.out.println(" } } //--------------------------------------------------------------- public static void notasDe1Alumno(){ String aux=""; boolean esta=false; if (NumRegistros()>0) { aux = Datos("Introduce el nombre de un alumno: "); try{ (aux.compareToIgnoreCase(nota.readUTF())==0){ ---------------------"); nota.readUTF()); nota.readUTF()); nota.readInt()); }catch (IOException ioe){ } }else{ System.out.println("No hay datos en el fichero"); } } //--------------------------------------------------------------- public static void modificarNota(){

Para uso exclusivo de los alumnos de CETICSA S.L.

}catch (IOException ioe){ System.out.println("\nError "+ioe.toString());

System.out.println("\nNo hay registros introducidos");

---------------------------------------------------------------

public static void notasDe1Alumno(){

{ aux = Datos("Introduce el nombre de un alumno: ");

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("\

System.out.println("Nombre: "+

System.out.println("Modulo: "+

System.out.println("Nota: "+

esta=true; } } if (esta==false){ System.out.println("\nEse alumno no se encuentra"); }

}catch (IOException ioe){ System.out.println("\nError "+ioe.toString());

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.

Página1

04

e.toString());

nNo hay registros introducidos");

nota.seek(i* TAM_MAX); \n------------------------

System.out.println("Nombre: "+

System.out.println("Modulo: "+

System.out.println("Nota: "+

nEse alumno no se encuentra");

nError "+ioe.toString());

Page 104: JavaModulo2 _2

©

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{ (aux.compareToIgnoreCase(nota.readUTF())==0){ (aux2.compareToIgnoreCase(nota.readUTF())==0){ nota.readUTF()); nota.readUTF()); nota: "); nota.writeInt(Integer.parseInt(opcion)); }catch (IOException ioe){ } }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 return 0;

Para uso exclusivo de los alumnos de CETICSA S.L.

{ aux = Datos("Introduce el nombre de un alumno: ");

Datos("Introduce el modulo: "); String opcion="";

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* TAM_MAX); System.out.println("Nombre: "+

System.out.println("Modulo: "+

opcion = Datos("Introduce la nueva

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 "+ioe.toString());

System.out.println("No hay datos en el fichero");

---------------------------------------------------------------

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.

Página1

05

.seek(i* TAM_MAX); System.out.println("Nombre: "+

System.out.println("Modulo: "+

opcion = Datos("Introduce la nueva

System.out.println("Esos datos no se encuentra");

nError "+ioe.toString());

return (int)Math.ceil ((double)nota.length()/ (double)TAM_MAX);

ENTRADA/SALIDA");

Page 105: JavaModulo2 _2

©

} } //--------------------------------------------------------------- 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{ erronea"); }catch (NumberFormatException e){ System.out.println("La opcion tiene que ser un numero"); } }catch (IOException ioe){ System.out.print(" }finally{ try{

Para uso exclusivo de los alumnos de CETICSA S.L.

---------------------------------------------------------------

public static void main (String[] args){

String[] menu1={"Introducir nota", "Listado completo","Ver notas de un

String opcion;

nota=new RandomAccessFile ("notas.txt","rw");

fin:do{

Listar(menu1); opcion = Datos("Introduce una opcion: ");

try{ switch (Integer.parseInt(opcion)){

case 1: meterNotaEnFichero();

case 2: listadoCompleto();

case 3: notasDe1Alumno();

case 4: modificarNota();

case 5: break fin;

default: System.out.println("Opcion

} }catch (NumberFormatException e){

System.out.println("La opcion tiene que ser un numero");

}while(true);

}catch (IOException ioe){ System.out.print("\nError "+ioe.toString());

try{

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

06

String[] menu1={"Introducir nota", "Listado completo","Ver notas de un

nota=new RandomAccessFile ("notas.txt","rw");

opcion = Datos("Introduce una opcion: ");

switch (Integer.parseInt(opcion)){

meterNotaEnFichero(); break;

listadoCompleto(); break;

case 3: notasDe1Alumno(); break;

case 4: modificarNota(); break;

default: System.out.println("Opcion

System.out.println("La opcion tiene que ser un numero");

nError "+ioe.toString());

Page 106: JavaModulo2 _2

©

}catch (IOException ioe){ } } } }

Ver Video: ObjectOutputStream_ObjectInputStream

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

Objetivos • Conocer los objetos que implementan

• Trabajar con la E/S de datos por consola y archivos

Introducción 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, página web

El acceso a la entrada y salida estándar crean automáticamente al iniciar la aplicación: System.in, System.out y 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 elfichero, un socket, o cualquier otro dispositivo de entrada. Esto, por un lado es una ventaja. Si todas esas cosas son InputStream, podemos hacer código que lea de ellas sin saber qué estamos leyendo. Por otro lado, es una pega. Como un Inputbytes. Nosotros queremos leer palabras o números del teclado, no bytes. Si escribimos en el teclado una A mayúscula y la leemos con System.in, obtendremos un entero de valor 65, que es el valor del byte correspondiente a la A.

LOS Reader

Para java, una clase Reader es una clase que lee caracteres. Esto se parece más a lo que queremos. Un Reader tiene métodos para leer caracteres. Con esta clase ya podriamos trabajar. La pena es que seguimos teniendo System.in, que es un InputStream y no un Reader.

Para uso exclusivo de los alumnos de CETICSA S.L.

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

Video: ObjectOutputStream_ObjectInputStream

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

Conocer los objetos que implementan la salida estándar en java

Trabajar con la E/S de datos por consola y archivos

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, página web, applet,…

El acceso a la entrada y salida estándar de datos en Java es controlado por tres objetos que se crean automáticamente al iniciar la aplicación: System.in, System.out y 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 elfichero, un socket, o cualquier otro dispositivo de entrada. Esto, por un lado es una ventaja. Si todas esas cosas son InputStream, podemos hacer código que lea de ellas sin saber qué estamos leyendo.

Por otro lado, es una pega. Como un InputStream es para leer bytes, sólo tiene métodos para leer bytes. Nosotros queremos leer palabras o números del teclado, no bytes. Si escribimos en el teclado una A mayúscula y la leemos con System.in, obtendremos un entero de valor 65, que es el valor del

Para java, una clase Reader es una clase que lee caracteres. Esto se parece más a lo que queremos. Un Reader tiene métodos para leer caracteres. Con esta clase ya podriamos trabajar. La pena es que

stem.in, que es un InputStream y no un Reader.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

07

nError "+ioe.toString());

Video: ObjectOutputStream_ObjectInputStream

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

la salida estándar en java

En esta unidad trataremos la E/S de los datos del usuario desde su equipo, datos introducidos por

es controlado por tres objetos que se crean automáticamente al iniciar la aplicación: System.in, System.out y System.err.

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 código que lea de ellas sin saber qué estamos leyendo.

Stream es para leer bytes, sólo tiene métodos para leer bytes. Nosotros queremos leer palabras o números del teclado, no bytes. Si escribimos en el teclado una A mayúscula y la leemos con System.in, obtendremos un entero de valor 65, que es el valor del

Para java, una clase Reader es una clase que lee caracteres. Esto se parece más a lo que queremos. Un Reader tiene métodos para leer caracteres. Con esta clase ya podriamos trabajar. La pena es que

Page 107: JavaModulo2 _2

©

¿Cómo convertimos el System.in en Reader?. Hay una clase en java, la InputStreamReader, que nos hace esta conversión. Para obtener un Reader, únicamente tenemos que instanciar un InputStreamReader pasándole en

InputStreamReader isr = new InputStreamReader(System.in);

Estamos declarando una variable "isr" de tipo InputStreamReader. Creamos un objeto de esta clase haciendo new InputStreamReader(...). Entre 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 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 podríamos apañarnos. 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 InputStreamReader, como lee caracteres sueltos, Tenemos que decirle cuántos queremos (que no lo sabemos), o bien ir pidiendo de uno en uno hasta que no haya más. La clase BufferedReader posee el Reader cualquiera (por ejemplo el InputStreamReader), es similar al que usamos antes. instanciamos pasándole en el construtor el Reader. El código es

BufferedReader br = new BufferedReader (isr);

El funcionamiento de esta clase es igual que el InputStrcompleta 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 método readLine(). Este método lee todos los caracteres tecle(recibidos si fuera otro dispositivo de entrada) hasta que encuentra la pulsación de la tecla

o como quieras llamarla.

String texto = br.readLine();

La clase System.in nos permite acceder a la lectura de caracteres. Para la lectura de los ctendremos 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 realizarán mediante wrapping de clases. Es decir, sobre la InputStreamReader, y sobre este un BufferedReader.

Ejemplo:

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

Métodos más impotantes:

skip(n): Ignora los n caracteres siguientes de la entrada.

Para uso exclusivo de los alumnos de CETICSA S.L.

¿Cómo convertimos el System.in en Reader?. Hay una clase en java, la InputStreamReader, que nos hace esta conversión. Para obtener un Reader, únicamente tenemos que instanciar un

el constructor un InputStream. El código 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 paréntesis 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.

Al constuirlo le hemos pasado un InputStream, en concreto, System.in. InputStreamReader de

Cuando a InputStreamReader le pedimos caracteres, él le pide al InputStream que tiene guardado a caracteres y nos los devuelve.

Con la clase InputStreamReader podríamos apañarnos. 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

os InputStreamReader, como lee caracteres sueltos, Tenemos que decirle cuántos queremos (que no lo sabemos), o bien ir pidiendo de uno en uno hasta que no haya más.

el mecanismo para obtener un BufferedReader a partir de otroReader cualquiera (por ejemplo el InputStreamReader), es similar al que usamos antes. instanciamos pasándole en el construtor el Reader. El código es

BufferedReader br = new BufferedReader (isr);

El funcionamiento de esta clase es igual que el InputStreamReader. Cuando le pedmos una línea completa de caracteres (un String), ella se lo pide al Reader que tenga dentro, los convierte en

Para pedirle un String, se usa el método readLine(). Este método lee todos los caracteres tecle(recibidos si fuera otro dispositivo de entrada) hasta que encuentra la pulsación de la tecla

o como quieras llamarla.

La clase System.in nos permite acceder a la lectura de caracteres. Para la lectura de los ctendremos 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 realizarán mediante wrapping de clases. Es decir, sobre la consola, montamos un InputStreamReader, y sobre este un BufferedReader.

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

skip(n): Ignora los n caracteres siguientes de la entrada.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

08

¿Cómo convertimos el System.in en Reader?. Hay una clase en java, la InputStreamReader, que nos hace esta conversión. Para obtener un Reader, únicamente tenemos que instanciar un

el constructor un InputStream. El código es el siguiente

Estamos declarando una variable "isr" de tipo InputStreamReader. Creamos un objeto de esta clase paréntesis le pasamos el InputStream que queremos

InputStreamReader es un Reader. Se comporta igual que in Reader y se puede poner en cualquier

Al constuirlo le hemos pasado un InputStream, en concreto, System.in. InputStreamReader de

Cuando a InputStreamReader le pedimos caracteres, él le pide al InputStream que tiene guardado

Con la clase InputStreamReader podríamos apañarnos. 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

os InputStreamReader, como lee caracteres sueltos, Tenemos que decirle cuántos queremos (que no lo sabemos), o bien ir pidiendo de uno en uno hasta que no haya más.

mecanismo para obtener un BufferedReader a partir de otro Reader cualquiera (por ejemplo el InputStreamReader), es similar al que usamos antes. Lo

eamReader. Cuando le pedmos una línea completa de caracteres (un String), ella se lo pide al Reader que tenga dentro, los convierte en

Para pedirle un String, se usa el método readLine(). Este método lee todos los caracteres tecleados (recibidos si fuera otro dispositivo de entrada) hasta que encuentra la pulsación de la tecla

System.in La clase System.in nos permite acceder a la lectura de caracteres. Para la lectura de los caracteres 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 consola, montamos un

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

Page 108: JavaModulo2 _2

©

read():Si no se ha introducido ningún carácter por el teclado devuelve el valor

1. Devuelve el carácter que se ha introducido por el teclado leyéndolo del buffer de entrada y lo elimina del buffer para que en la siguiente lectura sea leído el siguiente carácter.

En el siguiente ejemplo recogemos un número por teclado y mostramos en pantalla si el número es par o impar.

import java.io.*; public class Ejemplo { public static void main(String[] args) throws IOException{String numero; BufferedReader teclado=new Buffer System.out.println("Introduzca número:"); numero=teclado.readLine(); int num=Integer.parseInt(numero); int dato=Integer.parseInt(numero); if (dato%2==0){ System.out.println("El dato "+dato+" es p } else{ System.out.println("El dato "+dato+" es impar"); } } }

Introduzca número: 5 El dato 5 es impar

Este objeto implementa la salida estándar. Se pueden utilizar los métodos print() y println() con cualquier tipo básico Java como argumento.

Una de las novedades desde la versión 1.5 de java es el famoso printf tan usado en C. Este método nos permite definir como representar multitud de tipos de datos sin mucho trabajo.

En este ejemplo obligamos la salida a 14 posiciones,

Para uso exclusivo de los alumnos de CETICSA S.L.

ha introducido ningún carácter por el teclado devuelve el valor

1. Devuelve el carácter que se ha introducido por el teclado leyéndolo del buffer de entrada y lo elimina del buffer para que en la siguiente lectura sea leído el siguiente carácter.

el siguiente ejemplo recogemos un número por teclado y mostramos en pantalla si el número es

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

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

System.out.println("Introduzca número:");

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");

System.out.println("El dato "+dato+" es impar");

Este objeto implementa la salida estándar. Se pueden utilizar los métodos print() y println() con Java como argumento.

Una de las novedades desde la versión 1.5 de java es el famoso printf tan usado en C. Este método nos permite definir como representar multitud de tipos de datos sin mucho trabajo.

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

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

09

ha introducido ningún carácter por el teclado devuelve el valor –

1. Devuelve el carácter que se ha introducido por el teclado leyéndolo del buffer de entrada y lo elimina del buffer para que en la siguiente lectura sea leído el siguiente carácter.

el siguiente ejemplo recogemos un número por teclado y mostramos en pantalla si el número es

edReader(new InputStreamReader(System.in));

System.out Este objeto implementa la salida estándar. Se pueden utilizar los métodos print() y println() con

Una de las novedades desde la versión 1.5 de java es el famoso printf tan usado en C. Este método nos permite definir como representar multitud de tipos de datos sin mucho trabajo.

con el símbolo y cuatro decimales.

Page 109: JavaModulo2 _2

©

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á:

En java podemos implementar el objeto System.err para la salida de errores.

Las funciones que tenemos en System.out son idénticas 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 número por teclado y mostramos en pantalla si el número es par o impar. Si el número es impar lanzamos un System.err.

import java.io.*; public class Ejemplo { public static void main(String[] args) throString numero; BufferedReader teclado=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Introduzca número:"); 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 operación" ); } } }

Introduzca número: 3 Dato impar no se puede realizar la operaciónEl dato 3 es impar

Para uso exclusivo de los alumnos de CETICSA S.L.

public static void main(String [] params)

float valor = 10.23f;

System.out.printf("El valor es %+14.4f",valor);

implementar el objeto System.err para la salida de errores.

Las funciones que tenemos en System.out son idénticas a las proporcionadas por System.out.

Es muy habitual imprimir el error en un fichero de texto dedicado a ir guardado los mensajes de

En el siguiente ejemplo recogemos un número por teclado y mostramos en pantalla si el número es par o impar. Si el número es impar lanzamos un System.err.

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

BufferedReader teclado=new BufferedReader(new InputStreamReader(System.in));System.out.println("Introduzca número:"); 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");

System.out.println("El dato "+dato+" es impar"); System.err.println( "Dato impar no se puede realizar la operación" );

Dato impar no se puede realizar la operación

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

10

System.err implementar el objeto System.err para la salida de errores.

Las funciones que tenemos en System.out son idénticas a las proporcionadas por System.out.

Es muy habitual imprimir el error en un fichero de texto dedicado a ir guardado los mensajes de

En el siguiente ejemplo recogemos un número por teclado y mostramos en pantalla si el número es

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

System.err.println( "Dato impar no se puede realizar la operación" );

Page 110: JavaModulo2 _2

©

Unidad 12: Creación de interfaces gráficas con el API Swing

Introducción La base de la programación gráfica se encuentra en estos dos elementos físicos del ordenador, los cuales se diseñaron de forma conjunta con el propósito de presentar información al usuario. El comprender su funcionamiento ayuda a conocer lo que estamos haciendo cuando diseñamos un entorno gráfico.

Monitor y tarjeta gráfica El CRT (Tubo de Rayos Catódicos) está formado

- Cátodos: Aquí se generan tres haces de electrones cuya energía corresponden con los tres colores básicos, a partir de los cuales podemos obtener el resto de colores.

- Sistema de enfoque: Mediante un sistema de electroimanes (ca partir de señales eléctricas) enfocamos los tres haces de electrones sobre un punto de la pantalla. Este sistema es el encargado también de realizar el desplazamiento de dichos haces con el propósito de formar la imagen.

- Pantalla: Está formada por un material fosforescente que desprende los fotones que llegan hasta el ojo cuando los electrones chocan contra él. Además mantiene la impresión de los haces durante un tiempo que junto con la persistencia de nuestra retina nos da la sde permanencia.

A partir de este funcionamiento podemos definir una serie de parámetros:

- Pixel: la unidad básica de información de la imagen. Se corresponde con uno de los puntos donde convergen los tres haces de electrones. El tamaño actual es pequeño sea el pixel, mayores resoluciones podríamos obtener con el mismo tamaño de la pantalla.

- Resolución vertical y horizontal (resolución): Es el número de píxeles que se están representando de forma vertical (líneas) y de forma hlínea). Resoluciones típicas son: 640x480, 800x600, 1024x768.

- Frecuencia de cuadro: Es el número de imágenes que se presentan por segundo. Esta frecuencia se coge directamente de la frecuencia de la señal de red (50Hz) y que eviten el parpadeo.

- Entrelazado: Tecnología que permite representar primero las líneas impares y posteriormente las líneas pares con lo que se consigue que la vista se canse menos.

- Profundidad de color: Los colores que es capaz de reprdado por la capacidad que tenga el monitor de cambiar las intensidades de los tres haces de electrones. Esta variación es analógica dentro del monitor, por tanto, podríamos conseguir infinidad de colores, sin embargo, la tarjeta gráfica) manejan datos digitales que posteriormente se convierte a analógico con la correspondiente pérdida de niveles.

Para uso exclusivo de los alumnos de CETICSA S.L.

Unidad 12: Creación de interfaces gráficas con el API Swing

La base de la programación gráfica se encuentra en estos dos elementos físicos del ordenador, los de forma conjunta con el propósito de presentar información al usuario. El

comprender su funcionamiento ayuda a conocer lo que estamos haciendo cuando diseñamos un

El CRT (Tubo de Rayos Catódicos) está formado por los siguientes elementos:

Cátodos: Aquí se generan tres haces de electrones cuya energía corresponden con los tres colores básicos, a partir de los cuales podemos obtener el resto de colores.

Sistema de enfoque: Mediante un sistema de electroimanes (campos magnéticos generados a partir de señales eléctricas) enfocamos los tres haces de electrones sobre un punto de la pantalla. Este sistema es el encargado también de realizar el desplazamiento de dichos haces con el propósito de formar la imagen.

la: Está formada por un material fosforescente que desprende los fotones que llegan hasta el ojo cuando los electrones chocan contra él. Además mantiene la impresión de los haces durante un tiempo que junto con la persistencia de nuestra retina nos da la s

A partir de este funcionamiento podemos definir una serie de parámetros:

Pixel: la unidad básica de información de la imagen. Se corresponde con uno de los puntos donde convergen los tres haces de electrones. El tamaño actual es de 0.28mm. Cuanto más pequeño sea el pixel, mayores resoluciones podríamos obtener con el mismo tamaño de la

Resolución vertical y horizontal (resolución): Es el número de píxeles que se están representando de forma vertical (líneas) y de forma horizontal (número de puntos en una

Resoluciones típicas son: 640x480, 800x600, 1024x768.

Frecuencia de cuadro: Es el número de imágenes que se presentan por segundo. Esta frecuencia se coge directamente de la frecuencia de la señal de red (50Hz) y

Entrelazado: Tecnología que permite representar primero las líneas impares y posteriormente las líneas pares con lo que se consigue que la vista se canse menos.

Profundidad de color: Los colores que es capaz de representar el monitor viene directamente dado por la capacidad que tenga el monitor de cambiar las intensidades de los tres haces de electrones. Esta variación es analógica dentro del monitor, por tanto, podríamos conseguir infinidad de colores, sin embargo, los circuitos que controlan estas intensidades (situados en la tarjeta gráfica) manejan datos digitales que posteriormente se convierte a analógico con la correspondiente pérdida de niveles.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

11

Unidad 12: Creación de interfaces gráficas

La base de la programación gráfica se encuentra en estos dos elementos físicos del ordenador, los de forma conjunta con el propósito de presentar información al usuario. El

comprender su funcionamiento ayuda a conocer lo que estamos haciendo cuando diseñamos un

por los siguientes elementos:

Cátodos: Aquí se generan tres haces de electrones cuya energía corresponden con los tres colores básicos, a partir de los cuales podemos obtener el resto de colores.

ampos magnéticos generados a partir de señales eléctricas) enfocamos los tres haces de electrones sobre un punto de la pantalla. Este sistema es el encargado también de realizar el desplazamiento de dichos haces

la: Está formada por un material fosforescente que desprende los fotones que llegan hasta el ojo cuando los electrones chocan contra él. Además mantiene la impresión de los haces durante un tiempo que junto con la persistencia de nuestra retina nos da la sensación

Pixel: la unidad básica de información de la imagen. Se corresponde con uno de los puntos de 0.28mm. Cuanto más

pequeño sea el pixel, mayores resoluciones podríamos obtener con el mismo tamaño de la

Resolución vertical y horizontal (resolución): Es el número de píxeles que se están orizontal (número de puntos en una

Frecuencia de cuadro: Es el número de imágenes que se presentan por segundo. Esta frecuencia se coge directamente de la frecuencia de la señal de red (50Hz) y debe ser valores

Entrelazado: Tecnología que permite representar primero las líneas impares y posteriormente

esentar el monitor viene directamente dado por la capacidad que tenga el monitor de cambiar las intensidades de los tres haces de electrones. Esta variación es analógica dentro del monitor, por tanto, podríamos conseguir

los circuitos que controlan estas intensidades (situados en la tarjeta gráfica) manejan datos digitales que posteriormente se convierte a analógico con la

Page 111: JavaModulo2 _2

©

La evolución de los monitores:

- CGA

- EGA

- VGA

- SVGA

Tarjeta gráfica. Este es el elemento que controla todas las señales que necesita el monitor para presentar información en pantalla.

- Señales de temporización para el movimiento de los haces.

- Señales RGB para el control de la intensidad de los

La información de los colores son datos binarios situados en la memoria que tiene la propia tarjeta gráfica. Un conjunto de posiciones de memoria alberga la información para cada pixel. Por tanto, la resolución y número de colores que podtarjeta.

Conclusión: Por tanto cuando aparece un elemento gráfico en pantalla, tan sólo se han situado en la zona de memoria correspondiente un conjunto de datos binarios que codifican los colores del conjunto de píxeles de la zona de pantalla en concreto.

El sistema de coordenadas. A la hora de diseñar los programa de bajo nivel que faciliten a los programadores entorno gráfico, es necesario establecer algún sistema de referencia qpíxeles de la pantalla. Se acordó que el izquierda, la coordenada x serían las líneas, y la

Ahora bien, los lenguajes de programación puede

- Coordenadas absolutas: un botón) tendrá su origen de coordenadas en la esquina superior izquierda y tendrán los valores que correspondan con la co

- Coordenadas relativas: 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 realcoordenadas.

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 posición determinada por su anchura y altura totales, menos una unidad.

La unidad de medida son los píxeles.

A la hora de un pintar un Componente, se debe tener en cuenta, además del tamaño ya comentado, el tamaño del borde del Componente, si lo tuviera. Por ejemplo, un borde qualrededor del componente, haría que la coordenada de la esquina superior izquierda pasase de ser

Para uso exclusivo de los alumnos de CETICSA S.L.

Tarjeta gráfica. Este es el elemento que controla todas las señales que necesita el monitor para presentar información en pantalla. En concreto:

Señales de temporización para el movimiento de los haces.

Señales RGB para el control de la intensidad de los haces (colores).

La información de los colores son datos binarios situados en la memoria que tiene la propia tarjeta gráfica. Un conjunto de posiciones de memoria alberga la información para cada pixel. Por tanto, la resolución y número de colores que podemos obtener depende de la memoria que disponga la

Conclusión: Por tanto cuando aparece un elemento gráfico en pantalla, tan sólo se han situado en la zona de memoria correspondiente un conjunto de datos binarios que codifican los colores del

junto de píxeles de la zona de pantalla en concreto.

El sistema de coordenadas.

A la hora de diseñar los programa de bajo nivel que faciliten a los programadores entorno gráfico, es necesario establecer algún sistema de referencia que ponga orden en el mar de píxeles de la pantalla. Se acordó que el origen de coordenadas (0,0) sería la esquina superior

serían las líneas, y la coordenada y serían las columnas.

Ahora bien, los lenguajes de programación pueden manejar coordenadas relativas o absolutas.

Cualquier elemento que se sitúe sobre la pantalla (por ejemplo, un botón) tendrá su origen de coordenadas en la esquina superior izquierda y tendrán los valores que correspondan con la coordenada (0,0).

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 la transformación de

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

su anchura y altura totales, menos una unidad.

La unidad de medida son los píxeles.

A la hora de un pintar un Componente, se debe tener en cuenta, además del tamaño ya comentado, el tamaño del borde del Componente, si lo tuviera. Por ejemplo, un borde qualrededor del componente, haría que la coordenada de la esquina superior izquierda pasase de ser

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

12

Tarjeta gráfica. Este es el elemento que controla todas las señales que necesita el monitor para

La información de los colores son datos binarios situados en la memoria que tiene la propia tarjeta gráfica. Un conjunto de posiciones de memoria alberga la información para cada pixel. Por tanto, la

emos obtener depende de la memoria que disponga la

Conclusión: Por tanto cuando aparece un elemento gráfico en pantalla, tan sólo se han situado en la zona de memoria correspondiente un conjunto de datos binarios que codifican los colores del

A la hora de diseñar los programa de bajo nivel que faciliten a los programadores su trabajo con el ue ponga orden en el mar de

(0,0) sería la esquina superior serían las columnas.

n manejar coordenadas relativas o absolutas.

Cualquier elemento que se sitúe sobre la pantalla (por ejemplo, un botón) tendrá su origen de coordenadas en la esquina superior izquierda y tendrán los

Cualquier elemento que se coloque sobre la pantalla tendrá su propio sistema de coordenadas, es decir, la coordenada de su esquina superior izquierda será

izar la transformación de

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

A la hora de un pintar un Componente, se debe tener en cuenta, además del tamaño ya comentado, el tamaño del borde del Componente, si lo tuviera. Por ejemplo, un borde que ocupará un pixel alrededor del componente, haría que la coordenada de la esquina superior izquierda pasase de ser

Page 112: JavaModulo2 _2

©

(0,0) a (1,1) y reduciría además la anchura y altura totales del Componente es dos píxeles, uno por cada lado.

Clases de Java para la prog

Al enfrentarse con el desarrollo de una aplicación gráfica, el programador debe conocer las herramientas que le ofrece el lenguaje de programación que va a utilizar. Java dispone de una serie de clases para este menéster. Estas clases se encuentran en los siguientes paquetes:

Java.awt: El AWT (Abstract Window Toolkit) es el primer paquete que diseño Sun para el desarrollo de entornos gráficos.

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.

Swing hay que verlo como una extensión de AWT, pAWT. Es más, en la mayoría de los casos es suficiente con añadir una "J" al componente AWT para que se convierta en un componente Swing.

En Swing, los componentes de la interfaz gráfica son Beans. Todos los com(lightweight), es decir, ya no se usan componentes dependientes del sistema operativo.

Se utiliza sólo el nuevo modelo de Delegación de eventos.

Son muchas las ventajas que ofrece el uso de Swing:

- La navegación con el teclado es ausar sin el ratón sin tener que añadir líneas de código adicionales.

- Las etiquetas de información ("tool tips") se pueden crear con una sola línea de código. Estas etiquetas de información son las qcomponente del interfaz gráfico.

Con respecto al AWT, Swing incorpora muchos aspectos que permiten mejorar el entorno gráfico.

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 continuación pasamos a describir las nuevas clases agrupadas según lo que sean:

Para uso exclusivo de los alumnos de CETICSA S.L.

(0,0) a (1,1) y reduciría además la anchura y altura totales del Componente es dos píxeles, uno por

Clases de Java para la prog ramación gráfica y su evolución.

Al enfrentarse con el desarrollo de una aplicación gráfica, el programador debe conocer las herramientas que le ofrece el lenguaje de programación que va a utilizar. Java dispone de una serie

Estas clases se encuentran en los siguientes paquetes:

El AWT (Abstract Window Toolkit) es el primer paquete que diseño Sun para el desarrollo

Se comenta que se desarrolló en unos pocos meses y que esto fué la causa de sus carencias y

Este paquete se distribuye en la nueva plataforma Java2.

Programación gráfica con Swing

Swing hay que verlo como una extensión de AWT, por tanto, no hay que olvidar lo aprendido en AWT. Es más, en la mayoría de los casos es suficiente con añadir una "J" al componente AWT para que se convierta en un componente Swing.

En Swing, los componentes de la interfaz gráfica son Beans. Todos los com(lightweight), es decir, ya no se usan componentes dependientes del sistema operativo.

Se utiliza sólo el nuevo modelo de Delegación de eventos.

Son muchas las ventajas que ofrece el uso de Swing:

La navegación con el teclado es automática, es decir, cualquier aplicación Swing se puede usar sin el ratón sin tener que añadir líneas de código adicionales.

Las etiquetas de información ("tool tips") se pueden crear con una sola línea de código. Estas etiquetas de información son las que aparecen cuando nos situamos con el ratón sobre un componente del interfaz gráfico.

Con respecto al AWT, Swing incorpora muchos aspectos que permiten mejorar el entorno gráfico.

Las clases principales de Swing se encuentran en este paquete.

Tenemos que seguir distinguiendo entre Gestores de trazado, Contenedores y Componentes.

A continuación pasamos a describir las nuevas clases agrupadas según lo que sean:

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

13

(0,0) a (1,1) y reduciría además la anchura y altura totales del Componente es dos píxeles, uno por

ramación gráfica y su evolución.

Al enfrentarse con el desarrollo de una aplicación gráfica, el programador debe conocer las herramientas que le ofrece el lenguaje de programación que va a utilizar. Java dispone de una serie

Estas clases se encuentran en los siguientes paquetes:

El AWT (Abstract Window Toolkit) es el primer paquete que diseño Sun para el desarrollo

Se comenta que se desarrolló en unos pocos meses y que esto fué la causa de sus carencias y

Programación gráfica con Swing

or tanto, no hay que olvidar lo aprendido en AWT. Es más, en la mayoría de los casos es suficiente con añadir una "J" al componente AWT para

En Swing, los componentes de la interfaz gráfica son Beans. Todos los componentes son "ligeros" (lightweight), es decir, ya no se usan componentes dependientes del sistema operativo.

utomática, es decir, cualquier aplicación Swing se puede

Las etiquetas de información ("tool tips") se pueden crear con una sola línea de código. Estas ue aparecen cuando nos situamos con el ratón sobre un

Con respecto al AWT, Swing incorpora muchos aspectos que permiten mejorar el entorno gráfico.

Tenemos que seguir distinguiendo entre Gestores de trazado, Contenedores y Componentes.

A continuación pasamos a describir las nuevas clases agrupadas según lo que sean:

Page 113: JavaModulo2 _2

©

Sumario de clases

BoxLayout Un gestor de trazado nuevo que permite a múltiples componentes ser colocados según un eje horizontal o vertical.

JRootPane El componente fundamental en la jerarquía de contenedores.

JWindow Una representación de una

JApplet Una versión extendida de java.applet.Applet que añade nuevas funcionalidades, por ejemplo, pueden añadirse barras de menú de Swing.

JDialog La clase principal para crear una ventana de diálogo.

JFrame Una versión extendida de extras.

JPanel JPanel es un contenedor ligero genérico.

JInternalFrame Un objeto ligero que proporciona muchas de las características de una ventana nativa, incluyendo "pinchar y arrastrar", cerrado, iconizado, re

JComponent La clase base para los componentes Swing.

AbstractButton Define el comportamiento común de las clases JButton, JToggleButton, JCheckbox y JRadioButton. Es una clase abstracta y, por tanto, no pueden

AbstractListModel La definición abstracta para el modelo de datos que proporciona una lista con sus contenidos.

JButton Un botón Swing.

JCheckBox Un CheckBox Swing.

JRadioButton Una implementación de un botón tipo radio

JToggleButton Una implementación de un botón de dos estados.

ButtonGroup Esta clase permite crear un grupo de botones con exclusión múltiple.

JLabel Un área para visualizar un texto corto, una imagen o ambos.

JComboBox

Implementación de Swing de un ComboBox combinación 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.

JList Un componente que permite al usuario seleccionar uno o más objetos de una lista.

Para uso exclusivo de los alumnos de CETICSA S.L.

Sumario de clases del paquete javax.swing

Un gestor de trazado nuevo que permite a múltiples componentes ser colocados según un eje horizontal o vertical.

El componente fundamental en la jerarquía de contenedores.

Una representación de una ventana.

Una versión extendida de java.applet.Applet que añade nuevas funcionalidades, por ejemplo, pueden añadirse barras de menú de Swing.

La clase principal para crear una ventana de diálogo.

Una versión extendida de java.awt.Frame que añade funcionalidades extras.

JPanel es un contenedor ligero genérico.

Un objeto ligero que proporciona muchas de las características de una ventana nativa, incluyendo "pinchar y arrastrar", cerrado, iconizado, redimensionado, título y barra de menú.

La clase base para los componentes Swing.

Define el comportamiento común de las clases JButton, JToggleButton, JCheckbox y JRadioButton. Es una clase abstracta y, por tanto, no pueden crearse objetos.

La definición abstracta para el modelo de datos que proporciona una lista con sus contenidos.

Un botón Swing.

Un CheckBox Swing.

Una implementación de un botón tipo radio

Una implementación de un botón de dos estados.

Esta clase permite crear un grupo de botones con exclusión múltiple.

Un área para visualizar un texto corto, una imagen o ambos.

Implementación de Swing de un ComboBox --combinación 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 más objetos de una lista.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

14

Un gestor de trazado nuevo que permite a múltiples componentes ser

El componente fundamental en la jerarquía de contenedores.

Una versión extendida de java.applet.Applet que añade nuevas funcionalidades, por ejemplo, pueden añadirse barras de menú de

La clase principal para crear una ventana de diálogo.

java.awt.Frame que añade funcionalidades

Un objeto ligero que proporciona muchas de las características de una ventana nativa, incluyendo "pinchar y arrastrar", cerrado,

dimensionado, título y barra de menú.

Define el comportamiento común de las clases JButton, JToggleButton, JCheckbox y JRadioButton. Es una clase abstracta y,

La definición abstracta para el modelo de datos que proporciona una

Una implementación de un botón de dos estados.

Esta clase permite crear un grupo de botones con exclusión múltiple.

Un área para visualizar un texto corto, una imagen o ambos.

-- Un ComboBox es una combinación de una caja de tecto y una lista desplegable que permite a un usuario o introducir un valor mediante teclado o seleccionar de

Un componente que permite al usuario seleccionar uno o más objetos

Page 114: JavaModulo2 _2

©

ImageIcon Una implementación del interface Icon que permite pintar iconos a partir de imágenes.

JTextField Una implementación de una caja de texto..

JPasswordField JPasswordField es un campo de texto tipo password.

JTextArea Una implementación de un

JScrollPane Un contenedor que permite añadir barras de desplazamiento a otros componentes.

JProgressBar Un componente que representa un valor entero dentro de un intervalo limitado.

JSlider Un componente que permite al usuario seleccionar valor desplazando una barra dentro de un intervalo.

JMenuBar Una implementación de una barra de menú.

JMenu Una implementación de un menú.

JMenuItem Una implementación de un MenuItem.

JPopupMenu Una implementación de un menú emergente

JRadioButtonMenuItem Una implementación de un item de menú tipo radio.

JCheckBoxMenuItem Un item de un menú Swing que puede ser seleccionado o no.

JSeparator Una implementación de un separador de opciones de menú.

JToolBar Una implementación de una

JColorChooser Esta clase proporciona un panel de controles diseñado para permitir al usuario manipular y seleccionar un color.

JFileChooser JFileChooser proporciona un mecanismo simple para seleccionar un fichero.

JOptionPane JOptque pregunta al usuario acerca de un valor o le informa de algo.

JEditorPane Un componente de texto para editar diversas clases de contenidos.

JTextPane Un componente de texto con capacidad de representación gráfica.

JScrollBar Una implementación de una barra de desplazamiento.

JTabbedPane Un componente que permite al usuario desplazarse entre un grupo de

Para uso exclusivo de los alumnos de CETICSA S.L.

Una implementación del interface Icon que permite pintar iconos a partir de imágenes.

Una implementación de una caja de texto..

JPasswordField es un campo de texto tipo password.

Una implementación de un textarea.

Un contenedor que permite añadir 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 valor desplazando una barra dentro de un intervalo.

Una implementación de una barra de menú.

Una implementación de un menú.

Una implementación de un MenuItem.

Una implementación de un menú emergente

Una implementación de un item de menú tipo radio.

Un item de un menú Swing que puede ser seleccionado o no.

Una implementación de un separador de opciones de menú.

Una implementación de una barra de herramientas.

Esta clase proporciona un panel de controles diseñado para permitir al usuario manipular y seleccionar un color.

JFileChooser proporciona un mecanismo simple para seleccionar un fichero.

JOptionPane facilita el despliegue de una caja de diálogo estándar que pregunta al usuario acerca de un valor o le informa de algo.

Un componente de texto para editar diversas clases de contenidos.

Un componente de texto con capacidad de representación gráfica.

Una implementación 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.

Página1

15

Una implementación del interface Icon que permite pintar iconos a

JPasswordField es un campo de texto tipo password.

Un contenedor que permite añadir barras de desplazamiento a otros

Un componente que representa un valor entero dentro de un

Un componente que permite al usuario seleccionar gráficamente un valor desplazando una barra dentro de un intervalo.

Una implementación de un item de menú tipo radio.

Un item de un menú Swing que puede ser seleccionado o no.

Una implementación de un separador de opciones de menú.

barra de herramientas.

Esta clase proporciona un panel de controles diseñado para permitir

JFileChooser proporciona un mecanismo simple para seleccionar un

ionPane facilita el despliegue de una caja de diálogo estándar que pregunta al usuario acerca de un valor o le informa de algo.

Un componente de texto para editar diversas clases de contenidos.

Un componente de texto con capacidad de representación gráfica.

Una implementación de una barra de desplazamiento.

Un componente que permite al usuario desplazarse entre un grupo de

Page 115: JavaModulo2 _2

©

componentes pulsando el tabulador con un título

JSplitPane JSplitPane se usa para dividir dos (y sólo dos) componentes.

JTable JTable es un componente que permite presentar datos en formato de tabla de dos dimensiones.

JTree Un control que visualiza un conjunto de datos organizados jerarquicamente en forma de árbol.

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 loJbutton 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");

Para uso exclusivo de los alumnos de CETICSA S.L.

componentes pulsando el tabulador con un título

JSplitPane se usa para dividir dos (y sólo dos) componentes.

JTable es un componente que permite presentar datos en formato de tabla de dos dimensiones.

Un control que visualiza un conjunto de datos organizados jerarquicamente en forma de árbol.

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

public class EjSwing extends JFrame{

------------------------------------------------ public static void main (String args[]){

new EjSwing();

------------------------------------------------

cont = getContentPane();

JButton boton1= new JButton("Rojo");

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

16

componentes pulsando el tabulador con un título y/o icono dado.

JSplitPane se usa para dividir dos (y sólo dos) componentes.

JTable es un componente que permite presentar datos en formato de

Un control que visualiza un conjunto de datos organizados

Ejemplos con algunas de las clases de Swing

Al pulsar sobre el JButton Rojo cambiaremos el color del contenedor a Rojo y lo mismo con el

Page 116: JavaModulo2 _2

©

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

Contenedor JFrame y controles en ejecución.Realizar un programa que permita modificar dinámicamente el número de contenedor en un JFrame.

Al pulsar sobre agregar, iremos agregando botones hasta el máximo de diez botones.

Al pulsar sobre Eliminar, iremos eliminando botones del contenedor de uno en uno.

Con el botón eliminar todos, borraremos

Para uso exclusivo de los alumnos de CETICSA S.L.

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 ejecución. Realizar un programa que permita modificar dinámicamente el número de controles que contiene un

Al pulsar sobre agregar, iremos agregando botones hasta el máximo de diez botones.

Al pulsar sobre Eliminar, iremos eliminando botones del contenedor de uno en uno.

Con el botón eliminar todos, borraremos todos los botones del contenedor.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

17

actionPerformed (ActionEvent ae){

(ActionEvent ae){

public void windowClosing(WindowEvent we){

controles que contiene un

Al pulsar sobre agregar, iremos agregando botones hasta el máximo de diez botones.

Al pulsar sobre Eliminar, iremos eliminando botones del contenedor de uno en uno.

Page 117: JavaModulo2 _2

©

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()_ {

Para uso exclusivo de los alumnos de CETICSA S.L.

public class EjSwing extends JFrame{

final Panel p_central =new Panel(); Panel p_sur=new Panel();

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.

Página1

18

Page 118: JavaModulo2 _2

©

public void actionPerformed(ActionEvent e) { } }); btn_eliminar.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { } }); btn_eliminar_todos.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { } }); 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 f.setVisible(true); } }

Para uso exclusivo de los alumnos de CETICSA S.L.

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);

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.

Página1

19

public void actionPerformed(ActionEvent e)

p_central.add(botones[contador++]);

public void actionPerformed(ActionEvent e)

btn_eliminar_todos.addActionListener(new ActionListener()

public void actionPerformed(ActionEvent e)

Page 119: JavaModulo2 _2

©

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

import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.tree.*; public class EjSwing extends JFrame{ DefaultTreeModel modelo;

Para uso exclusivo de los alumnos de CETICSA S.L.

En este ejemplo realizaremos una aplicación con un control Jtree en el que podremos insertar nuevos elementos, ver elementos seleccionados, Eliminar elementos y Modificar elementos.

public class EjSwing extends JFrame{

DefaultTreeModel modelo;

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

20

En este ejemplo realizaremos una aplicación con un control Jtree en el que podremos insertar nuevos elementos, ver elementos seleccionados, Eliminar elementos y Modificar elementos.

Page 120: JavaModulo2 _2

©

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 nnodo; DefaultMutableTreeNode equipo; DefaultMutableTreeNode jugador; public EjSwing() { cont=getContentPane(); raiz=new DefaultMutableTreeNode("Clientes"); modelo=new DefaultTreeModel(raiz); crearNodos(); arbol.setModel(modelo); arbol.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() {

Para uso exclusivo de los alumnos de CETICSA S.L.

JTree arbol=new JTree(); JButton btn=new JButton("Insertar");

JButton("Seleccionado"); JButton btneli=new JButton("Eliminar"); JButton btnmod=new JButton("Modificar"); JLabel lbl=new JLabel(); JTextField txt=new JTextField();

DefaultMutableTreeNode raiz; ode nnodo;

DefaultMutableTreeNode equipo; DefaultMutableTreeNode jugador;

cont=getContentPane(); raiz=new DefaultMutableTreeNode("Clientes"); modelo=new DefaultTreeModel(raiz); crearNodos(); arbol.setModel(modelo);

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.

Página1

21

arbol.addTreeSelectionListener(new TreeSelectionListener()

public void valueChanged(TreeSelectionEvent e)

Page 121: JavaModulo2 _2

©

public void ac { } }); btneli.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { getLastPathComponent()); } }); btnmod.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { getLastPathComponent()); } }); btnsel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { getLastPathComponent()); } }); setSize(500, 500); setVisible(true); } public static void main(String args[]) { EjSwing f=new EjSwing(); }

Para uso exclusivo de los alumnos de CETICSA S.L.

public void 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()._

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()._

nodo.setUserObject((Object)(txt.getText())); modelo.reload(); }

btnsel.addActionListener(new ActionListener()

public void actionPerformed(ActionEvent e){ lbl.setText("NODO..." +arbol.getSelectionPath()._

}

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.

Página1

22

tionPerformed(ActionEvent e)

nnodo=new DefaultMutableTreeNode(txt.getText());

public void actionPerformed(ActionEvent e)

nodo=(DefaultMutableTreeNode)(arbol.getSelectionPath()._

padre=(DefaultMutableTreeNode)nodo.getParent();

//padre.setUserObject((Object)(txt.getText()));

public void actionPerformed(ActionEvent e)

DefaultMutableTreeNode)(arbol.getSelectionPath()._

nodo.setUserObject((Object)(txt.getText()));

public void actionPerformed(ActionEvent e)

lbl.setText("NODO..." +arbol.getSelectionPath()._

Page 122: JavaModulo2 _2

©

public void crearNodos() { equipo=new 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 Def equipo.add(jugador); } }

Laboratorio: Manejo de los cuadros de diálogo

Objetivo Utilizar los cuadros de diálogo de Swing.

Enunciado: - Realizar una aplicación en la que cargaremos los distintos cuadros de dialogo que nos

proporciona Swing.

- En el botón de maximizar, haremos la ventana tan grande como la pantalla.

- En el botón de dialogo, mostraremos una ventana que nos indique la versión de la aplicación y así con cada uno de los diálogos disponibles.

Para uso exclusivo de los alumnos de CETICSA S.L.

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"); equipo.add(jugador);

Laboratorio: Manejo de los cuadros de diálogo

Utilizar los cuadros de diálogo de Swing.

Realizar una aplicación en la que cargaremos los distintos cuadros de dialogo que nos

En el botón de maximizar, haremos la ventana tan grande como la pantalla.

En el botón de dialogo, mostraremos una ventana que nos indique la versión de la aplicación y así con cada uno de los diálogos disponibles.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

23

Laboratorio: Manejo de los cuadros de diálogo

Realizar una aplicación en la que cargaremos los distintos cuadros de dialogo que nos

En el botón de maximizar, haremos la ventana tan grande como la pantalla.

En el botón de dialogo, mostraremos una ventana que nos indique la versión de la aplicación

Page 123: JavaModulo2 _2

©

Para uso exclusivo de los alumnos de CETICSA S.L.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

24

Page 124: JavaModulo2 _2

©

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

Para uso exclusivo de los alumnos de CETICSA S.L.

Dialogo…..

Archivo…

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

25

Page 125: JavaModulo2 _2

©

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 this.setSize(ancho, alto); this.setLocation(0, 0); } private void btnframeActionPerformed(java.awt.event.ActionEvent evt) { JFrame fr; fr = new JFrame(); fr.setVisible(true); }

Para uso exclusivo de los alumnos de CETICSA S.L.

public class CuadrosDialogo extends javax.swing.JFrame {

/** Creates new form CuadrosDialogo */

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), _

JButton btncerrar = new JButton("Cerrar"); ventana.getContentPane().add(btncerrar, _

btncerrar.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

ventana.setLocation(100, 100);

private void btncolorActionPerformed_ (java.awt.event.ActionEvent evt) {

JColorChooser.showDialog(this,_ "Color de fondo", btncolor.getBackground());

btncolor.setBackground(col);

private void btnmaximizarActionPerformed_ (java.awt.event.ActionEvent evt) {

getToolkit().getScreenSize().width; alto = getToolkit().getScreenSize().height - 30;

private void btnframeActionPerformed(java.awt.event.ActionEvent evt) {

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

26

ventana.getContentPane().add(new JLabel("Aplicacion SWING", JLabel.CENTER), _

Page 126: JavaModulo2 _2

©

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: respuesta = fd.showOpenDialog(this); if (respuesta == JFileChooser.APPROVE_OPTION) { this.lblmsj.setText("Archivo abierto " + fd.getSelectedFile()); } else { this.lblmsj.setText("Acción CANCELADA"); } } else if_ (respuesta == JOptionPane.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("Acción 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;

Para uso exclusivo de los alumnos de CETICSA S.L.

private void btnarchivoActionPerformed(java.awt.event.ActionEvent evt) {

respuesta = JOptionPane.showConfirmDialog(this, "¿Desea abrir?"); (respuesta == JOptionPane.OK_OPTION)

fd.setDialogType(JFileChooser.OPEN_DIALOG); fd.setDialogTitle("Abrir archivo"); fd.setCurrentDirectory(new File("C:\\")); respuesta = fd.showOpenDialog(this); if (respuesta == JFileChooser.APPROVE_OPTION) {

this.lblmsj.setText("Archivo abierto " + fd.getSelectedFile());

this.lblmsj.setText("Acción CANCELADA");

.CANCEL_OPTION) {

fd.setDialogType(JFileChooser.SAVE_DIALOG); fd.setDialogTitle("Guardar archivo"); fd.setApproveButtonText("Guardar como..."); respuesta = fd.showSaveDialog(this);

JFileChooser._

this.lblmsj.setText("Archivo Guardado " + fd.getSelectedFile());

this.lblmsj.setText("Acción CANCELADA");

btnOptionPaneActionPerformed_ (java.awt.event.ActionEvent evt) {

mensaje = this.txtmensaje.getText(); if (this.rdbadvertencia.isSelected())

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.

Página1

27

Page 127: JavaModulo2 _2

©

} 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 Gráfica

Unidad 13: Control de eventos generados por la interfaz gráfica

Introducción El modelo antiguo de eventos está basado en la herencia.

Para que un programa capture eventos de una interfaz gráfica, los componentes deben ser subclases de la interfaz y sobreescribir los métodos action() y handleEvent().

Cuando uno de los métodos devuelve true, el evento ya no es procesado más allá, en caso el evento se propaga a través de la jerarquía de componentes de la interfaz hasta que sea tratado o alcance al jerarquía de componentes.

Para uso exclusivo de los alumnos de CETICSA S.L.

else if (this.rdbsinicono.isSelected())

icono = JOptionPane.PLAIN_MESSAGE;

icono = JOptionPane.ERROR_MESSAGE;

if (this.rdbconfirmacion.isSelected())

JOptionPane.showConfirmDialog(this, mensaje, titulo, _

else if (this.rdbentrada.isSelected())

//Primero muestra una ventana que captura un_

s = JOptionPane.showInputDialog(this, mensaje, titulo, icono); JOptionPane.showMessageDialog(this, s, titulo, icono);

JOptionPane.showMessageDialog(this, mensaje, titulo, icono);

Ver Video: Interfaz Gráfica

Unidad 13: Control de eventos generados por la interfaz gráfica

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

Para que un programa capture eventos de una interfaz gráfica, los componentes deben ser subclases de la interfaz y sobreescribir los métodos action() y handleEvent().

Cuando uno de los métodos devuelve true, el evento ya no es procesado más allá, en caso el evento se propaga a través de la jerarquía de componentes de la interfaz hasta que sea tratado o alcance al jerarquía de componentes.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

28

Unidad 13: Control de eventos generados

Para que un programa capture eventos de una interfaz gráfica, los componentes deben ser subclases de la interfaz y sobreescribir los métodos action() y handleEvent().

Cuando uno de los métodos devuelve true, el evento ya no es procesado más allá, en caso contrario, el evento se propaga a través de la jerarquía de componentes de la interfaz hasta que sea tratado o

Page 128: JavaModulo2 _2

©

Hay dos elecciones para estructurar el código de gestión de eventos:

Cada componente individual puede haceeventos.

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 recProblema de rendimiento con los eventos que se producen con mucha frecuencia.

Modelo nuevo de delegació

Los eventos ahora están organizados en jerarquías 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

EventObject

Es la clase raíz de la cual derivarán todos los eventos.

Tiene dos métodos de interés que son:

Object getSource() el evento.

String toString()

AWTEvent

Es la clase raíz de la cual derivan todos los eventos del AWT.

Es una clase abstracta.

De interés son:

- Sus campos estáticos que almacenan los valores para diferentes tipos de eventos.

- El método int getID() que devuelve un número entero que se corresponde con el tipo de evento que se ha producido.

ComponentEvent Evento de bajo nivel que indica que un componente se ha movido, ha cambiado de tamaño, ...

Para uso exclusivo de los alumnos de CETICSA S.L.

Hay dos elecciones para estructurar el código de gestión de eventos:

Cada componente individual puede hacerse subclase para manejar específicamente un conjunto de

Todos los eventos son manejados por un contenedor determinado (tendrá que analizar sobre que

No se pueden filtrar eventos: los eventos son recibidos por los componentes, los manejen o no. Problema de rendimiento con los eventos que se producen con mucha frecuencia.

Modelo nuevo de delegación. (Source, Listener,

Los eventos ahora están organizados en jerarquías de clases de eventos.

Fuentes de eventos (source): Son objetos que tiene la capacidad de detectar eventos y notificar a los receptores de eventos que

Descripción

Es la clase raíz de la cual derivarán todos los eventos.

Tiene dos métodos de interés que son:

Object getSource() --> Devuelve el objeto sobre el que se ha producido el evento.

String toString() -->Da una representación en forma de String.

Es la clase raíz de la cual derivan todos los eventos del AWT.

Es una clase abstracta.

De interés son:

Sus campos estáticos que almacenan los valores para diferentes tipos de eventos.

El método int getID() que devuelve un número entero que se corresponde con el tipo de evento que se ha producido.

Evento de bajo nivel que indica que un componente se ha movido, ha cambiado de tamaño, ...

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

29

rse subclase para manejar específicamente un conjunto de

Todos los eventos son manejados por un contenedor determinado (tendrá que analizar sobre que

ibidos por los componentes, los manejen o no. Problema de rendimiento con los eventos que se producen con mucha frecuencia.

n. (Source, Listener,

Adapter)

Son objetos que tiene la capacidad de detectar eventos y notificar a los receptores de eventos que

Es la clase raíz de la cual derivarán todos los eventos.

> Devuelve el objeto sobre el que se ha producido

>Da una representación en forma de String.

Es la clase raíz de la cual derivan todos los eventos del AWT.

Sus campos estáticos que almacenan los valores para diferentes tipos

El método int getID() que devuelve un número entero que se corresponde con el tipo de evento que se ha producido.

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

Page 129: JavaModulo2 _2

©

Deriva de AWTEvent.

Estos eventos se producen sólo con propósitos de notificación. El AWT sigue 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 método addComponentListener sobre el objsobre el cual queremos recibir los eventos.

Son de interés:

- 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 método Component en forma de objeto sobre el que se produjo el evento.

ContainerEvent (hereda de ComponentEvent)

Se genera por objetos tipo Container cuando se añade o se quita un objeto de él.

El evento es pasado a cada ContainerListener o AdapterListener quehaya dado de alta mediante el método addContainerListener() del objeto sobre el que queremos obtener los eventos.

Caben destacar:

- Sus campos que almacenan el valor de lo que puede suceder: un componente se ha añadido, se ha quitado, ...

- Sus métodcontenedor sobre el que se produjo el evento y Component getChild() obtiene el componente que lo produjo (al ser añadido, quitado, ...).

WindowEvent (hereda de ComponentEvent).

Fuente de eventos de bajode estado (abrir, activar, minimizar, ...)

El evento es pasado a cada WindowListener o WindowAdapter que se haya registrado mediante el método addWindowListener() para ser notificados.

El método getWindow() dev

InputEvent (hereda de ComponentEvent).

Es el evento raíz de todos los eventos de entrada a nivel de componente.

Sus dos fuentes de eventos hijas son: KeyEvent (para eventos relacionados con el teclado) y MouseEvent (para eventos relacionados con el ratón).

A continuación vemos MouseEvent.

MouseEvent

Indica que una acción de ratón ha sucedido sobre un componente.

Eventos de ratón

- Un botón del ratón es presionado.

Para uso exclusivo de los alumnos de CETICSA S.L.

Deriva de AWTEvent.

Estos eventos se producen sólo con propósitos de notificación. El AWT 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 método addComponentListener sobre el objsobre el cual queremos recibir los eventos.

Son de interés:

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 método Component getComponent() para obtener el en forma de objeto sobre el que se produjo el evento.

Se genera por objetos tipo Container cuando se añade o se quita un objeto de él.

El evento es pasado a cada ContainerListener o AdapterListener quehaya dado de alta mediante el método addContainerListener() del objeto sobre el que queremos obtener los eventos.

Caben destacar:

Sus campos que almacenan el valor de lo que puede suceder: un componente se ha añadido, se ha quitado, ...

Sus métodos: 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 añadido, quitado, ...).

Fuente de eventos de bajo nivel que indica si la ventana ha cambiado de estado (abrir, activar, minimizar, ...)

El evento es pasado a cada WindowListener o WindowAdapter que se haya registrado mediante el método addWindowListener() para ser notificados.

El método getWindow() devuelve la ventana que generó el evento.

Es el evento raíz de todos los eventos de entrada a nivel de componente.

Sus dos fuentes de eventos hijas son: KeyEvent (para eventos relacionados con el teclado) y MouseEvent (para eventos relacionados con el ratón).

A continuación vemos MouseEvent.

Indica que una acción de ratón ha sucedido sobre un componente.

Eventos de ratón

Un botón del ratón es presionado.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

30

Estos eventos se producen sólo con propósitos de notificación. El AWT 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 método addComponentListener sobre el objeto

Sus campos que almacenan los valores que indican lo que ha sucedido a nivel de componente: Si se ha movido, si se ha ocultado, ...

getComponent() para obtener el componente en forma de objeto sobre el que se produjo el evento.

Se genera por objetos tipo Container cuando se añade o se quita un

El evento es pasado a cada ContainerListener o AdapterListener que se haya dado de alta mediante el método addContainerListener() del objeto sobre el que queremos obtener los eventos.

Sus campos que almacenan el valor de lo que puede suceder: un

que permite obtener el contenedor sobre el que se produjo el evento y Component getChild() obtiene el componente que lo produjo (al ser añadido, quitado, ...).

nivel que indica si la ventana ha cambiado

El evento es pasado a cada WindowListener o WindowAdapter que se haya registrado mediante el método addWindowListener() para ser

uelve la ventana que generó el evento.

Es el evento raíz de todos los eventos de entrada a nivel de

Sus dos fuentes de eventos hijas son: KeyEvent (para eventos relacionados con el teclado) y MouseEvent (para eventos relacionados

Indica que una acción de ratón ha sucedido sobre un componente.

Page 130: JavaModulo2 _2

©

- Un botón del ratón es liberado

- Un botón del ratón es clickeado (presionado y liberado)

- El cursor del ratón entra en un componente.

- El cursor del ratón sale del componente.

Mouse Motion Events

- El ratón es movido.

- El ratón es arrastrado con botón pulsado (dragged)

Estos eventos se envían a los MouseListener y MouseAdapter que se hayan registrado mediante el método addMouseListener().

Dispone de una serie de métodos tipo get (getX, getY, getPosition, getClickCount para recoger información del evento).

ActionEvent

Es un evento de alto nivel que indica que algo ha sucedido sobre un componente. Algunos componentes usan este tipo de eventusar los de bajo nivel.

El protocolo para implementar correctamente este evento es mediante un ActionCommand.

Los componente disponen de un método setActionCommand (string) para asociarles un ActionCommand en concreto.

El evento dispone deidentificar el ActionCommand.

Este evento se pasa a los ActionListener o ActionAdapter que se han dado de alta mediante el método addActionListener() para poder recibir eventos de este tipo.

ActionListener y WindowListenerRealizar un programa para cambiar el color de fondo de un Frame pulsando sobre los botones de acción.

En este ejemplo vemos como generamos eventos para los cinco JButton.

Para uso exclusivo de los alumnos de CETICSA S.L.

Un botón del ratón es liberado

Un botón del ratón es clickeado (presionado y liberado)

El cursor del ratón entra en un componente.

El cursor del ratón sale del componente.

Mouse Motion Events

El ratón es movido.

El ratón es arrastrado con botón pulsado (dragged)

Estos eventos se envían a los MouseListener y MouseAdapter que se hayan registrado mediante el método addMouseListener().

Dispone de una serie de métodos tipo get (getX, getY, getPosition, getClickCount para recoger información del evento).

Es un evento de alto nivel que indica que algo ha sucedido sobre un componente. Algunos componentes usan este tipo de eventusar los de bajo nivel.

El protocolo para implementar correctamente este evento es mediante un ActionCommand.

Los componente disponen de un método 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 método addActionListener() para poder recibir eventos de este tipo.

Ejemplos con

ActionListener y WindowListener Realizar un programa para cambiar el color de fondo de un Frame pulsando sobre los botones de

En este ejemplo vemos como generamos eventos para los cinco JButton.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

31

Un botón del ratón es clickeado (presionado y liberado)

El ratón es arrastrado con botón pulsado (dragged)

Estos eventos se envían a los MouseListener y MouseAdapter que se hayan registrado mediante el método addMouseListener().

Dispone de una serie de métodos tipo get (getX, getY, getPosition, getClickCount para recoger información del evento).

Es un evento de alto nivel que indica que algo ha sucedido sobre un componente. Algunos componentes usan este tipo de eventos en vez de

El protocolo para implementar correctamente este evento es mediante

Los componente disponen de un método setActionCommand (string) para asociarles un ActionCommand en concreto.

un getActionCommand() mediante el cual poder

Este evento se pasa a los ActionListener o ActionAdapter que se han dado de alta mediante el método addActionListener() para poder recibir

Ejemplos con eventos

Realizar un programa para cambiar el color de fondo de un Frame pulsando sobre los botones de

Page 131: JavaModulo2 _2

©

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 //------------------ boton1.addActionListener( new ActionListener(){ }); //------------------ add(boton1,BorderLayout.NORTH); boton2= new Button("Verde"); //------------------ boton2.addActionListener( new ActionListener(){ }); //------------------ add(boton2,"Sou boton3= new Button("Amarillo"); //------------------ boton3.addActionListener( new ActionListener(){

Para uso exclusivo de los alumnos de CETICSA S.L.

public class EjSwing extends JFrame{ Button boton1,boton2,boton3,boton4,boton5; public static void main(String[] args)

new 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,"South"); boton3= new Button("Amarillo"); ------------------

boton3.addActionListener( new ActionListener(){

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

32

public void actionPerformed (ActionEvent ae){ getContentPane().setBackground (Color.red);

public void actionPerformed (ActionEvent ae){ getContentPane().setBackground (Color.green);

Page 132: JavaModulo2 _2

©

}); //------------------ add(boton3,"Center"); boton4= new Button("Azul"); //------------------ boton4.addActionListener( new ActionListener(){ }); //-------------- add(boton4,"East"); boton5= new Button("Negro"); //------------------ boton5.addActionListener( new ActionListener(){ }); //------------------ add(boton5,BorderLayout.WEST); setSize(300,200); setResizable(false); setLocation(100,100); setBackground(Color.cyan); setTitle("Ejemplo Eventos"); setVisible(true); addWindowListener(new WindowAdapter(){ public { } }); } }

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 p

Para uso exclusivo de los alumnos de CETICSA S.L.

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(); }

Clase SwingWorker

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 realizar tareas de larga duración.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

33

public void actionPerformed (ActionEvent ae){ getContentPane().setBackground (Color.yellow);

public void actionPerformed (ActionEvent ae){ getContentPane().setBackground (Color.blue);

public void actionPerformed (ActionEvent ae){ getContentPane().setBackground (Color.black);

void windowClosing(WindowEvent e)

Clase SwingWorker

La clase SwingWorker es una clase de utilidad incluida en Java SE 6 que soluciona el problema de ara realizar tareas de larga duración.

Page 133: JavaModulo2 _2

©

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 SwingWorkerEn el siguiente ejemplo veremos una forma de

private void jBtnCambiarActionPerformed(ActionEvent evt) { _ ClaseWorker sw = new_ ClaseWorker (); sw.addPropertyChangeListener(new _PropertyChangeListener(){ public_ void propertyChange(PropertyChangeEvent evt) { _ if(evt.getPropertyName().equals(“Correcto”))_ // Aquí podríamos ir actualizando el código } } }); }_ class ClaseWorker extends javax.swing.SwingWorker_ { protected Object doInBackground()_ throws Exception { firePropertyChange_ (“Correcto”, null, “NEW VALUE”); _ return null; } };

Laboratorio 1: Movimiento entre framesObjetivo

Para uso exclusivo de los alumnos de CETICSA S.L.

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) {

sw.addPropertyChangeListener(new _

ropertyChange(PropertyChangeEvent evt) {

if(evt.getPropertyName().equals(“Correcto”))_

// Aquí podríamos ir actualizando el código del componente a modificar.

class ClaseWorker extends javax.swing.SwingWorker_

protected Object doInBackground()_

Laboratorio 1: Movimiento entre frames

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

34

El objetivo de esta clase es la de implementar en un hilo/thread separado, cualquier funcionalidad

poder haber background sobre un componente.

Laboratorio 1: Movimiento entre frames

Page 134: JavaModulo2 _2

©

Trabajar con más de un Frame en un proyecto

Enunciado:

- Realizar una aplicación en la que podremos movernos entre diferentes Frames que hayamos creado previamente en nuestra aplicación.

- Tendremos 3 ventanas JFrame, en cada una de las ventanas podremos pasar a la siguiente o la anterior, dependiendo de la posición del conjunto.

- En la ventana final podremos cerrar la aplicación, o movernos entre las diferentes ventanas que tengamos.

- Crearemos una clase principaterminar la aplicación.

- Pondremos un control JProgressBar para saber dónde estamos posicionados en el conjunto de ventanas.

Para uso exclusivo de los alumnos de CETICSA S.L.

Trabajar con más de un Frame en un proyecto

Realizar una aplicación en la que podremos movernos entre diferentes Frames que hayamos creado previamente en nuestra aplicación.

JFrame, en cada una de las ventanas podremos pasar a la siguiente o la anterior, dependiendo de la posición del conjunto.

En la ventana final podremos cerrar la aplicación, o movernos entre las diferentes ventanas

Crearemos una clase principal que se encargará de iniciar la aplicación, del movimiento y de

Pondremos un control JProgressBar para saber dónde estamos posicionados en el conjunto

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

35

Realizar una aplicación en la que podremos movernos entre diferentes Frames que hayamos

JFrame, en cada una de las ventanas podremos pasar a la siguiente o

En la ventana final podremos cerrar la aplicación, o movernos entre las diferentes ventanas

l que se encargará de iniciar la aplicación, del movimiento y de

Pondremos un control JProgressBar para saber dónde estamos posicionados en el conjunto

Page 135: JavaModulo2 _2

©

CLASE PRINCIPAL PARA ADMINISTRAR LOS MOVIMIENTOS En ésta clase, los objetos serán 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); } 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 {

Para uso exclusivo de los alumnos de CETICSA S.L.

CLASE PRINCIPAL PARA ADMINISTRAR LOS MOVIMIENTOS

clase, los objetos serán compartidos (static) para poder acceder a ellos sin necesidad_

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); ameantiguo.setVisible(false);

public static void cerrarAplicacion()

public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() {

public class VariosFormularios extends javax.swing.JFrame {

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

36

clase, los objetos serán compartidos (static) para poder acceder a ellos sin necesidad_

public static void cambiarFrame(JFrame framenuevo, JFrame frameantiguo)

Page 136: JavaModulo2 _2

©

/** 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, ClaseP} 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);

Para uso exclusivo de los alumnos de CETICSA S.L.

/** Creates new form VariosFormularios */

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);}

public class VariosFormularios2 extends javax.swing.JFrame {

/** Creates new form VariosFormularios2 */

this.setTitle("FRAME NUMERO 2");

this.getContentPane().setBackground(Color.BLUE); this.jProgressBar1.setValue(2);

private void btnanteriorframeActionPerformed(java.awt.event.ActionEvent evt) {ClasePrincipalFrames.cambiarFrame(ClasePrincipalFrames.f1, ClasePrincipalFrames.f2);

private void btnsiguienteframeActionPerformed(java.awt.event.ActionEvent evt) {ClasePrincipalFrames.cambiarFrame(ClasePrincipalFrames.f3, ClasePrincipalFrames.f2);

VariosFormularios3 extends javax.swing.JFrame {

/** Creates new form VariosFormularios3 */

this.setTitle("FRAME NUMERO 3");

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

37

private void btnsiguienteframeActionPerformed(java.awt.event.ActionEvent evt) { ClasePrincipalFrames.cambiarFrame(ClasePrincipalFrames.f2, ClasePrincipalFrames.f1);

private void btnanteriorframeActionPerformed(java.awt.event.ActionEvent evt) { rincipalFrames.f2);

private void btnsiguienteframeActionPerformed(java.awt.event.ActionEvent evt) { ClasePrincipalFrames.cambiarFrame(ClasePrincipalFrames.f3, ClasePrincipalFrames.f2);

Page 137: JavaModulo2 _2

©

this.getContentPane().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 imágenes

Objetivo Trabajar con componentes gráficos.

Enunciado: - Realizar una aplicación para cargar imágenes dinámicamente desde una ruta dada.

- Tendremos la posibilidad de cambiar el tamaño de la imagen a nuestra conveniencia, dependiendo si queremos darle un tamaño fijo (300,300) o queremos darle uno personalizado con 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 método paintComponent de la clase

Para uso exclusivo de los alumnos de CETICSA S.L.

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);

btnirframeActionPerformed(java.awt.event.ActionEvent evt) {

indice = this.cmbframes.getSelectedIndex();

ClasePrincipalFrames.cambiarFrame(ClasePrincipalFrames.f1, ClasePrincipalFrames.f3);

ClasePrincipalFrames.cambiarFrame(ClasePrincipalFrames.f2, ClasePrincipalFrames.f3);

Laboratorio 2: Cargador de imágenes

Trabajar con componentes gráficos.

Realizar una aplicación para cargar imágenes dinámicamente desde una ruta dada.

Tendremos la posibilidad de cambiar el tamaño de la imagen a nuestra conveniencia, dependiendo si queremos darle un tamaño fijo (300,300) o queremos darle uno

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 método paintComponent de la clase super.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

38

ClasePrincipalFrames.cambiarFrame(ClasePrincipalFrames.f2, ClasePrincipalFrames.f3);

ClasePrincipalFrames.cambiarFrame(ClasePrincipalFrames.f1, ClasePrincipalFrames.f3);

ClasePrincipalFrames.cambiarFrame(ClasePrincipalFrames.f2, ClasePrincipalFrames.f3);

Laboratorio 2: Cargador de imágenes

Realizar una aplicación para cargar imágenes dinámicamente desde una ruta dada.

Tendremos la posibilidad de cambiar el tamaño de la imagen a nuestra conveniencia, dependiendo si queremos darle un tamaño fijo (300,300) o queremos darle uno

Al pulsar sobre “Cargar Imagen”, abriremos un cuadro de dialogo de Ficheros para

Crearemos una clase JIMAGENPANE para dibujar la imagen sobrescribiendo el método

Page 138: JavaModulo2 _2

©

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

Para uso exclusivo de los alumnos de CETICSA S.L.

public class DibujarImagenes extends javax.swing.JFrame {

/** Creates new form DibujarImagenes */

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

39

Page 139: JavaModulo2 _2

©

public DibujarImagenes() { initComponents(); String fichero = "C:\\CARTELES 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: 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()); pimg.setSize(ancho, alto); this.pimg.nuevaImagen(archivoimagen, alto, ancho); } } } Realizar después la práctica con un JLABEL y utilizando el método setIcon() private ImageIcon 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.*;

Para uso exclusivo de los alumnos de CETICSA S.L.

CARTELES\\dostontosmuytontos.jpg"; pimg = new JImagenPane(fichero);

this.getContentPane().add(pimg); this.setTitle("Cargador de Imagenes");

private void btncargarimagenActionPerformed(java.awt.event.ActionEvent evt) {

fd.setDialogType(JFileChooser.OPEN_DIALOG); fd.setDialogTitle("Abrir archivo"); fd.setCurrentDirectory(new File("C:\\")); respuesta = fd.showOpenDialog(this); if (respuesta == JFileChooser.APPROVE_OPTION) {

archivoimagen = fd.getSelectedFile().getAbsolutePath();

if (this.rdbfijo.isSelected()) {

this.pimg.nuevaImagen(archivoimagen);

alto = Integer.parseInt(this.txtalto.getText()); teger.parseInt(this.txtancho.getText());

pimg.setSize(ancho, alto); this.pimg.nuevaImagen(archivoimagen, alto, ancho);

Realizar después la práctica con un JLABEL y utilizando el método setIcon()

Icon getIcono(String ico,Dimension tam)

ImageIcon img = new ImageIcon(ico); img = new ImageIcon(img.getImage().getScaledInstance(ancho, alto, Image.SCALE_AREA_AVERAGING));

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

40

private void btncargarimagenActionPerformed(java.awt.event.ActionEvent evt) {

Page 140: JavaModulo2 _2

©

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); im = im.getScaledInstance(ancho, alto,Image.SCALE_AREA_AVERAGING); repaint(); } }

Unidad 14: Aplicaciones basadas en la interfaz gráfica

Objetivos • Conocer las principales clases en la elaboración

• Aprender a realizar un toolbar con java

Introducción En Swing disponemos de cuatro calse importantes para la creación de interfaces basadas en la creación de menúes que son: JMenu, JMenuBar, JMenuItem y JPopupMenu. Un menú en una aplicación no es más que un JMenuBar en el que hay varios menús como veremos en esta unidad.

En esta imagen podemos apreciar las diferentes secciones a las que hacen referencia las clases relacionadas con menús de Java:

Para uso exclusivo de los alumnos de CETICSA S.L.

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) {

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) { it().getImage(fichero);

im = im.getScaledInstance(ancho, alto,Image.SCALE_AREA_AVERAGING);

Unidad 14: Aplicaciones basadas en la interfaz gráfica

Conocer las principales clases en la elaboración de menús con java

Aprender a realizar un toolbar con java

En Swing disponemos de cuatro calse importantes para la creación de interfaces basadas en la creación de menúes que son: JMenu, JMenuBar, JMenuItem y JPopupMenu. Un menú en una

ión no es más que un JMenuBar en el que hay varios menús como veremos en esta unidad.

En esta imagen podemos apreciar las diferentes secciones a las que hacen referencia las clases

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

41

im = im.getScaledInstance(ancho, alto,Image.SCALE_AREA_AVERAGING);

Unidad 14: Aplicaciones basadas en la

de menús con java

En Swing disponemos de cuatro calse importantes para la creación de interfaces basadas en la creación de menúes que son: JMenu, JMenuBar, JMenuItem y JPopupMenu. Un menú en una

ión no es más que un JMenuBar en el que hay varios menús como veremos en esta unidad.

En esta imagen podemos apreciar las diferentes secciones a las que hacen referencia las clases

Page 141: JavaModulo2 _2

©

Las tres clases más 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 JMenúBar, normalmente llamamos menú por ejemplo el menú "Archivo", "Insertar", "

JMenuItem Los elementos de un menú se representan mediante la clase JMenuItem.

Ejemplo guardar, guardar como del Jmenu de Archivo.

Para uso exclusivo de los alumnos de CETICSA S.L.

Creación de un menú

importantes para crear un menú son las siguientes:

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

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

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.

Página1

42

Creación de un menú

Son las opciones del menú que insertaremos sobre el JMenúBar, normalmente llamamos menú por

Page 142: JavaModulo2 _2

©

Jerarquía de clases para realizar un menú:

Ejemplo de creación de un Menú:En el siguiente ejemplo crearemos un Menú con las opciones archivo y editar como se muestra en la imagen.

import javax.swing.*; public class EjSwing extends JFrame{public EjSwing(){ //Creación 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); //Construimos los JMenuItem del JMenu de Archivo

Para uso exclusivo de los alumnos de CETICSA S.L.

Jerarquía de clases para realizar un menú:

Ejemplo de creación de un Menú: crearemos un Menú con las opciones archivo y editar como se muestra en la

public class EjSwing extends JFrame{

//Creación de un JMeunuBar, clase principal. JMenuBar menuPrincipal = new JMenuBar();

menuArchivo = new JMenu("Archivo"); JMenu menuEditar = new JMenu("Editar");

//Construimos los JMenuItem del JMenu de Archivo

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

43

crearemos un Menú con las opciones archivo y editar como se muestra en la

Page 143: JavaModulo2 _2

©

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);}}

Un objeto JToolBar crea una barra de herramientas para la inserción de componentes dentro de una fila o una columna. Normalmente las barras de herramientas proporcionan accesoque también se encuentran en ítems de

En esta figura se aprecia un toolbar creado en una aplicación distribuida

Ejemplo de creación de un Toolbar:En el siguiente ejemplo crearemos una barra de herramientas con tres botones dentro de la barra como se muestra en la imagen.

Para uso exclusivo de los alumnos de CETICSA S.L.

JMenuItem Guardar = new JMenuItem("Guardar"); new JMenuItem("Guardar como");

JMenuItem Imprimir = new JMenuItem("Imprimir"); JMenuItem Cerrar = new JMenuItem("Cerrar");

menuArchivo.add(new JSeparator());

public static void main (String args[]){ new EjSwing().setVisible(true);}

Creación de un Toolbar

crea una barra de herramientas para la inserción de componentes dentro de una fila o una columna. Normalmente las barras de herramientas proporcionan accesoque también se encuentran en ítems de menús.

En esta figura se aprecia un toolbar creado en una aplicación distribuida

Ejemplo de creación de un Toolbar: l siguiente ejemplo crearemos una barra de herramientas con tres botones dentro de la barra

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

44

Creación de un Toolbar

crea una barra de herramientas para la inserción de componentes dentro de una fila o una columna. Normalmente las barras de herramientas proporcionan acceso a funcionalidades

En esta figura se aprecia un toolbar creado en una aplicación distribuida

l siguiente ejemplo crearemos una barra de herramientas con tres botones dentro de la barra

Page 144: JavaModulo2 _2

©

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 el Toolbar en el formularioformulario.getContentPane().add(jtb1);formulario.pack(); formulario.setVisible(true); } }

También podemos insertar iconos en la barra de herramientas:

ImageIcon ImagenGuardar=new ImageIcon("guardar.gif");bot1.setIcon(ImagenGuardar);

Sus propiedades más comunes son:

Autoscrolls(), Background(), Border(), Bounds(), Cursor(), Enabled(), Font(), Foreground(),Floatable(), Insets(), Layout(), Margin(), Name(), Opaque(), Orientation(), ToolTipText(), Visible(), VisibleRect().

Sus eventos más comunes son:

WINDOW:

WindowActivated(), WindowClosed(), WindowClosing(),

MOUSE:

MouseClicked(), MouseDragged(),MouseEntered(), MouseExited(),MouseMoved(), MousePressed(), MouseReleased().

KEY:

KeyPressed(), KeyReleased(), KeyTyped().

Para uso exclusivo de los alumnos de CETICSA S.L.

public class EjSwing extends JFrame{ static JFrame formulario = new JFrame();

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");

public static void main(String[] args)

formulario.setTitle("Ejemplo Toolbar"); formulario.setDefaultCloseOperation(formulario.EXIT_ON_CLOSE); //Insertamos los componentes en el Toolbar.

tamos el Toolbar en el formulario formulario.getContentPane().add(jtb1);

También podemos insertar iconos en la barra de herramientas:

ImageIcon ImagenGuardar=new ImageIcon("guardar.gif");

Sus propiedades más comunes son:

Autoscrolls(), Background(), Border(), Bounds(), Cursor(), Enabled(), Font(), Foreground(),Floatable(), Insets(), Layout(), Margin(), Name(), Opaque(), Orientation(), ToolTipText(), Visible(), VisibleRect().

ctivated(), WindowClosed(), WindowClosing(), WindowDeactivated(), WindowOpened().

MouseClicked(), MouseDragged(),MouseEntered(), MouseExited(),MouseMoved(), MousePressed(),

KeyPressed(), KeyReleased(), KeyTyped().

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

45

Autoscrolls(), Background(), Border(), Bounds(), Cursor(), Enabled(), Font(), Foreground(),Floatable(), Insets(), Layout(), Margin(), Name(), Opaque(), Orientation(),

WindowDeactivated(), WindowOpened().

MouseClicked(), MouseDragged(),MouseEntered(), MouseExited(),MouseMoved(), MousePressed(),

Page 145: JavaModulo2 _2

©

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

Creación de un JPopupMenu

// Demostración de los objetos JPopupMenuimport 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 menuContextual; // configurar GUI public PruebaContextual() { super( "Uso de objetos JPopupMenu" ); ManejadorEventos manejador = new ManejadorEventos(); String colores[] = { "Azul", "Amarillo", "Rojo" }; // establecer 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; ademá // permitir el manejo de eventos para cada elemento de menú

Para uso exclusivo de los alumnos de CETICSA S.L.

JPopupMUn 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

Creación de un JPopupMenu

// Demostración de los objetos JPopupMenu

public class PruebaContextual extends JFrame { private JRadioButtonMenuItem elementos[]; private final Color valoresColor[] = { Color.BLUE, Color.YELLOW, Color.RED };

Menu menuContextual;

super( "Uso de objetos JPopupMenu" );

ManejadorEventos manejador = new ManejadorEventos(); String colores[] = { "Azul", "Amarillo", "Rojo" };

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; ademá// permitir el manejo de eventos para cada elemento de menú

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

46

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.

construir cada elemento de menú y agregarlo al menú contextual; además

Page 146: JavaModulo2 _2

©

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 a // manejar evento de oprimir botón del ratón public void mousePressed( MouseEvent evento ) { checkForTriggerEvent( evento ); } // manejar evento de soltar el botón del rat public void mouseReleased( MouseEvent evento ) { checkForTriggerEvent( evento ); } // determinar si evento debe desencadenar el menú contextual private void checkForTriggerEven { if ( evento.isPopupTrigger() ) menuContextual.show( evento.getComponent(), evento.getX(), evento.getY() ); } } // fin de la clase interna anónima ); // 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); 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 {

Para uso exclusivo de los alumnos de CETICSA S.L.

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ú contextualgetContentPane().addMouseListener(

new MouseAdapter() { // clase interna anónima

// manejar evento de oprimir botón del ratón public void mousePressed( MouseEvent evento )

checkForTriggerEvent( evento );

// manejar evento de soltar el botón del ratón public void mouseReleased( MouseEvent evento )

checkForTriggerEvent( evento );

// determinar si evento debe desencadenar el menú contextual private void checkForTriggerEvent( MouseEvent evento )

if ( evento.isPopupTrigger() ) menuContextual.show( evento.getComponent(), evento.getX(), evento.getY() );

} // fin de la clase interna anónima

); // fin de la llamada a addMouseListener

} // fin del constructor de PruebaContextual

public static void main( String args[] )

Frame.setDefaultLookAndFeelDecorated(true); PruebaContextual aplicacion = new PruebaContextual(); aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

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.

Página1

47

elementos[ cuenta ] = new JRadioButtonMenuItem( colores[ cuenta ] );

// un objeto JPopupMenu cuando ocurre el evento de desencadenamiento del menú contextual

Page 147: JavaModulo2 _2

©

// procesar selecciones de elementos de menú public void actionPerformed( ActionEvent evento ) { // determinar cuál 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 Manej } // fin de la clase PruebaContextual

Ver Video: Unidad 14. CrearToolBar

Unidad 15 :

Introducción Todos los ejemplos que hemos realizado hasta este punto han sido desarrollados con un solo hilo de ejecución, es decir, únicamente realizamos una tarea.

La programación multihilo o multitarea permitirá lanzar varias acciones dentro de un mismo programa, de esta manera podremos realizar distintas tareas simultáneamente. El sistema con el que estemos trabajando se encargará de la ejecución concurrente de ambas tareas.

Es importante comentar que cada thread se ejecutará de forma absolutamente independiente. Cuno 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 información entre ellos, es necesario usar algún sistema de sincronización para evitar datos que pueden estar a medio actualizar por otro thread.

Clases para trabajar con thread

CLASE

Thread Un objeto Thread representa a una tarea en ejecución. Aquí se implementan métodos que van a permitir

ThreadGroup Un objeto de este tipo representa a un conjunto de Threads y proporciona métodos para gestionar dicho grupo.

Para uso exclusivo de los alumnos de CETICSA S.L.

// procesar selecciones de elementos de menú public void actionPerformed( ActionEvent evento )

// determinar cuál elemento de menú fue seleccionado int i = 0; i < elementos.length; i++ )

if ( evento.getSource() == elementos[ i ] ) { getContentPane().setBackground( valoresColor[ i ] );

} // fin de la clase interna privada ManejadorEventos

} // fin de la clase PruebaContextual

Ver Video: Unidad 14. CrearToolBar

Unidad 15 : Hilos

Todos los ejemplos que hemos realizado hasta este punto han sido desarrollados con un solo hilo de ejecución, es decir, únicamente realizamos una tarea.

La programación multihilo o multitarea permitirá lanzar varias acciones dentro de un mismo e esta manera podremos realizar distintas tareas simultáneamente. El sistema con el

que estemos trabajando se encargará de la ejecución concurrente de ambas tareas.

Es importante comentar que cada thread se ejecutará de forma absolutamente independiente. Cuno 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 información entre ellos, es necesario usar algún sistema de sincronización 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

DEFINICIÓN

Un objeto Thread representa a una tarea en ejecución. Aquí se implementan métodos que van a permitir gestionar tareas individualmente.

Un objeto de este tipo representa a un conjunto de Threads y proporciona métodos para gestionar dicho grupo.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

48

Todos los ejemplos que hemos realizado hasta este punto han sido desarrollados con un solo hilo de

La programación multihilo o multitarea permitirá lanzar varias acciones dentro de un mismo e esta manera podremos realizar distintas tareas simultáneamente. El sistema con el

que estemos trabajando se encargará de la ejecución concurrente de ambas tareas.

Es importante comentar que cada thread se ejecutará de forma absolutamente independiente. Cada 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 información entre ellos, es

que uno de ellos acceda a un grupo de

Un objeto Thread representa a una tarea en ejecución. Aquí se implementan gestionar tareas individualmente.

Un objeto de este tipo representa a un conjunto de Threads y proporciona métodos

Page 148: JavaModulo2 _2

©

Ciclo de vida de un thread

Inicio tarea

Cuando se crea una nueva tarea, ésta no se arranca automáticamente sino que hay que usar el método 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

start() : Método que crea los recursos necesarios para que la tarea se pueda ejecutar. No conviene sobreescribir este método, el cual se implementa en la clase Thread.

run(): Método equivalente al main de las aplicaciones que hemos realizadométodo es dónde el programador deberá poner el código que desea que se ejecute en la tarea.

Detener la tarea

Una tarea se puede detener por los siguientes motivos:

Llamando al método sleep().

Cuando la tarea usa su método wait() par

Cuando la tarea queda bloqueada en algún 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 sleep(), pasado el tiempo especificado.

Si se paró por una operación de E/S, cuando dicha operación se realice.

Si se paró por wait(), llamando al método notify() o notifyAll() y que la condición por la que se espera se cumpla. Se llamará por tanto a algcondición varíe.

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), además programa que solicita información por teclado(teclado.java).

Ejemplo1.java

Para uso exclusivo de los alumnos de CETICSA S.L.

Ciclo de vida de un thread

Cuando se crea una nueva tarea, ésta no se arranca automáticamente sino que hay que usar el método start().Hasta que no se arranca la tarea, ésta permanece en el estado Nueva tarea.

Cuando iniciamos una tarea se desencadena la llamada a dos métodos:

start() : Método que crea los recursos necesarios para que la tarea se pueda ejecutar. No conviene sobreescribir este método, el cual se implementa en la clase Thread.

run(): Método equivalente al main de las aplicaciones que hemos realizadométodo es dónde el programador deberá poner el código que desea que se ejecute en la tarea.

Una tarea se puede detener por los siguientes motivos:

Cuando la tarea usa su método wait() para esperar a que se cumpla una condición.

Cuando la tarea queda bloqueada en algún 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:

n sleep(), pasado el tiempo especificado.

Si se paró por una operación de E/S, cuando dicha operación se realice.

Si se paró por wait(), llamando al método notify() o notifyAll() y que la condición por la que se espera se cumpla. Se llamará por tanto a alguno de esos métodos cuando la variable que controla

Primer ejemplo de hilos

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), además lanzará la tercera clase que es un programa que solicita información por teclado(teclado.java).

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

49

Cuando se crea una nueva tarea, ésta no se arranca automáticamente sino que hay que usar el método start().Hasta que no se arranca la tarea, ésta permanece en el estado Nueva tarea.

start() : Método que crea los recursos necesarios para que la tarea se pueda ejecutar. No conviene

run(): Método equivalente al main de las aplicaciones que hemos realizado hasta ahora. En este método es dónde el programador deberá poner el código que desea que se ejecute en la tarea.

a esperar a que se cumpla una condición.

Si se paró por wait(), llamando al método notify() o notifyAll() y que la condición por la que se uno de esos métodos cuando la variable que controla

Primer ejemplo de hilos

En el siguiente ejemplo creamos tres clases, la clase principal(Ejemplo1.java) lanza la segunda clase lanzará la tercera clase que es un

Page 149: JavaModulo2 _2

©

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("Método Run de 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.*;

Para uso exclusivo de los alumnos de CETICSA S.L.

public static void main(String args[])

Teclado t1=new Teclado();

Thread(t1).start();

public class Hora extends Thread{

System.out.println("Constructor de Hora");

Date fecha=new Date();

System.out.println("Método Run de Teclado");

for (int i=0;i<15;++i){

System.out.println("Fecha: "+ fecha.toString());sleep(5000);

catch(InterruptedException e){

System.out.println("ERROR");

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

50

System.out.println("Fecha: "+ fecha.toString());

Page 150: JavaModulo2 _2

©

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("Método Run de Teclado"); try{ for (int i=0;i<15;++i){ System.out.println("Introduzca línea de texto:"); linea=bin.readLine(); System.out.println("Usted escribió: "+linea); } } catch(IOException e){ System.out.println("ERROR"); } } }

SALIDA DEL PROGRAMA:

Para uso exclusivo de los alumnos de CETICSA S.L.

Teclado implements Runnable{

System.out.println("Constructor de Teclado"); bin=new BufferedReader(new InputStreamReader(System.in));

String linea=""; System.out.println("Método Run de Teclado");

for (int i=0;i<15;++i){

System.out.println("Introduzca línea de texto:");linea=bin.readLine(); System.out.println("Usted escribió: "+linea);

catch(IOException e){

System.out.println("ERROR");

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

51

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

System.out.println("Introduzca línea de texto:");

System.out.println("Usted escribió: "+linea);

Page 151: JavaModulo2 _2

©

start() Este método indica al intérprete de Java que cree un contexto del hilo del sistema y comience a ejecutarlo. A continuación, el método run() de este Hay que tener precaución de no llamar al método start() más de una vez sobre un hilo determinado.

run() El método run() constituye el cuerpo de un hilo en ejecución. Este es el único método del interfaz Runnable. Es llamado por el método start() después de que el hilo apropiado del sistema se haya inicializado. Siempre que el método run() devuelva el control, el hilo actual se detendrá.

stop() Este método provoca que el hilo se detenga de manera inmediata.brusca de detener un hilo, especialmente si este método se ejecuta sobre el hilo en curso. En tal caso, la línea inmediatamente posterior a la llamada al método stop() no llega a ejecutarse jamás, pues el contexto del hilo muere antes de que stop() devuelva el control. Una forma más elegante de detener un hilo es utilizar alguna variable que ocasione que el método run() termine de manera ordenada

currentThread() Este método devuelve el objeto thread que representa al hilo deactualmente.

sleep( long ) El método sleep() provoca que el intérprete ponga al hilo en curso a dormir durante el número de milisegundos que se indiquen en el parámetro de invocación. Una vez transcurridos esos milisegundos, dicho hilo volverá a estar disponible para su ejecución. Los relojes asociados a la mayor parte de los intérpretes de Java no serán capaces de obtener precisiones mayores de 10 milisegundos, por mucho que se permita indicar hasta nanosegundos en la llaeste método.

yield() Este método hace que el intérprete 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 inanición.

Para uso exclusivo de los alumnos de CETICSA S.L.

Métodos de la clase Thread

Este método indica al intérprete de Java que cree un contexto del hilo del sistema y comience a ejecutarlo. A continuación, el método run() de este hilo será invocado en el nuevo contexto del hilo. Hay que tener precaución de no llamar al método start() más de una vez sobre un hilo determinado.

El método run() constituye el cuerpo de un hilo en ejecución. Este es el único método del interfaz nnable. Es llamado por el método start() después de que el hilo apropiado del sistema se haya

inicializado. Siempre que el método run() devuelva el control, el hilo actual se detendrá.

Este método provoca que el hilo se detenga de manera inmediata. A menudo constituye una manera brusca de detener un hilo, especialmente si este método se ejecuta sobre el hilo en curso. En tal caso, la línea inmediatamente posterior a la llamada al método stop() no llega a ejecutarse jamás,

uere antes de que stop() devuelva el control. Una forma más elegante de detener un hilo es utilizar alguna variable que ocasione que el método run() termine de manera

Este método devuelve el objeto thread que representa al hilo de ejecución que se está ejecutando

El método sleep() provoca que el intérprete ponga al hilo en curso a dormir durante el número de milisegundos que se indiquen en el parámetro de invocación. Una vez transcurridos esos

os, dicho hilo volverá a estar disponible para su ejecución. Los relojes asociados a la mayor parte de los intérpretes de Java no serán capaces de obtener precisiones mayores de 10 milisegundos, por mucho que se permita indicar hasta nanosegundos en la lla

Este método hace que el intérprete 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

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

52

Métodos de la clase Thread

Este método indica al intérprete de Java que cree un contexto del hilo del sistema y comience a hilo será invocado en el nuevo contexto del hilo.

Hay que tener precaución de no llamar al método start() más de una vez sobre un hilo determinado.

El método run() constituye el cuerpo de un hilo en ejecución. Este es el único método del interfaz nnable. Es llamado por el método start() después de que el hilo apropiado del sistema se haya

inicializado. Siempre que el método run() devuelva el control, el hilo actual se detendrá.

A menudo constituye una manera brusca de detener un hilo, especialmente si este método se ejecuta sobre el hilo en curso. En tal caso, la línea inmediatamente posterior a la llamada al método stop() no llega a ejecutarse jamás,

uere antes de que stop() devuelva el control. Una forma más elegante de detener un hilo es utilizar alguna variable que ocasione que el método run() termine de manera

ejecución que se está ejecutando

El método sleep() provoca que el intérprete ponga al hilo en curso a dormir durante el número de milisegundos que se indiquen en el parámetro de invocación. Una vez transcurridos esos

os, dicho hilo volverá a estar disponible para su ejecución. Los relojes asociados a la mayor parte de los intérpretes de Java no serán capaces de obtener precisiones mayores de 10 milisegundos, por mucho que se permita indicar hasta nanosegundos en la llamada alternativa a

Este método hace que el intérprete 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

Page 152: JavaModulo2 _2

©

suspend() El método suspend() es distinto de stop(). suspend() toma el hilo y provoca que se detenga su ejecución sin destruir el hilo de sistema subyacente, ni el estado del hilo anteriormente en ejecución. Si la ejecución de un hilo se suspende, puede llamarse a resuque vuelva a ejecutarse de nuevo.

resume() El método resume() se utiliza para revivir un hilo suspendido. No hay garantías de que el hilo comience a ejecutarse inmediatamente, ya que puede haber un hilo de mayor prioriactualmente, pero resume() ocasiona que el hilo vuelva a ser un candidato a ser ejecutado.

getPriority() Este método devuelve la prioridad del hilo de ejecución en curso, que es un valor comprendido entre uno y diez.

setPriority( int ) El método setPriority() asigna al hilo la prioridad indicada por el valor pasado como parámetro. Hay bastantes constantes predefinidas para la prioridad, definidas en la clase Thread, tales como MIN_PRIORITY, NORM_PRIORITY y MAX_PRIORITY, que toman los valorespectivamente. Como guía aproximada de utilización, se puede establecer que la mayor parte de los procesos a nivel de usuario deberían tomar una prioridad en torno a NORM_PRIORITY. Las tareas en segundo plano, como una entrada/salida a reduna prioridad cercana a MIN_PRIORITY. Con las tareas a las que se fije la máxima 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 intérprete Java quede totalmente fuera de control.

getName() Este método devuelve el valor actual, de tipo cadena, asignado como nombre al hilo en ejecución mediante setName().

setName( String ) Este método permite identificar adepuración de programas multihilo. El nombre mnemónico aparecerá en todas las líneas de trazado que se muestran cada vez que el intérprete Java imprime excepciones no capturadas.

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

El método wait() permite a un hilo pausar su ejecución hasta que se le notifique que ocurrió algo de lo que se tiene que encargar.

Para uso exclusivo de los alumnos de CETICSA S.L.

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

El método resume() se utiliza para revivir un hilo suspendido. No hay garantías de que el hilo comience a ejecutarse inmediatamente, ya que puede haber un hilo de mayor prioriactualmente, pero resume() ocasiona que el hilo vuelva a ser un candidato a ser ejecutado.

Este método devuelve la prioridad del hilo de ejecución en curso, que es un valor comprendido entre

l método setPriority() asigna al hilo la prioridad indicada por el valor pasado como parámetro. Hay bastantes constantes predefinidas para la prioridad, definidas en la clase Thread, tales como MIN_PRIORITY, NORM_PRIORITY y MAX_PRIORITY, que toman los valorespectivamente. Como guía aproximada de utilización, se puede establecer que la mayor parte de los procesos a nivel de usuario deberían 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, deberían tener una prioridad cercana a MIN_PRIORITY. Con las tareas a las que se fije la máxima prioridad, en torno a MAX_PRIORITY, hay que ser especialmente cuidadosos, porque si no se hacen llamadas a

se puede provocar que el intérprete Java quede totalmente fuera de control.

Este método devuelve el valor actual, de tipo cadena, asignado como nombre al hilo en ejecución

Este método permite identificar al hilo con un nombre menmónico. De esta manera se facilita la depuración de programas multihilo. El nombre mnemónico aparecerá en todas las líneas de trazado que se muestran cada vez que el intérprete Java imprime excepciones no capturadas.

Uso de Wait y

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

El método wait() permite a un hilo pausar su ejecución hasta que se le notifique que ocurrió algo de

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

53

método suspend() es distinto de stop(). suspend() toma el hilo y provoca que se detenga su ejecución sin destruir el hilo de sistema subyacente, ni el estado del hilo anteriormente en ejecución.

me() sobre el mismo hilo para lograr

El método resume() se utiliza para revivir un hilo suspendido. No hay garantías de que el hilo comience a ejecutarse inmediatamente, ya que puede haber un hilo de mayor prioridad en ejecución actualmente, pero resume() ocasiona que el hilo vuelva a ser un candidato a ser ejecutado.

Este método devuelve la prioridad del hilo de ejecución en curso, que es un valor comprendido entre

l método setPriority() asigna al hilo la prioridad indicada por el valor pasado como parámetro. 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 1, 5 y 10, respectivamente. Como guía aproximada de utilización, se puede establecer que la mayor parte de los procesos a nivel de usuario deberían tomar una prioridad en torno a NORM_PRIORITY. Las tareas

o el nuevo dibujo de la pantalla, deberían tener una prioridad cercana a MIN_PRIORITY. Con las tareas a las que se fije la máxima prioridad, en torno a MAX_PRIORITY, hay que ser especialmente cuidadosos, porque si no se hacen llamadas a

se puede provocar que el intérprete Java quede totalmente fuera de control.

Este método devuelve el valor actual, de tipo cadena, asignado como nombre al hilo en ejecución

l hilo con un nombre menmónico. De esta manera se facilita la depuración de programas multihilo. El nombre mnemónico aparecerá en todas las líneas de trazado que se muestran cada vez que el intérprete Java imprime excepciones no capturadas.

Uso de Wait y Notify

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

El método wait() permite a un hilo pausar su ejecución hasta que se le notifique que ocurrió algo de

Page 153: JavaModulo2 _2

©

El método notify() se utiliza para enviar una señal a un y solo un hilo que se encuentra esperando.

El método notify() no permite especificar que hilo en espera se va a notificar.

El método notifyAll() funciona del mismo modo que notify, a diferencia que envía señales a todos lohilos esperando por un objeto.

Ejemplo del uso de estos métodos

En el siguiente ejemplo usamos los métodos 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");

Para uso exclusivo de los alumnos de CETICSA S.L.

tiliza para enviar una señal a un y solo un hilo que se encuentra esperando.

El método notify() no permite especificar que hilo en espera se va a notificar.

El método notifyAll() funciona del mismo modo que notify, a diferencia que envía señales a todos lo

Ejemplo del uso de estos métodos

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

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

Ficha f1=new Ficha("hola","hola","hola",1);

Actualiza ac=new Actualiza(fichas); Leer le=new Leer(fichas,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.

Página1

54

tiliza para enviar una señal a un y solo un hilo que se encuentra esperando.

El método notify() no permite especificar que hilo en espera se va a notificar.

El método notifyAll() funciona del mismo modo que notify, a diferencia que envía señales a todos los

En el siguiente ejemplo usamos los métodos wait() y notify() con el objetivo de hacer esperar al

Page 154: JavaModulo2 _2

©

this.fichas=fichas; this.ac=ac; } public void run(){ System.out.println("Método 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;

Para uso exclusivo de los alumnos de CETICSA S.L.

this.fichas=fichas;

System.out.println("Método Run de Leer"); leer();

ac.sincronizar(true); System.out.println(fichas[0].texto()); sleep(5000);

catch(InterruptedException e){

System.out.println(e.toString());

/** Objeto que contiene los datos y operaciones de una Ficha de la Agenda. */

public class Ficha implements java.io.Serializable

/** Construye una Ficha nueva con sus datos. */ public Ficha(String nombre, String apellidos, String direccion, int telefono)

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

55

*/

Page 155: JavaModulo2 _2

©

this.telefono=telefono; } /** Devuelve el texto con el contenido de esta Ficha. public String texto() { String texto="________________________________________ "Nombre : "+nombre+"\n"+ "Apellidos: "+apellidos+"\n"+ "Direccion: "+direccion+"\n"+ "Telefono : "+telefono+"\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("Método Run de Actualiza"); actualiza(); } // El método wait() y notify() deben estar dentro de un método// sincronizado. Con una variable boolena controlamos si hay// que ejecutar wait o notify. public synchronized void sincronizar(boolean b){ if (b){ try{ wait();

Para uso exclusivo de los alumnos de CETICSA S.L.

/** Devuelve el texto con el contenido de esta Ficha. */

String texto="________________________________________\n"+

"________________________________________\n";

public class Actualiza extends Thread{

public Actualiza(Ficha[] fichas){

System.out.println("Constructor de Actualiza"); bin=new BufferedReader(new InputStreamReader(System.in));this.fichas=fichas;

System.out.println("Método Run de Actualiza");

// El método wait() y notify() deben estar dentro de un método // sincronizado. Con una variable boolena controlamos si hay

sincronizar(boolean b){

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

56

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

Page 156: JavaModulo2 _2

©

} catch(InterruptedException e){ System.out.println(e.toString()); } } else{ notifyAll(); } } public void actualiza(){ String linea=""; System.out.println("Comenzando la 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"); } } }

Uso La cuestión cuando se trabaja con threads es que la ejecución avanza en varias partes del programa a la vez. Cada una de esas ejecuciones simultáneas pueden tocar los mismos objetos.

Para uso exclusivo de los alumnos de CETICSA S.L.

catch(InterruptedException e){

System.out.println(e.toString());

String linea=""; System.out.println("Comenzando la actualización");

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

La cuestión cuando se trabaja con threads es que la ejecución avanza en varias partes del programa a la vez. Cada una de esas ejecuciones simultáneas pueden tocar los mismos objetos.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

57

System.out.println("Introduzca apellidos:");

System.out.println("Introduzca direccion:");

System.out.println("Introduzca telefono:"); fichas[0].telefono=Integer.parseInt(bin.readLine());

Sincronización

La cuestión cuando se trabaja con threads es que la ejecución avanza en varias partes del programa a la vez. Cada una de esas ejecuciones simultáneas pueden tocar los mismos objetos.

Page 157: JavaModulo2 _2

©

Los métodos synchronized previenen que más de un hilo acceda alsimultáneamente.

Para sincronizar un bloque de código, se debe especificar un argumento que es el objeto que se utilizara como cerradura para la sincronización.

Se puede utilizar la palabra clave synchronized como un modificadoiniciador de un bloque de código sincronizado.

Mientras que solo un hilo puede acceder al código sincronizado de una instancia en particular, múltiples hilos pueden acceder al código no sincronizado de una misma instancia.

Cuando un hilo se duerme, su cerradura no se encuentra disponibles para otros hilos.

Ejemplo de sincronizaciónEn el ejemplo anterior podemos modificar la clase Ficha de tal manera que las operaciones de lectura queden bloqueadas hasta que terminen las de escritu

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 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="________________________________________ "Nombre : "+nombre+"\n"+ "Apellidos: "+apellidos+"\n"+ "Direccion: "+direccion+"\n"+ "Telefono : "+telefono+"\n"+ "____________________________ return texto; } public synchronized void operar(int opcion){ BufferedReader bin=new BufferedReader(new InputStreamReader(System.in)); switch (opcion){

Para uso exclusivo de los alumnos de CETICSA S.L.

Los métodos synchronized previenen que más de un hilo acceda al código de un método crítico

Para sincronizar un bloque de código, se debe especificar un argumento que es el objeto que se utilizara como cerradura para la sincronización.

Se puede utilizar la palabra clave synchronized como un modificador de un método, o como un iniciador de un bloque de código sincronizado.

Mientras que solo un hilo puede acceder al código sincronizado de una instancia en particular, múltiples hilos pueden acceder al código no sincronizado de una misma instancia.

un hilo se duerme, su cerradura no se encuentra disponibles para otros hilos.

Ejemplo de sincronización En el ejemplo anterior podemos modificar la clase Ficha de tal manera que las operaciones de lectura queden bloqueadas hasta que terminen las de escritura.

public class Ficha implements java.io.Serializable

/** Construye una Ficha nueva con sus datos. */ String nombre, String apellidos, String direccion, int telefono)

/** Devuelve el texto con el contenido de esta Ficha. */

String texto="________________________________________\n"+

"________________________________________\n";

public synchronized void operar(int opcion){

BufferedReader bin=new BufferedReader(new

switch (opcion){

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

58

código de un método crítico

Para sincronizar un bloque de código, se debe especificar un argumento que es el objeto que se

r de un método, o como un

Mientras que solo un hilo puede acceder al código sincronizado de una instancia en particular, múltiples hilos pueden acceder al código no sincronizado de una misma instancia.

un hilo se duerme, su cerradura no se encuentra disponibles para otros hilos.

En el ejemplo anterior podemos modificar la clase Ficha de tal manera que las operaciones de

Page 158: JavaModulo2 _2

©

case 1: try{ System.out.println("Introduzca 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"); } case 2: System.out.println(this.texto()); } System.out.println("Saliendo del } }

Unidad 16 : Programación en red

Introducción Java tiene como ventaja frente a otros lenguajes de programación el que puede programarse en red.

Al igual que las personas tenemos nuestro DNI para identificarnos, los ordenadores tienen un identificador la DIRECCIÓN IP.

La comunicacón entre los equipos se realiza mediante dos protocolos de transmisión:

TCP/IP: Transmisión Control Protocol / Internet Protocol.

UDP: UserDatagramProtocol.

Un PROTOCOLO es un conjunto Dependiendo de lo que vaya a hacer usare un protocolo u otro.

Para uso exclusivo de los alumnos de CETICSA S.L.

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 método operar");

Unidad 16 : Programación en red

Java tiene como ventaja frente a otros lenguajes de programación el que puede programarse en

Al igual que las personas tenemos nuestro DNI para identificarnos, los ordenadores tienen un identificador la DIRECCIÓN IP.

La comunicacón entre los equipos se realiza mediante dos protocolos de transmisión:

TCP/IP: Transmisión Control Protocol / Internet Protocol.

Un PROTOCOLO es un conjunto de normas que si se cumple nos asegura una comunicación. 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.

Página1

59

System.out.println("Introduzca apellidos:");

System.out.println("Introduzca direccion:");

System.out.println("Introduzca telefono:"); this.telefono=Integer.parseInt(bin.readLine());

Unidad 16 : Programación en red

Java tiene como ventaja frente a otros lenguajes de programación el que puede programarse en

Al igual que las personas tenemos nuestro DNI para identificarnos, los ordenadores dentro de la red

La comunicacón entre los equipos se realiza mediante dos protocolos de transmisión:

de normas que si se cumple nos asegura una comunicación.

Page 159: JavaModulo2 _2

©

TCP/IP: Mas seguro. Envía información de una maquina a otra. Esta información se envía en tramas que son bloques de información que van c

Este protocolo envía las tramas, en el caso de producirse perdidas reenviarlas y una vez llegadas al destino ordenarlas.

Además de protocolo se necesita un puerto. Son numéricos. Es el mecanismo por el que entra información en la maquina o por el que la maquina envía información.

UDP: Es el protocolo universal de datos. Es el mas rápido y menos seguro. A una dirección manda información y no se preocupa de que la dirección exista, le llegue, etc. Valido para intranets. Las tramas si se pierden no se retransmiten y no las ordenan a la llegada.

Esta clase que pertenece al paquete java.Net podemos capturar las direcciones o nombres de las máquinas.

Ejemplo //Este ejemplo nos dice la direccion de la maquina dondeimport 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 System.out.println("No encuentro el servidor"); e.printStackTrace(); //Escribe el error que genera } } } Métodos de la clase

getLocalHost(): Devuelve el nombre de la maquina y la dirección IP. Para llamarlo InetAddress.getLocalHost().

getHostAddress(): Devuelve una cadena con la dirección IP. Para llamarlo nombre_objeto.getHostAddress().

getHostName(): Devuelve una cadena con el nombre de la máquina. Para llamarlo nombre_objeto.getHostName().

Para uso exclusivo de los alumnos de CETICSA S.L.

TCP/IP: Mas seguro. Envía información de una maquina a otra. Esta información se envía en tramas que son bloques de información que van codificadas en bytes(0 y 1).

Este protocolo envía las tramas, en el caso de producirse perdidas reenviarlas y una vez llegadas al

Además de protocolo se necesita un puerto. Son numéricos. Es el mecanismo por el que entra la maquina o por el que la maquina envía información.

UDP: Es el protocolo universal de datos. Es el mas rápido y menos seguro. A una dirección manda información y no se preocupa de que la dirección exista, le llegue, etc. Valido para intranets. Las

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

//Este ejemplo nos dice la direccion de la maquina donde estamos trabajando

public static void main(String args[]){

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

getLocalHost(): Devuelve el nombre de la maquina y la dirección IP. Para llamarlo

getHostAddress(): Devuelve una cadena con la dirección IP. Para llamarlo

getHostName(): Devuelve una cadena con el nombre de la máquina. Para llamarlo

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

60

TCP/IP: Mas seguro. Envía información de una maquina a otra. Esta información se envía en tramas

Este protocolo envía las tramas, en el caso de producirse perdidas reenviarlas y una vez llegadas al

Además de protocolo se necesita un puerto. Son numéricos. Es el mecanismo por el que entra

UDP: Es el protocolo universal de datos. Es el mas rápido y menos seguro. A una dirección manda información y no se preocupa de que la dirección exista, le llegue, etc. Valido para intranets. Las

Clase InetAddress

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

estamos trabajando

InetAddress mimaquina = InetAddress.getLocalHost(); System.out.println("Mi maquina es "+mimaquina);

System.out.println("No encuentro el servidor"); e.printStackTrace(); //Escribe el error que genera

getLocalHost(): Devuelve el nombre de la maquina y la dirección IP. Para llamarlo

getHostAddress(): Devuelve una cadena con la dirección IP. Para llamarlo

getHostName(): Devuelve una cadena con el nombre de la máquina. Para llamarlo

Page 160: JavaModulo2 _2

©

getByName( String): Determina la InetAddress getByName(nombre).

getAddress(): Mete la dirección IP en una matriz byte.

Para llamarlo miarray= nombre_objeto.getAddress();

getAllByName(): Devuelve todas las direcciones IP eejemplo Sun puede tener con un nombre muchas direcciones IP. Para llamarlo:

nombrearray= objetoInetAddres.getAllByName().

Realizar Laboratorio: Uso de la clase InetAddress Objetivo Manejar los métodos más importantes de la clase InetAddress.

Enunciado Crear un clase que utilice los métodos más importantes de la clase InetAddress y muestre la información siguiente:

Mi maquina es .getLocalHost() Pc001/192.168.1.55Direccion .getHostAddress() 192.168.1.34Nombre .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

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

Para uso exclusivo de los alumnos de CETICSA S.L.

getByName( String): Determina la dirección IP del host a partir del nombre del host. Para llamarlo InetAddress getByName(nombre).

getAddress(): Mete la dirección IP en una matriz byte.

Para llamarlo miarray= nombre_objeto.getAddress();

getAllByName(): Devuelve todas las direcciones IP 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

importantes de la clase InetAddress.

Crear un clase que utilice los métodos más importantes de la clase InetAddress y muestre la

Mi maquina es .getLocalHost() Pc001/192.168.1.55 Direccion .getHostAddress() 192.168.1.34

Nombre .getByName( nombre)Pc001/192.168.1.55

main(String args[]){ InetAddress mimaquina; byte matriz[];

//Muestro nombre-ip 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.

Página1

61

dirección IP del host a partir del nombre del host. Para llamarlo

n una matriz a partir del nombre del host. Por ejemplo Sun puede tener con un nombre muchas direcciones IP. Para llamarlo:

Realizar Laboratorio: Uso de la clase InetAddress

Crear un clase que utilice los métodos más importantes de la clase InetAddress y muestre la

System.out.println("Mi maquina es .getLocalHost() "+mimaquina);

System.out.println("Direccion .getHostAddress() "+

Page 161: JavaModulo2 _2

©

//Muestro el nombre String nombre= mimaquina.getHostName(); System.out.println("Nombre .getHostName() "+nombre); //Muestro un host a partir de un string m 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++){ ((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 } } }

Un Socket es un método para la comunicación entre un programa del cliente y un programa del servidor en una red. Un socket se define como el punto finalcliente o el servidor escriben la información que transferimos.

Las clases Socket y ServerSocket del paquete java.net proporcionan un canal de comunicación independiente del sistema utilizando TCP, cada una de las cuaservidor respectivamente.

Ejemplo En el siguiente ejemplo nos encargamos de leer la información que nos está entrando.

import java.net.*; import java.io.*; public class ejSocket{ public static void main(String try{ Socket misocket = new Socket("Servidor ",13);

Para uso exclusivo de los alumnos de CETICSA S.L.

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);System.out.println("Nombre .getByName( nombre)"+mimaquina);//Muestro la direccion que meti en una matrizmatriz= mimaquina.getAddress(); System.out.println("Con la matriz .getAddress()"+ new

for (int i=0; i<matriz.length;i++){ System.out.println("Con la matriz .getAddress() "+_

//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

Un Socket es un método para la comunicación entre un programa del cliente y un programa del servidor en una red. Un socket se define como el punto final en una conexión El Socket es donde el cliente o el servidor escriben la información que transferimos.

Las clases Socket y ServerSocket del paquete java.net proporcionan un canal de comunicación independiente del sistema utilizando TCP, cada una de las cuales implementa el lado del cliente y el

En el siguiente ejemplo nos encargamos de leer la información que nos está entrando.

public static void main(String args[]){

Socket misocket = new Socket("Servidor ",13);

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

62

mimaquina.getHostAddress());

String nombre= mimaquina.getHostName(); System.out.println("Nombre .getHostName() "+nombre);

imaquina= InetAddress.getByName( nombre); System.out.println("Nombre .getByName( nombre)"+mimaquina); //Muestro la direccion que meti en una matriz

System.out.println("Con la matriz .getAddress()"+ new

System.out.println("Con la matriz .getAddress() "+_

//Tambien vale System.out.println("Con la matriz .getAddress() "+ ((matriz[i]&255)));

e.printStackTrace(); //Escribe el error que genera

Socket

Un Socket es un método para la comunicación entre un programa del cliente y un programa del en una conexión El Socket es donde el

Las clases Socket y ServerSocket del paquete java.net proporcionan un canal de comunicación les implementa el lado del cliente y el

En el siguiente ejemplo nos encargamos de leer la información que nos está entrando.

Socket misocket = new Socket("Servidor ",13);

Page 162: JavaModulo2 _2

©

//Creación de flujo para recibir datos BufferedReader in = new BufferedReader(new InputStreamReader( String texto; while ((texto=in.readLine())!=null){ } //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"); } } }

Métodos de la clase Socket

getInputStream() : Abrir el canal de entrada de información

getOutputStream(): Abrimos el canal salida

close() : Cerramos el Socket

InetAddress getInetAddress() : Devuelve umaquina 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() : Devuelve nuestra dirección.

InetAdress a = nom_socket.getLocalAddress().

int getLocalPort() : Devuelve el puerto desde el que nos conectamos

int puerto = n_socket.getLocalPort();

Ejemplo de utilización de algunos de los métodos

import java.io.*; import java.net.*; public class Cliente{ public static void main(String args[]){

Para uso exclusivo de los alumnos de CETICSA S.L.

//Creación 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");

Métodos de la clase Socket

getInputStream() : Abrir el canal de entrada de información

getOutputStream(): Abrimos el canal salida

InetAddress getInetAddress() : Devuelve un objeto InetAddress con el nombre y la dirección de la maquina a la que estamos conectados.

InetAdress ia:nombre_socket.getInetAdress();

int getPort(): Devuelve el numero de puerto al que estamos conectados.

LocalAddress() : Devuelve nuestra dirección.

InetAdress a = nom_socket.getLocalAddress().

int getLocalPort() : Devuelve el puerto desde el que nos conectamos

int puerto = n_socket.getLocalPort();

Ejemplo de utilización de algunos de los métodos

public static void main(String args[]){

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

63

BufferedReader in = new BufferedReader(new InputStreamReader(

System.out.println("No encuentro el servidor");

n objeto InetAddress con el nombre y la dirección de la

Page 163: JavaModulo2 _2

©

try{ Socket misocket = new Socket("200.200.1.12",8810);BufferedReader in = new BufferedReader(new InputStreamReader( misocket.getInputStream())); / 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.getIne 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 excepción y se desconecta, para que no esté esperando infinitamente y que se desconecte tras el si no ha conseguido conectarse.

setSoTimeout( tiempo_milisegundo);

//Intento de connexion a un servidorimport 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()); _

Para uso exclusivo de los alumnos de CETICSA S.L.

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("Puerto al que estamos conectados_

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 abiertomisocket.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 excepción y se desconecta, para que no esté esperando infinitamente y que se desconecte as el si no ha conseguido conectarse.

setSoTimeout( tiempo_milisegundo);

//Intento de connexion a un servidor

public static void main(String args[]){

System.out.println("La hora de Madrid es: "+new Date()); _

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

64

Socket misocket = new Socket("200.200.1.12",8810); BufferedReader in = new BufferedReader(new InputStreamReader( misocket.getInputStream()));

InetAddress a = misocket.getInetAddress(); tAdrress() "+a);

System.out.println("Puerto al que estamos conectados_

System.out.println("misocket.getLocalAdress()="+a); System.out.println("Puerto desde el que estamos_

//Siempre hay que cerrar el Socket que hemos abierto

System.out.println("No encuentro el servidor");

Podemos limitar el tiempo de espera del cliente a recibir del servidor, si no conecta o no recibe nada salta la excepción y se desconecta, para que no esté esperando infinitamente y que se desconecte

System.out.println("La hora de Madrid es: "+new Date()); _

Page 164: JavaModulo2 _2

©

//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 comunicación 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 (Interru //Si en 10 segundos no conecta lanza esta excepcion System.out.println("Interrupted"); e.printStackTrace(); }catch (IOException e){ System.out.println("IO"); e.printStackTrace(); } } }

Gracias a la clase URL vamos a tener la posibilidad de descargarnos el código fuente de una página html. Luego podemos hacer un programa que interprete ese código y los transforme en elementos java.

También nos va a permitir obtener información del servidor al que nos cone

URL: Localizador Uniforme de Recursos. Con esto nos vamos a poder descargar cualquier recurso de la red.

Posibilidades:

Descargarnos cualquier recurso de la web.

Información del servidor: fecha de creación....

Comunicación de varios ordenadores

¿Cómo 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 dirección de la página, un archivo.

“http://java.sun.com/products”. Con un directorio.

Para uso exclusivo de los alumnos de CETICSA S.L.

Socket miSocket = new Socket("www.whitehouse.net",13); _

//El puerto que da la hora es el 13 miSocket.setSoTimeout(10000); //Si no conecto en _

//Abro el flujo de comunicación BufferedReader in = new BufferedReader(new

//Muestro lo que nos llega System.out.println("La hora de la Casa Blanca: "+in.readLine());

}catch (InterruptedIOException e){ //Si en 10 segundos no conecta lanza esta excepcionSystem.out.println("Interrupted"); e.printStackTrace();

}catch (IOException e){ System.out.println("IO"); e.printStackTrace();

e URL vamos a tener la posibilidad de descargarnos el código fuente de una página html. Luego podemos hacer un programa que interprete ese código y los transforme en elementos

También nos va a permitir obtener información del servidor al que nos conectamos.

URL: Localizador Uniforme de Recursos. Con esto nos vamos a poder descargar cualquier recurso de

Descargarnos cualquier recurso de la web.

Información del servidor: fecha de creación....

Comunicación de varios ordenadores

¿Cómo creamos un objeto URL?

Hay muchos constructores, dependiendo de lo que pongamos en vez de *:

“http://java.sun.com/index.html”. La dirección de la página, un archivo.

“http://java.sun.com/products”. Con un directorio.

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

65

Socket miSocket = new Socket("www.whitehouse.net",13); _

miSocket.setSoTimeout(10000); //Si no conecto en _

BufferedReader in = new BufferedReader(new

System.out.println("La hora de la Casa Blanca: "+in.readLine());

//Si en 10 segundos no conecta lanza esta excepcion

CLASE URL

e URL vamos a tener la posibilidad de descargarnos el código fuente de una página html. Luego podemos hacer un programa que interprete ese código y los transforme en elementos

ctamos.

URL: Localizador Uniforme de Recursos. Con esto nos vamos a poder descargar cualquier recurso de

Page 165: JavaModulo2 _2

©

(nombre_protocolo, nombreHost, puerto, nombre_archivo)

(“http”,“java.sun.com”,80,”FAQ.html”)

Ejemplo de como podríamos unir dos direcciones

import java.net.*; public class ejemplo_constructor_URL { public static void main (String[] args){ try{ URL url_principal = 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){ } } }

Métodos de la clase URL

String getProtocol() : Devuelve el protocolo del URL.

String getHost():Devuelve 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 métodos 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());

Para uso exclusivo de los alumnos de CETICSA S.L.

_protocolo, nombreHost, puerto, nombre_archivo)

(“http”,“java.sun.com”,80,”FAQ.html”)

Ejemplo de como podríamos unir dos direcciones

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

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();

String getProtocol() : Devuelve el protocolo del URL.

evuelve el Host del objeto URL.

int getPort(): Nos devuelve el puerto del URL. Si no hemos inicializado el URL con el puerto, nos

String getFile(): Devuelve el archivo especificado en el URL. Devuelve null si no lo he especificado.

del uso de estos métodos

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

URL url_principal = new URL ("http://java.sun.com/principal.html");(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.

Página1

66

int getPort(): Nos devuelve el puerto del URL. Si no hemos inicializado el URL con el puerto, nos

String getFile(): Devuelve el archivo especificado en el URL. Devuelve null si no lo he especificado.

URL url_principal = new URL ("http://java.sun.com/principal.html");

System.out.println("Protocolo = "+url_absoluta.getProtocol()); System.out.println("Host = "+url_absoluta.getHost());

Page 166: JavaModulo2 _2

©

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

Con la clase URLConnection podemos creaPodremos pedir más información al servidor: fecha de creación, tipo de fichero al que vamos a acceder...

Pasos para crear una conexiónCreamos un objeto de la clase URL

Creamos un objeto de la clase URLConnection con el método openConnection

URL miurl = new URL (“http://www.yahoo.com”);

URLConnection conexion = miurl.openConnection();

Especificaciones de la conexión:

Registrarnos

Podemos indicar si queremos tener abiertos canales de

Conectarnos a partir de una fecha (por si queremos que la página esté actualizada).

Para indicar que queremos tener abiertos los canales de entrada y salida se usan:

setDoInput (boolean);

setDoOutput(boolean); Salida

Conectarnos con el método connect();

Ejemplo

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

Para uso exclusivo de los alumnos de CETICSA S.L.

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 crearnos una conexión como la del Socket pero más completa. Podremos pedir más información al servidor: fecha de creación, tipo de fichero al que vamos a

Pasos para crear una conexión Creamos un objeto de la clase URL

URLConnection con el método openConnection

URL miurl = new URL (“http://www.yahoo.com”);

URLConnection conexion = miurl.openConnection();

Podemos indicar si queremos tener abiertos canales de entrada y salida.

Conectarnos a partir de una fecha (por si queremos que la página esté actualizada).

Para indicar que queremos tener abiertos los canales de entrada y salida se usan:

Entrada

ctarnos con el método connect();

public static void main (String args[]){

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

67

"+url_absoluta.getPort());

CLASE URLConnetion

rnos una conexión como la del Socket pero más completa. Podremos pedir más información al servidor: fecha de creación, tipo de fichero al que vamos a

URLConnection con el método openConnection del objeto url

Conectarnos a partir de una fecha (por si queremos que la página esté actualizada).

Para indicar que queremos tener abiertos los canales de entrada y salida se usan:

Page 167: JavaModulo2 _2

©

URL miurl = new URL ("http://www.marca.com"); //Abrimos la conexion URLConnection conexion= 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 información son el prinformación llegaba mal la volvíamos a enviar.

Con los datagramas podemos enviar información más rápida, pero como desventaja la información se puede perder.

La clase DatagramPacket nos permite elaborar paquetes de información. Lasirve para enviar y recibir la información.

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 puerto, no como en Socket que se hace directamente.

DatagramSocket dtSocket= new DatagramSocket();

3. Usamos el método send( DatagramPacket paquete

DtSocket.send (paquete);

Para uso exclusivo de los alumnos de CETICSA S.L.

URL miurl = new URL ("http://www.marca.com");

nexion= miurl.openConnection(); conexion.setDoInput (true); //Miro si ha sido modificada conexion.setIfModifiedSince(100000000);

//Abrimos el canal de entrada BufferedReader in = new BufferedReader( new InputStreamReader _

while((cadena=in.readLine())!=null){ System.out.println(cadena);

System.out.println(e.toString());

CLASES DatagramPacket y DatagramSocket

En bloque anteriores hemos visto como enviamos información son el protocolo TCP/IP y si esta información llegaba mal la volvíamos a enviar.

Con los datagramas podemos enviar información más rápida, pero como desventaja la información

La clase DatagramPacket nos permite elaborar paquetes de información. Lasirve para enviar y recibir la información.

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 dirección y el puerto, no como en Socket que se hace directamente.

DatagramSocket dtSocket= new DatagramSocket();

DatagramPacket paquete) de DatagramSocket.

DtSocket.send (paquete);

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

68

BufferedReader in = new BufferedReader( new InputStreamReader _

CLASES DatagramPacket y DatagramSocket

otocolo TCP/IP y si esta

Con los datagramas podemos enviar información más rápida, pero como desventaja la información

La clase DatagramPacket nos permite elaborar paquetes de información. La clase DatagramSocket

incluimos la dirección y el

Page 168: JavaModulo2 _2

©

Para recibir un paquete:

Creamos un paquete con la clase DatagramPacket vacio. (

Crear un objeto de la clase DatagramSocket. Ahora si que debemos indicarle el puerto por el que va la información.

DatagramSocket otroSocket = new DatagramSocket(pue

Recibimos el paquete con el método 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 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 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 mostraría las xxxxx //Falta recibir el paquete de vuelta midatagramSocket.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();

Para uso exclusivo de los alumnos de CETICSA S.L.

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

DatagramSocket otroSocket = new DatagramSocket(puerto);

Recibimos el paquete con el método receive ( nombre_paquete);

OtroSockect.receive(otropaquete);

/ /Este programa envia una cadena y recibe el eco, recibe lo mismo que envia.// El cliente envia un paquete al servidor y recibe otro

public class ejemploDatagramasCliente{

public static void main (String args[]){ String servidor="10.32.1.10";

String cadenaUDP = "Prueba ejemplo datagramas" ; //Cadena a enviar byte[] envio = cadenaUDP.getBytes();

InetAddress direccion = InetAddress.getByName(servidor); DatagramPacket paquete = new DatagramPacket( envio, envio.length, _

//Creamos objeto DatagraSocket DatagramSocket midatagramSocket = new DatagramSocket();

rmacion midatagramSocket.send (paquete);

byte[] recepcion = paquete.getData(); //Lo inicializo con _

for(int i=0; i<paquete.getLength(); i++){ recepcion[i]= (byte)'x'; //Lo lleno de x

System.out.println( new String (paquete.getData())); _

//Falta recibir el paquete de vuelta 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.

Página1

69

Lo llamamos otropaquete).

Crear un objeto de la clase DatagramSocket. Ahora si que debemos indicarle el puerto por el que va

/ /Este programa envia una cadena y recibe el eco, recibe lo mismo que envia.

DatagramPacket paquete = new DatagramPacket( envio, envio.length, _

Page 169: JavaModulo2 _2

©

}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 Dat 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], //Esperamos a recibir la información socketDatagrama.receive(paquete); System.out.println("Recibida llamada en el puerto 5000"); _//Solo salta si recibo algo //Reenvio la _ información recibida, construyo un paquete con la información recibida DatagramPacket paqueteenvio = new DatagramPacket(paquete.getData(),_paquete.getLength(),paquete.getAddress(), paquete.getPort()); socketDatagrama.send(paqueteenvio); } }catch(IOException ioe){ System.out.println(ioe.toString()); } } }

Para uso exclusivo de los alumnos de CETICSA S.L.

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

System.out.println(e.toString());

System.out.println(e.toString());

envia una cadena y recibe el eco, recibe lo mismo que envie

public class ejemploDatagramasServidor{

public static void main (String args[]){

DatagramSocket socketDatagrama = new DatagramSocket (5000); System.out.println("Escuchando en el puerto 5000"); //Lo meto en un bucle infinito para que este escuchando

DatagramPacket paquete = new DatagramPacket (new byte[20],//Esperamos a recibir la información socketDatagrama.receive(paquete); System.out.println("Recibida llamada en el puerto 5000"); _

información recibida, construyo un paquete con la información recibida DatagramPacket paqueteenvio = new DatagramPacket(paquete.getData(),_

paquete.getLength(),paquete.getAddress(), paquete.getPort()); socketDatagrama.send(paqueteenvio);

System.out.println(ioe.toString());

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

70

envia una cadena y recibe el eco, recibe lo mismo que envie

DatagramPacket paquete = new DatagramPacket (new byte[20],20);

DatagramPacket paqueteenvio = new DatagramPacket(paquete.getData(),_

RMI

Page 170: JavaModulo2 _2

©

El sistema de Invocación Remota de Métodos (RMI) de Java permite a un objeto que se está ejecutando en una Máquina Virtual Java realizar llamadas a métodos de otro objeto que está en otra Máquina Virtual Java diferente.

Relación cliente-servidor En la parte del servidor tenemos:

Aplicación 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 aplicación que tenemos que levantar para trabajar co

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 clonáramos y lo dividiéramos en Skeleton.

La representación del objeto (Stub). Esto es lo que se coloca en el servicio de nombres. Registra el stub en el servicio de nombres.

Otra representación del objeto (Skeleton).

Los registramos en el servicio de nombres.

Clase/s sirviente/s: clase que genera unos objetos que utilizará el cliente. Tendrá métodos que podrá usar el cliente y otros que no. Para ello:

Declaramos una interfaz que nos diga los métodos de los objetos de la clase sirviente a los que podemos acceder. La clase sirviente debe implementar este interfaz.

En la parte del cliente:

Aplicación cliente: Queremos trabajar con métodos de objetos que están en el servidor. La aplicación 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 representación del listado de objetos.

Nos traemos “representación” del objeto que encuentra en el servicio de nombres “stub”.

Como funcionamos: 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.

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

Ejemplo

Para uso exclusivo de los alumnos de CETICSA S.L.

El sistema de Invocación Remota de Métodos (RMI) de Java permite a un objeto que se está ejecutando en una Máquina Virtual Java realizar llamadas a métodos de otro objeto que está en otra

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 aplicación que tenemos que levantar para trabajar con ella.

Implementar una clase servidor que:

Crea objetos de la clase que nos interesa (clase sirviente). Cuando creamos estos objetos creamos

El objeto remoto(“Sirviente”). Luego es como si lo clonáramos y lo dividiéramos en

La representación del objeto (Stub). Esto es lo que se coloca en el servicio de nombres. Registra el

Otra representación del objeto (Skeleton).

Los registramos en el servicio de nombres.

e/s: clase que genera unos objetos que utilizará el cliente. Tendrá métodos que podrá usar el cliente y otros que no. Para ello:

Declaramos una interfaz que nos diga los métodos de los objetos de la clase sirviente a los que ente debe implementar este interfaz.

Aplicación cliente: Queremos trabajar con métodos de objetos que están en el servidor. La aplicación 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 representación del listado de objetos.

Nos traemos “representación” del objeto que encuentra en el servicio de nombres “stub”.

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.

stub del cliente se va a comunicar con el Skeleton del servidor. El skeleton se comunica con el

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

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

71

El sistema de Invocación Remota de Métodos (RMI) de Java permite a un objeto que se está ejecutando en una Máquina Virtual Java realizar llamadas a métodos de otro objeto que está en otra

Listado de objetos, esto es lo que llamamos “Servicio de nombres” en JAVA se llama RMI registry

Crea objetos de la clase que nos interesa (clase sirviente). Cuando creamos estos objetos creamos

El objeto remoto(“Sirviente”). Luego es como si lo clonáramos y lo dividiéramos en dos Stub y

La representación del objeto (Stub). Esto es lo que se coloca en el servicio de nombres. Registra el

e/s: clase que genera unos objetos que utilizará el cliente. Tendrá métodos que

Declaramos una interfaz que nos diga los métodos de los objetos de la clase sirviente a los que

Aplicación cliente: Queremos trabajar con métodos de objetos que están en el servidor. La aplicación 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

Nos traemos “representación” del objeto que encuentra en el servicio de nombres “stub”.

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

stub del cliente se va a comunicar con el Skeleton del servidor. El skeleton se comunica con el

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

Page 171: JavaModulo2 _2

©

Hacer una aplicación que devuelve el cuadrado de método del servidor y devuelve el cuadrado del factorial de un número. El cuadrado y el factorial lo hacemos en dos métodos. En el interface solo ponemos el cuadrado. Desde el cliente solo podremos llamar al método cuadrado. Cuadrado llamara al factorial. De momento desde el cliente no pasamos parámetro.

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 objetosElSirvienteImplementaLaInterface n = new ElSirvienteImplementaLaInt System.out.println("Escribiendo en el servicio de nombres");//Le digo que escriba en el servicio de nombres, para hacer referencia a ello pongo NamingNaming.rebind("Numero",n); //Número 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()); }

Para uso exclusivo de los alumnos de CETICSA S.L.

Hacer una aplicación que devuelve el cuadrado de el factorial de un numero. Un cliente llama a un método del servidor y devuelve el cuadrado del factorial de un número. El cuadrado y el factorial lo hacemos en dos métodos. En el interface solo ponemos el cuadrado. Desde el cliente solo podremos

método cuadrado. Cuadrado llamara al factorial. De momento desde el cliente no pasamos

public static void main(String args[]){

LaInterface inter = (LaInterface) Naming.lookup(url+"Numero");

System.out.println(inter.cuadrado());

System.out.println(e.toString());

public static void main(String args[]){

System.out.println("Implementando la clase servidor");

//La clase ProductImpl es la que implementara los objetos ElSirvienteImplementaLaInterface n = new 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 NamingNaming.rebind("Numero",n); //Número es una manera de identificar a 5.Desde el _

llamaremos a Numero ,que es como se reconoce al objeto 5

System.out.println("Esperando las llamadas del cliente");

System.out.println(e.toString());

www.ceticsa.es

Para uso exclusivo de los alumnos de CETICSA S.L.

Página1

72

el factorial de un numero. Un cliente llama a un método del servidor y devuelve el cuadrado del factorial de un número. El cuadrado y el factorial lo hacemos en dos métodos. En el interface solo ponemos el cuadrado. Desde el cliente solo podremos

método cuadrado. Cuadrado llamara al factorial. De momento desde el cliente no pasamos

erface (5);

//Le digo que escriba en el servicio de nombres, para hacer referencia a ello pongo Naming Naming.rebind("Numero",n); //Número es una manera de identificar a 5.Desde el _

Page 172: JavaModulo2 _2

©

} }

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 interfacepublic class ElSirvienteImplementaLaInterface UnicastRemoteObject implements LaInterface{ int valor; //Número 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; } }

Para uso exclusivo de los alumnos de CETICSA S.L.

extends Remote{

String cuadrado()throws RemoteException;

ElSirvienteImplementaLaInterface.java

//Tiene que heredar de eso e implementar nuestro interface public class ElSirvienteImplementaLaInterface extends _ UnicastRemoteObject implements LaInterface{

int valor; //Número de el que calculo el !^2 public ElSirvienteImplementaLaInterface (int n) _

System.out.println("Estoy en _ ElSirvienteImplementaLaInterface");

----------------------------------------- public String cuadrado() throws RemoteException{

int x= factorial(valor);

return "EL FACTORIAL AL CUADRADO DE _

------------------------------------------ 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.

Página1

73