Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PDF M2 Java PDF
PDF M2 Java PDF
Lenguaje de
Programación JAVA
Profesional en
Plataforma
JAVA
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Contenido
Introducción y Objetivos ........................................................................................................ 1
Introducción ........................................................................................................................................................... 1
Objetivo .................................................................................................................................................................. 1
Unidad 1. Introducción .......................................................................................................... 2
Arquitectura de Java ............................................................................................................................................... 2
Introducción ........................................................................................................................................................... 2
La máquina virtual Java (JVM) ................................................................................................................................ 2
El Garbage collection .............................................................................................................................................. 3
Seguridad del código .............................................................................................................................................. 3
Características de Java............................................................................................................................................ 4
Desarrollo con Java................................................................................................................................................. 5
Unidad 2. Programación Orientada a Objetos ........................................................................... 8
Introducción ........................................................................................................................................................... 8
Clases ..................................................................................................................................................................... 9
Tipos de clases ...................................................................................................................................................... 11
Variables de instancia ........................................................................................................................................... 12
Variables estáticas ................................................................................................................................................ 12
Variables finales ................................................................................................................................................... 13
Métodos de clase ................................................................................................................................................. 13
Sobrecarga de métodos o polimorfismo .............................................................................................................. 14
Unidad 3 . Identificadores, palabras clave y tipos .................................................................... 15
Introducción ......................................................................................................................................................... 15
Utilizar comentarios en el código fuente .............................................................................................................. 15
Identificadores ..................................................................................................................................................... 15
Tipos de datos ...................................................................................................................................................... 17
Variables ............................................................................................................................................................... 18
Operadores........................................................................................................................................................... 18
Laboratorio 1: Definiendo tipos de datos ............................................................................................................. 22
Laboratorio 2: Definiendo tipos de datos II .......................................................................................................... 22
Laboratorio 3: Definiendo tipos de datos III ......................................................................................................... 23
Unidad 4. Expresiones y control de flujo ................................................................................. 24
Introducción ......................................................................................................................................................... 24
if-else .................................................................................................................................................................... 24
switch-case ........................................................................................................................................................... 25
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
for ......................................................................................................................................................................... 26
while ..................................................................................................................................................................... 26
do-while ............................................................................................................................................................... 27
CONTINUE ............................................................................................................................................................ 29
BREAK ................................................................................................................................................................... 29
return ................................................................................................................................................................... 29
Laboratorio: Uso del bucle While ......................................................................................................................... 30
Unidad 5. Arrays ................................................................................................................ 31
Introducción ......................................................................................................................................................... 31
Creación de un array ............................................................................................................................................ 31
Unidad 6. Diseño de clases ................................................................................................... 34
Introducción ......................................................................................................................................................... 34
Variables y métodos en las subclases ................................................................................................................... 36
Clases y Métodos finales ...................................................................................................................................... 36
Clases abstractas .................................................................................................................................................. 36
Paquetes............................................................................................................................................................... 37
Interfaces ............................................................................................................................................................. 38
Unidad 7. Características Avanzadas de Clases ........................................................................ 39
Introducción ......................................................................................................................................................... 39
this y super ........................................................................................................................................................... 39
Destrucción de objetos ......................................................................................................................................... 40
Crear y usar tipos enumerados ........................................................................................................................... 41
Importaciones estáticas ....................................................................................................................................... 41
Laboratorio: Clase Objeto cadena ........................................................................................................................ 42
Unidad 8. Excepciones y aserciones ....................................................................................... 45
Introducción ......................................................................................................................................................... 45
try-catch-finally .................................................................................................................................................... 45
ASERCIONES ......................................................................................................................................................... 47
Unidad 9. API Colecciones y genéricos ................................................................................... 49
Introducción ......................................................................................................................................................... 49
Colecciones........................................................................................................................................................... 49
Genéricos ............................................................................................................................................................. 55
Unidad 10. Principios básicos de E/S ...................................................................................... 58
Introducción ......................................................................................................................................................... 58
Argumentos de la línea de comandos .................................................................................................................. 58
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Propiedades del Sistema ...................................................................................................................................... 58
Ficheros ................................................................................................................................................................ 61
Laboratorio: Uso de la clase File ........................................................................................................................... 63
Laboratorio: Uso de las clases FileOutputStream y FileInputStream .................................................................... 67
Unidad 11. E/S de consola y E/S de archivos .......................................................................... 83
Introducción ......................................................................................................................................................... 83
System.in .............................................................................................................................................................. 84
System.out ........................................................................................................................................................... 85
System.err ............................................................................................................................................................ 85
Unidad 12. Creación de interfaces gráficas con el API Swing ..................................................... 87
Introducción ......................................................................................................................................................... 87
Programación gráfica con Swing .......................................................................................................................... 88
Ejemplos con algunas de las clases de Swing ....................................................................................................... 90
Laboratorio: Manejo de los cuadros de diálogo ................................................................................................... 96
Unidad 13. Control de eventos generados por la interfaz gráfica ............................................... 102
Introducción ....................................................................................................................................................... 102
Modelo nuevo de delegación. (Source, Listener, Adapter). ............................................................................... 102
Ejemplos con eventos ......................................................................................................................................... 104
Clase SwingWorker ............................................................................................................................................. 105
Laboratorio 1: Movimiento entre frames ........................................................................................................... 106
Laboratorio 2: Cargador de imágenes ................................................................................................................ 109
Unidad 14. Aplicaciones basadas en la interfaz gráfica ........................................................... 112
Introducción ....................................................................................................................................................... 112
Creación de un menú ......................................................................................................................................... 112
Creación de un Toolbar ...................................................................................................................................... 114
JPopupMenu ...................................................................................................................................................... 115
Unidad 15 . Hilos ................................................................................................................ 118
Introducción ....................................................................................................................................................... 118
Ciclo de vida de un thread .................................................................................................................................. 118
Primer ejemplo de hilos ..................................................................................................................................... 119
Métodos de la clase Thread ............................................................................................................................... 121
resume() ............................................................................................................................................................. 121
getPriority() ........................................................................................................................................................ 122
setPriority( int ) .................................................................................................................................................. 122
getName() .......................................................................................................................................................... 122
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
setName( String ) ................................................................................................................................................ 122
Uso de Wait y Notify........................................................................................................................................... 122
Sincronización .................................................................................................................................................... 126
Unidad 16. Programación en red ......................................................................................... 128
Introducción ....................................................................................................................................................... 128
Clase InetAddress ............................................................................................................................................... 128
Realizar Laboratorio: Uso de la clase InetAddress .............................................................................................. 129
Socket ................................................................................................................................................................. 130
CLASE URL .......................................................................................................................................................... 132
CLASE URLConnetion .......................................................................................................................................... 134
CLASES DatagramPacket y DatagramSocket ....................................................................................................... 135
RMI ..................................................................................................................................................................... 137
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Introducción y Objetivos
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:
Objetivo
El éxito de Java reside en su arquitectura y las características que esta arquitectura le confiere, lo
cual veremos en el desarrollo del módulo.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, 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:
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.
Arquitectura de Java
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.
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
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.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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.
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"),
el programa o el entorno de ejecución debería liberar esa memoria.
- 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
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.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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 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
realiza en el momento de la ejecución, el intérprete de java añade protección contra acceso no
autorizado 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 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
bytecode.
Características de Java
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 del programa, y lanza excepciones
que pueden ser recogidas por el programador con el propósito de recuperarse de dichos errores.
Seguro
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, ...).
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
- 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 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.
Java construye sus interfaces de usuario a través de un sistema abstracto de ventanas de forma que
éstas puedan ser implantadas en entornos UNIX, Mac o Pc.
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.
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.
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 Descripción
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
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Elemento Descripción
código del programa.
Objetos - 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.
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 seguir unas reglas.
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
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 manera sencilla los datos de
la 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 otros que no lo necesitan (javascript).
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.
Sentencias de control
Sin embargo, la característica que confiere al ordenador su potencia es la capacidad de
procesamiento de la que dispone.
Aunque esto nos pueda asustar, el tipo de procesamiento que puede realizar es muy básico,
limitándose a:
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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.
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 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
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 programa, con
java 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.
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las
actividades que encontrará en la unidad correspondiente de la plataforma eLearning”.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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 describimos a continuación:
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
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 1-1-1970 a las 00:00:00 hasta este
momento. Conocido el origen de coordenadas y los milisegundos que han transcurrido, se puede
obtener mediante la 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.
Usuario. Simplemente visualizará la hora del sistema tal y como el programador haya realizado la
representación en la aplicación.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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
ofrezcan:
Clases
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
y las órdenes se generan mediante eventos.
En los lenguaje orientados a objetos, la estructura se realiza tomando como referencia los datos.
Cada una de esas partes se denomina objeto.
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,...
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");
System.out.println("3.- Parar");
System.out.println("4.- Salir del coche");
System.out.println("");
System.out.println("Introduzca una opción");
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
}
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 acelerar más");
}
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();
if(estado==false){
else if(velocidad!=0){
else {
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
public static void main(String args[])throws IOException{
menu();
do{
opcion=i.readLine();
try{
switch(Integer.parseInt(opcion)){
case 1: montar();
break;
case 2: comenzar();
break;
case 3:parar();
break;
}
}
catch( NumberFormatException e){
}while (true);
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.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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.
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.
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 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,
basta con usar:
Nombredeclase.nombredevariableestática
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:
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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ática, se crean constantes de clase.
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:
Coche.VMAXIMA=180;
System.out.prinln(Coche.VMAXIMA);
}
Métodos de clase
Los métodos son funciones que pueden ser llamados dentro de la clase o por otras clases.
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.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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.
public void Metodo1(double edad, double año, double mes) //Sobrecarga con tres
parámetros
{
System.out.print(“Metodo con tres Argumentos:”);
System.out.println(“ edad= “ +edad+ “ año= “ + año + “ mes= “ + mes
);
}
}
class Prueba{
}
}
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las
actividades que encontrará en la unidad correspondiente de la plataforma eLearning”.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Unidad 3 . Identificadores, palabras clave y
tipos
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 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
respetar a la hora de confeccionar los programas y una semántica encargada de resolver el
problema que queremos programar.
Sintaxis.
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 Descripción
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 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.
etc. - Conforme avancemos iremos conociendo más elementos de los lenguajes de
programación.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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
identificador:
Primer carácter Una letra, subrayado ( _ ) o el símbolo de dólar ($).
Palabras reservadas
En la siguiente tabla tenemos las palabras claves proporcionadas por la documentación de SUN.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Constantes - En mayúsculas.
- Si se usan varias palabras se aconseja separarlas mediante el símbolo de
subrayado.
Tipos de datos
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.
La siguiente tabla lista los tipos de datos primitivos soportados por Java, sus tamaños y su formato.
(enteros)
(reales en coma
flotante)
(Texto)
(Lógicos)
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Variables
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 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
valores que guardan son los mismos para todos los objetos de una determinada clase. En el
siguiente ejemplo, VMAXIMA es una variable de clase y Vactual es una variable de instancia.
VMAXIMA guarda el mismo valor para todos los objetos de la clase Coches, pero la Velocidad actual
de cada coche puede ser diferente
class Coches{
static final int VMAXIMA=120;
int Vactual;
//...
}
Variables locales: Se utilizan dentro de los métodos. En el siguiente ejemplo Vactual es una variable
local al método mostrarVelocidad 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
encuentra.
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
Aritméticos (Suma, resta, multiplicación, división, resto, incremento y decremento).
En la siguiente tabla tenemos las operaciones aritméticas que podemos realizar entre dos
operadores.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
El operador + también se utiliza para concatenar cadenas (strings).
En la siguiente tabla tenemos las operaciones aritméticas sobre un solo operando.
Operadores relacionales
Operadores condicionales
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Operadores a nivel de bit
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
realizan diferentes desplazamientos sobre uno de los datos.
public class EjemploOperadores2
{
public static void main(String args[])
{
byte b1=127;
byte b2=1;
int i=3;
System.out.println("El valor de "+b1+"&"+b2+" es "+(b1&b2),20,50);
System.out.println("El valor de "+b1+"|"+b2+" es "+(b1|b2),20,70);
System.out.println("El valor de "+b1+"^"+b2+" es "+(b1^b2),20,90);
System.out.println("El valor de ~"+b1+" es "+(~b1),20,110);
System.out.println("El valor de "+b1+"<<"+i+" es "+(b1<<i),20,130);
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.
Modificar el código para que salga bien.
int i=15;
int k=1;
int s=320;
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
System.out.println(""+((i>>j)&k),(20+s),50);
s=s-10;
}
}
}
Operadores de asignación
Una forma de ahorrar tiempo a la hora de escribir expresiones pero que muchas veces lían las cosas
innecesariamente.
Si la expresión devuelve como resultado true entonces se ejecuta la sentencia 1, en caso contrario,
se ejecuta la sentencia 2.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Ver Video: Casting o Conversión entre tipos de datos, en la
Unidad 3,en el Módulo 2, en la plataforma elearning
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
{
Objetivo
Comprender el funcionamiento de los tipos primitivos de java.
Enunciado
Imprimir el ascii de los 256 primeros caracteres.
Solución
System.out.println("Decimal\t\t\t\tCaracter");
System.out.println("-------------------------------------");
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
System.out.println(" "+i+" \t\t\t\t "+(char)i);
}
}
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
boolean b1=true;
boolean b2=false;
if(b1){
System.out.println("b1 es "+b1);
if(!b2){
System.out.println("b2 es "+b2);
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las
actividades que encontrará en la unidad correspondiente de la plataforma eLearning.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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 Sentencias
if-else
Su sintaxis es la siguiente:
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
switch-case
Se utiliza cuando se quieren analizar muchas posibilidades de una única variable o expresión.
Su sintaxis es la siguiente:
switch (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
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-case
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
for
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
...
}
}
}
while
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 el bucle de lo contrario nunca se dejará
de cumplir la condición.
Se puede realizar un bucle infinito pero se debe incluir la salida dentro del bucle.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Ejercicio: Recoger un número por teclado e imprimir todos sus divisores
import java.io.*;
String numero;
numero=teclado.readLine();
int num=Integer.parseInt(numero);
int i=Integer.parseInt(numero);
while(i>0){
if (num%i==0){
--i;
}
}
}
do-while
Igual que el while, pero las sentencias se ejecutan al menos una vez antes de valorar las expresión.
Su sintaxis:
do {
...
sentencias;
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
...
} while (Expresión_booleana);
import java.io.*;
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){
--i;
}
letra=teclado.readLine();
System.out.println(letra);
}while (letra.equals("s"));
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
}
}
CONTINUE
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
BREAK
Permite salir del bucle aunque la condición de permanencia todavía se cumpla.
Ejemplo
return
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.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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;
}
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 {
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las
actividades que encontrará en la unidad correspondiente de la plataforma eLearning”.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Unidad 5. Arrays
Introducción
Los elementos que puede contener un array pueden ser datos de tipos primitivos u objetos.
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
array y el tipo de datos que se va a almacenar en él.
enteros[i]=i;
}
System.out.println(saludos[0]);
System.out.print(enteros[i]);
System.out.println("");
System.out.print("Las vocales son: ");
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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.
enteros[10]=10;
enteros[i]=i;
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
}
System.out.println(saludos[0]);
System.out.print(enteros[i]);
System.out.println("");
System.out.print("Las vocales son: ");
System.out.print(vocales[i]);
}
System.out.println("");
System.out.println(saludos[1]);
}
}
Se puede observar el efecto de intentar acceder a elementos fuera de los límites de un array.
Todos los arrays en Java tienen una función miembro: length(), que se puede utilizar para conocer
la longitud del array.
int valores[][] = new int[5][2];
valores.length;
Nos dará 5
valores [0].length;
Nos dará 2
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las
actividades que encontrará en la unidad correspondiente de la plataforma eLearning”.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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.
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
construir 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.
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.
Declaración
class facturar {
int total, importe;
facturar () { total=0; importe=0; } // el constructor
}
Varios constructores
class facturar {
int total, importe;
facturar () { total=0; importe=0; } // el constructor
facturar (String cliente) { total=0; importe=0; }
}
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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 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
respondan a las necesidades de cada tipo de empleado. La profundidad en la jerarquía de clases no
tiene límite.
Empleado()
{
}
Empleado(String nombre){
this.nombre = nombre;
}
public String getNombre()
{
return this.nombre;
}
public void setNombre(String nombre)
{
this.nombre = nombre;
}
}
this.apellido = apellido;
}
public String getNombre() {
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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());
}}
Sin embargo, las subclases no están limitadas al estado y comportamiento de la superclases. Las
subclases pueden añadir variables y métodos que las diferenciaran de las otras subclases.
Además, 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 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
los argumentos de entrada.
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.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Paquetes
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 relacionados
que proporcionan protección en el acceso y gestión de nombres.
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
Sintaxis
Para decirle al compilador que una clase o un interface pertenece a un paquete en concreto, basta
con indicarlo al comienzo mediante la sentencia package.
package Empleados
En este ejemplo agrupamos las clases empleado y programador en un paquete llamado empleados.
package empleado;
public class Empleado { …..
}
package empleado;
public class Programador extends Empleado{ ……
}
Modificadores de acceso
Método Propiedad Clase
- Para poder invocar al - Cada objeto creado de
de instancia (no
método es necesario crear una clase tiene su propia - No tiene sentido.
static).
objeto. copia de la propiedad.
- Todos los objetos
- Se puede invocar al creados a partir de la
static método a través del nombre clase comparten las - No se puede usar.
de la clase. propiedades declaradas
así.
- El método puede ser sobre - Se puede extender
- La variable puede
no final escrito en el proceso de por herencia dicha
modificar su valor.
herencia. clase.
- El método no puede ser - La variable es una - La clase no se puede
final sobrescrito en el proceso de constante y su valor no extender más por
herencia. puede ser modificado. herencia.
- El acceso al método sólo - El acceso a la variable
private se puede realizar desde la sólo se puede realizar - No se puede usar.
propia clase. desde la propia clase.
- El acceso al método sólo - El acceso a la propiedad
se puede realizar desde las sólo se puede realizar
protected - No se puede usar.
clases que se encuentren en desde las clases que se
el paquete. encuentre en el paquete.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
- El acceso al método se - El acceso a la propiedad
puede realizar desde se puede realizar desde
cualquier otra clase cualquier otra clase - El que debe aplicarse
public
independientemente del independientemente del sobre la clase.
paquete en el que se paquete en el que se
encuentre. encuentre.
- Este método no tiene - Se aplica sobre las
cuerpo y deberá ser clases que tienen
abstract - No está permitido.
implementado en las alguno de sus
subclases. miembros abstractos.
Interfaces
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 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
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 métodos que queremos que se implementen.
interface InterfazCoche{
public void montar();
public void comenzar();
public void bajar();
public int verVMaxima();
public void cambiarVMaxima(int VMAXIMA);
public void bajar();
public void usar() throws IOException;
public 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:
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las
actividades que encontrará en la unidad correspondiente de la plataforma eLearning”.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Unidad 7. Características Avanzadas de
Clases
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.
this y super
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 un objeto del tipo de
una 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 constructor.
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;
}
}
void asignarValor() {
edad = 5;
super.asignarValor();
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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());
}
}
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
liberar.
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 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
programa.
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
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
}
}
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.
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;
System.out.println("La posicion es: " + actual );
}
}
Importaciones estáticas
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: nombre, edad y
posición.
package ejemplos;
class Jugador{
public static String nombre = "Casillas";
public static int edad= 29;
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
public static String posicion= "PORTERO";
}
Ahora crearemos una clase llamada impresión que nos permita acceder a los miembros estáticos de
esta clase.
import static ejemplos.Jugador.*;
public class Impresion{
public Impresion(){
nombre+=" ,Iker";
System.out.println(nombre);
}
Objetivos:
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.*;
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
System.out.println(c.convertirMayusculas());
System.out.println(c.convertirMinusculas());
}
}
CLASE CADENAOBJETO
import java.lang.*;
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
return false;
}
}
}
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las
actividades que encontrará en la unidad correspondiente de la plataforma eLearning”.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Unidad 8. Excepciones y aserciones
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.
try-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.
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ón
No tratando la excepción
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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 del paquete java.lang, serán avisadas por el compilador
Podemos crear una clase en Java que lance la excepción creada por el programador.
try{
do{
System.out.println("Introduzca un numero:");
numero=teclado.readLine();
int num=Integer.parseInt(numero);
if (num%2==0){
System.out.println("El numero: "+ num +" es par");
}else{
System.out.println("El numero: "+ num +" es impar");
}
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
continua= teclado.readLine();
}
}
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
de tener que estar trazando marcha atrás las causas que han llevado a un fallo.
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:
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:
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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);
}
}
Resultado:
CON ERROR:
public class EjemploAserciones {
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:
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las
actividades que encontrará en la unidad correspondiente de la plataforma eLearning”.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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.
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.
Colecciones
En Java las principales interfaces que disponemos para trabajar con colecciones son: Collection, Set,
List, Queue y Map.
Collection. Un grupo de elementos individuales, frecuentemente con alguna regla aplicada a ellos.
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 peso ligero.
Los iteradores separan a los algoritmos del tipo específico de contenedor con el cual un algoritmo
puede trabajar.
Collection
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.
import java.util.*;
public class EjemploColecciones {
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Collection<String> col2 = Arrays.asList("valor1", "valor2");
Collection<String> col3 = Collections.singleton("valor3");
// add() y addAll() devuelven true si cambian
// la colección. Importa en conjuntos
if (col1.add("cero"))
System.out.println ("col1 modificada");
if (col1.addAll(col2))
System.out.println ("col1 modificada");
// Copiamos usando un copy constructor
Collection<String> copia = new ArrayList<String>(col1);
col1.remove("cero"); // eliminar un elemento
col1.removeAll(col3); // eliminar los elementos en e de c
col1.retainAll(col2); // elimina de c los que no están en d
col1.clear(); // eliminar todos
boolean b =col1.isEmpty(); // b == true
int s = col1.size(); // s == 0
// Recuperamos en c la copia
b = col1.addAll(copia); // b == true
b = col1.contains("cero"); // b == true
b = col1.containsAll(col2); // b == true;
// Recorremos col1
Iterator<String> iterador = col1.iterator();
while(iterador.hasNext())
System.out.println(iterador.next());
Resultado:
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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 ListIterator.
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
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 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
lista.
Ejemplo de List:
import java.util.*;
public class Main {
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
}
Set
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.
Map
En un mapa se pueden buscar objetos utilizando otro objeto. Tabla que asocia claves a valores. No
utiliza la interfaz Collection.
EJEMPLO:
import java.util.*;
public class Ejemplo
{
public static void main(String args[])
{
// Definir un HashMap
HashMap global = new HashMap();
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.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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.
Otras colecciones
Esto quiere decir, que si queremos que una lista de objetos - o un conjunto - tenga sus elementos
ordenados, y esos objetos son de una clase que hemos hecho, es necesario que nuestra clase
implemente la interfaz java.lang.Comparable.
Un comparador es una clase 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:
int compareTo(Object o)
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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");
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 may/min
}}
Ejemplo: En este ejemplo utilizamos la interface Comparable para comprobar objetos iguales.
Clase Principal
import java.util.*;
System.out.println(ts);
}
}
Clase Persona
import java.util.*;
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
public class Persona implements Comparable {
private String Nombre, apellido;
public Persona(String Nombre, String apellido) {
if (Nombre==null || apellido==null)
throw new NullPointerException();//Comprobar los nulos
this.Nombre = Nombre;
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 argumento
Persona n = (Persona)o;//no es del tipo adecuado o es nulo
return n.Nombre.equals(Nombre) &&
n.apellido.equals(apellido);
}
public int hashCode() {
return 31*Nombre.hashCode() + apellido.hashCode();
}//hashcode tiene en cuenta ambos campos
public String toString() {return Nombre + " " + apellido;}
public int compareTo(Object o) {
Persona n = (Persona)o;//arroja ClassCastException si argumento no
int lastCmp = apellido.compareTo(n.apellido);//es del tipo Name
return (lastCmp!=0 ? lastCmp :
Nombre.compareTo(n.Nombre));
//primero comparamos los apellidos y si son iguales
//los nombres
}
}
Genéricos
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).
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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 subtipo del mismo. (T también puede ser
una 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 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:
Las convenciones de declaración utilizan la letra T para tipos y E para elementos de una colección.
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
nombre de una interface.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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.*;
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las
actividades que encontrará en la unidad correspondiente de la plataforma eLearning”.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Unidad 10. Principios básicos de E/S
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.
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
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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 virtual instalada.
System.out.println(propSO);
}
}
CLASE PROPERTIES
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:
propertyNames ():Returns an enumeration of all the keys in this property list, including distinct keys
in the_
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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.
try {
is=new FileInputStream("c:\\configuracion.properties");
prop.load(is);
} catch(IOException e) {
System.out.println(e.toString());
}
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
}
Ficheros
Dispositivos de soporte magnético que se utilizan para guardar información de forma persistente de
los programas java.
Los flujos son clases de java que proporcionan los mecanismos necesarios para el intercambio de
información entre objetos.
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.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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.
Ficheros secuenciales
CLASE FILE
Se utiliza para manipular ficheros y/o carpetas que pueden o no existir dentro del sistema de
archivos.
Constructores:
– File(String, String): Crea un objeto de la clase que es un fichero. Se encuentra en la ruta que
se indica en el primer argumento y cuyo nombre se pasa como segundo argumento.
– File(File, String): Crea un objeto de la clase que es un fichero. El path se indica en el objeto
File que se pasa en el primer argumento y cuyo nombre se pasa como cadena en el segundo
argumento.
– File(String): Crea un objeto de la clase que es un fichero. La ruta o nombre se pasa como
argumento.
Cuando se crea un objeto de la clase File el fichero no se crea directamente en el sistema, para que
se cree hay dos métodos:
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:\Ejemplos.
- File archivo2 = new File(“C:\\Ejemplos”,”Ejemplo2.txt”)
Crea un fichero llamado ejemplo2 dentro de c:\Ejemplos.
- File archivo3= new File(“C:\\Ejemplos\\Ejemplo2.txt”)
Crea un fichero llamado ejemplo2 dentro de c:\Ejemplos.
- 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 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.
– 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 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.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
– mkdir(): Crear una carpeta. Devuelve true si se puede crear. En el caso de que la carpeta
este dentro de un path absoluto que no exista en el sistema, solo crea la primera carpeta.
– mkdirs(): Crear una carpeta. Devuelve true si se puede crear. En el caso de que la carpeta
este dentro de un path absoluto que no exista en el sistema, se crea de manera completa.
– Ejemplo: Con mkdir C:\Nueva\Ejemplo 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.
Constantes:
– pathSeparator: Devuelve un string indicando el carácter que se utiliza dentro del sistema
para separar cada una de las cadenas de la variable path. En Windows es “;”.
– pathSeparatorChar: Idem del anterior pero lo devuelve como carácter.
– separator: Devuelve un string indicando el carácter que se utiliza dentro del sistema para
establecer 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 subelementos
File carpeta= new File("c:" +separador+ "Trabajos");
//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();
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
public class NumeroFicheros {
//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();
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.
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.
CLASE FILEINPUTSTREAM
Se utiliza para abrir un flujo de lectura en byte asociado a un fichero.
Constructores:
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
FileInputStream(String): Crea un objeto, flujo de lectura en bytes asociado a un fichero.
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 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.
El siguiente ejemplo nos permite abrir un fichero mediante la clase FileOutputStream y escribir en el
fichero llamado Nombres.dat.
import java.io.*;
try{
if(!carpeta.exists()){
carpeta.mkdir();
}
try{
fescritura.write(nombre.getBytes(),0,nombre.length());
System.out.println("SE HA ESCRITO EN EL FICHERO");
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
}finally{
if(fescritura !=null){
try{
fescritura.close();
}catch (IOException ioe){
System.out.println("ERROR GRAVE DE E/S DE DATOS");
}
}
}
}
}
El siguiente ejemplo nos permite abrir un fichero mediante la clase FileInputStream y leer en el
fichero llamado Nombres.dat.
import java.io.*;
public class Leer_fich{
static FileInputStream flectura;
static File archivo;
try{
archivo = new File("Ficheros"+ File.separator + "Nombres.dat");
flectura=new FileInputStream( archivo );
try{
}finally{
if (flectura!=null){
try{
flectura.close();
}catch (IOException ioe){
System.out.println("ERROR GRAVE DE E/S DE DATOS");
}
}
}
}
}
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Laboratorio: Uso de las clases FileOutputStream y
FileInputStream
Objetivo
Aprender a escribir y leer sobre ficheros.
Enunciado
Crear un menú como el que se muestra en la imagen.
----------------------------------------------------
1.- ESCRITURA EN FICHERO
2.- LECTURA EN FICHERO
3.- SALIR
----------------------------------------------------
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
static FileOutputStream fescritura;
static FileInputStream flectura;
do{
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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("----------------------------------------------------
\n");
do{
}while (opc==Integer.MIN_VALUE);
if (opc==1){
if (archivo.exists()){
if (resp.compareToIgnoreCase("S")==0) {
agregar = false;
}else{
agregar = true;
}
}
try{
fescritura = new FileOutputStream
(archivo.getName(),agregar);
fescritura.write(matriz,0,matriz.length);
}catch (IOException e){
System.out.println("No se ha podido escribir la
información en el fichero "+ _
archivo.getName());
}finally{
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
try{
if(fescritura!=null){
fescritura.close();
}
}catch(IOException e){
System.out.println("No se ha podido cerrar
correctamente _
el flujo de escritura asociado al fichero "+ archivo.getName());
}
}
try{
flectura= new FileInputStream(archivo);
int leidos = flectura.read(matriz,0,matriz.length);
System.out.println("\nEL CONTENIDO DEL FICHERO "+_
archivo.getName()+"\n es: \n");
System.out.println(new String(matriz,0,leidos));
CLASE FILEWRITER
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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 lo crea automáticamente y en el
caso de que exista lo sobrescribe.
– FileWriter (String, boolean): Crea un objeto que permite escribir en el fichero cuyo nombre
y/o path se pasa en el argumento. En el caso de que el fichero no exista lo crea
automáticamente y en el 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.
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 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 van a escribir.
CLASE DATAOUTPUTSTREAM
Se utiliza para crear flujos de escritura que permiten manejar los tipos primitivos de java y la clase
String.
Constructor:
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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 pasa como
argumento.
– 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.
– 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.
import java.io.*;
String respuesta="";
System.out.println("INTRODUCE EL FICHERO DE CLAVES POR TECLADO") ;
try{
String nombrefich= new BufferedReader (new InputStreamReader
(System.in))._
readLine().trim();
archivo= new File (nombrefich) ;
if (archivo.exists()){
System.out.println ("EL FICHERO YA EXISTE ¿DESEA
SBOREESCRIBIR (SI/NO)?");
respuesta= new BufferedReader (new InputStreamReader
(System.in)).readLine().trim();
}
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
System.out.println ("INTRODUCE EL NOMBRE DE USUARIO POR
TECLADO: ");
String nombre= new BufferedReader (new InputStreamReader
(System.in)).readLine().trim();
flujoescritura.writeInt(codigo);
flujoescritura.writeUTF(nombre);
}
}
}
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:
Métodos:
writeUTFreadUTF
write...read....
...................
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
El siguiente ejemplo nos permite escribir con la clase DataInputStream.
import java.io.*;
try{
archivo= new File (new BufferedReader (new InputStreamReader
(System.in))._
readLine().trim());
}
}
}
CLASE OBJECTOUTPUTSTREAM
Flujo que se utiliza para poder escribir objetos de cualquier clase java a cualquier otro objeto.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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.
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
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 mismos de guardar la
informació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 flujo.
En 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 obligatoriamente en un paquete. Estas clases no pueden estar en el mismo
fichero 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.
Métodos:
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.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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
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 serializada.
package Utilidades;
public Persona(){}
m_nombre = a ;
m_apellidos = b;
m_telefono = c ;
m_email = d;
}
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;
public static void main (String[] args){
carpeta= new File ("Clientes");
if (!carpeta.exists()){
carpeta.mkdir();
}
archivo = new File (carpeta, "Correos.txt");
try{
flujoescritura = new ObjectOutputStream ( new FileOutputStream (archivo));
flujoescritura.writeObject( new Persona ("Pepe", "Salas Pérez",
"919622314","pepeSalas@yahoo.es"));
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 "+
archivo);
}finally{
try {
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
if (flujoescritura!=null){
flujoescritura.close();
}
}catch(IOException e){
System.out.println("NO SE HA PODIDO CERRAR
CORRECTAMENTE _
EL FLUJO ASOCIADO AL FICHERO "+ archivo);
}
}
}
}
try{
flujolectura = new ObjectInputStream (new FileInputStream
(archivo));
}catch(ClassNotFoundException e){
System.out.println("NO SE HA PODIDO CONVERTIR LA
INFORMACION");
}catch(IOException e){
System.out.println("NO SE HA PODIDO LEER LA INFORMACION
DEL FICHERO");
}finally{
try{
if(flujolectura!=null){
flujolectura.close();
}
}catch(IOException e){
System.out.println("NO SE HA PODIDO CERRAR CORECTAMENTE
_
EL FLUJO ASOCIADO AL FICHERO");
}
}
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
}
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
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 ("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
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;
//---------------------------------------------------------------
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){
try{
System.out.println("----------------------------------------------------
----");
System.out.print(s);
return (new BufferedReader (new InputStreamReader
(System.in)))._
readLine().trim();
}catch (IOException ioe){
System.out.println("\nError interno en sistema de
entrada/salida\n");
}
return "";
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
//---------------------------------------------------------------
try{
String aux="";
do{
aux=Datos("Introduce nombre: ");
if (aux.length()>=NOMBRE_MAX){
System.out.println("\nNombre demasiado largo\n");
System.out.println("------------------------------------------
--------------");
}
}while(aux.length()>=NOMBRE_MAX);
nota.writeUTF(aux);
do{
aux=Datos("Introduce modulo: ");
if (aux.length()>=MODULO_MAX){
System.out.println("\nNombre de modulo demasiado
largo");
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(IOException ioe){
System.out.print("\nError "+ioe.toString());
}
}
//---------------------------------------------------------------
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
public static void listadoCompleto(){
if (NumRegistros()!=0){
System.out.println("\n\t LISTADO COMPLETO\n----------------------------------
-----------");
System.out.println("\n---------------------------------------------");
try{
}
}else{
System.out.println("\nNo hay registros introducidos");
}
//---------------------------------------------------------------
try{
if
(aux.compareToIgnoreCase(nota.readUTF())==0){
nota.seek(i* TAM_MAX);
System.out.println("\n------------------------
---------------------");
System.out.println("Nombre: "+
nota.readUTF());
System.out.println("Modulo: "+
nota.readUTF());
System.out.println("Nota: "+
nota.readInt());
esta=true;
}
}
if (esta==false){
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
System.out.println("\nEse alumno no se encuentra");
}
}catch (IOException ioe){
System.out.println("\nError "+ioe.toString());
}
}else{
System.out.println("No hay datos en el fichero");
}
}
//---------------------------------------------------------------
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{
if
(aux.compareToIgnoreCase(nota.readUTF())==0){
if
(aux2.compareToIgnoreCase(nota.readUTF())==0){
nota.seek(i* TAM_MAX);
System.out.println("Nombre: "+
nota.readUTF());
System.out.println("Modulo: "+
nota.readUTF());
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());
}
}else{
System.out.println("No hay datos en el fichero");
}
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
//---------------------------------------------------------------
try{
return (int)Math.ceil ((double)nota.length()/ (double)TAM_MAX);
}catch (IOException e){
System.out.println("ERROR GRAVE DE ENTRADA/SALIDA");
return 0;
}
}
//---------------------------------------------------------------
try{
nota=new RandomAccessFile ("notas.txt","rw");
fin:do{
Listar(menu1);
opcion = Datos("Introduce una opcion: ");
try{
switch (Integer.parseInt(opcion)){
case 1: meterNotaEnFichero();
break;
case 2: listadoCompleto();
break;
case 3: notasDe1Alumno();
break;
case 4: modificarNota();
break;
default: System.out.println("Opcion
erronea");
}
}catch (NumberFormatException e){
System.out.println("La opcion tiene que ser un numero");
}
}while(true);
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
}catch (IOException ioe){
System.out.print("\nError "+ioe.toString());
}finally{
try{
if (nota!=null){
nota.close();
}
}catch (IOException ioe){
System.out.print("\nError "+ioe.toString());
}
}
}
}
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las
actividades que encontrará en la unidad correspondiente de la plataforma eLearning”.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Unidad 11. E/S de consola y E/S de 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, 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 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.
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
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.
¿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 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
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.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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
o como quieras llamarla.
String texto = br.readLine();
Objetivos
Conocer los objetos que implementan la salida estándar en java
Trabajar con la E/S de datos por consola y archivos
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
realizarán mediante wrapping de clases. Es decir, sobre la consola, montamos un
InputStreamReader, y sobre este un BufferedReader.
Ejemplo:
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
Métodos más impotantes:
skip(n): Ignora los n caracteres siguientes de la entrada.
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.
import java.io.*;
public class Ejemplo {
System.out.println("Introduzca número:");
numero=teclado.readLine();
int num=Integer.parseInt(numero);
int dato=Integer.parseInt(numero);
if (dato%2==0){
else{
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
}
}
Introduzca número:
5
El dato 5 es impar
System.out
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.
import java.util.*;
public class EjPrint
{
public static void main(String [] params)
{
float valor = 10.23f;
System.err
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.*;
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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ón
El dato 3 es impar
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las
actividades que encontrará en la unidad correspondiente de la plataforma eLearning”.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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.
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).
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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
tarjeta.
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 su trabajo con el
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
izquierda, la coordenada x 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.
- Coordenadas 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).
- Coordenadas relativas: Cualquier elemento que se coloque sobre la pantalla tendrá su
propio sistema de coordenadas, es decir, la coordenada de su esquina superior izquierda será
la (0,0). El compilador del lenguaje será el encargado de realizar la transformación de
coordenadas.
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 que ocupará un pixel
alrededor del componente, haría que la coordenada de la esquina superior izquierda pasase de ser
(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.
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.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
- 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.
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:
Sumario de clases del paquete javax.swing
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 ventana.
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 java.awt.Frame que añade funcionalidades
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, redimensionado, título y barra de menú.
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 crearse objetos.
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 -- 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
la lista.
JList Un componente que permite al usuario seleccionar uno o más objetos
de una lista.
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 textarea.
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 gráficamente un
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Sumario de clases del paquete javax.swing
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 barra de herramientas.
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 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.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
Container cont;
//------------------------------------------------
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
public static void main (String args[]){
new EjSwing();
}
//------------------------------------------------
public EjSwing(){
cont = getContentPane();
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);
}
}
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
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");_
setLayout(new BorderLayout());
for (i=0;i<botones.length;i++)
{
botones[i]=new Button("Boton " +(i+1));
}
btn_agregar.addActionListener(new ActionListener()_
{
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)
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
{
if (contador > 0)
{
contador--;_
p_central.remove(contador);
validate();
}
}
});
btn_eliminar_todos.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
p_central.removeAll();
contador=0;
validate();
}
});
p_sur.add(btn_agregar);
p_sur.add(btn_eliminar);
p_sur.add(btn_eliminar_todos);
add(p_central, BorderLayout.CENTER);
add(p_sur, BorderLayout.SOUTH);
setSize(300,300);
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;
DefaultTreeModel modelo;
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);
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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()
{
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()._
getLastPathComponent());
padre=(DefaultMutableTreeNode)nodo.getParent();
//padre.remove(nodo);
nodo.removeFromParent();
//padre.setUserObject((Object)(txt.getText()));
modelo.reload();
}
});
btnmod.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
DefaultMutableTreeNode nodo;
nodo=(DefaultMutableTreeNode)(arbol.getSelectionPath()._
getLastPathComponent());
nodo.setUserObject((Object)(txt.getText()));
modelo.reload();
}
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
});
btnsel.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
lbl.setText("NODO..." +arbol.getSelectionPath()._
getLastPathComponent());
}
});
setSize(500, 500);
setVisible(true);
}
jugador=new DefaultMutableTreeNode("Pepe");
equipo.add(jugador);
jugador=new DefaultMutableTreeNode("Yumio");
equipo.add(jugador);
equipo=new DefaultMutableTreeNode("Sevilla");
raiz.add(equipo);
jugador=new DefaultMutableTreeNode("Yahiza");
equipo.add(jugador);
}
Enunciado
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
- 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.
Dialogo…..
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Archivo…
import javax.swing.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
btncerrar.addActionListener(new ActionListener() {
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
});
ventana.setSize(200, 200);
ventana.setLocation(100, 100);
ventana.setVisible(true);
}
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
if (respuesta == JFileChooser._
APPROVE_OPTION)
{
this.lblmsj.setText("Archivo Guardado " + fd.getSelectedFile());
} else
{
this.lblmsj.setText("Acción CANCELADA");
}
}
}
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);
}
}
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
}
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las
actividades que encontrará en la unidad correspondiente de la plataforma eLearning”.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Unidad 13. Control de eventos generados por
la interfaz gráfica
Introducción
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
que se hayan registrado para recibir este tipo de eventos. Para
registrar un listener se usa el método addComponentListener sobre el
objeto sobre 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 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
objeto de él.
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.
ContainerEvent (hereda
Caben destacar:
de ComponentEvent)
- 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, ...)
WindowEvent (hereda de El evento es pasado a cada WindowListener o WindowAdapter que se
ComponentEvent). 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.
InputEvent (hereda de Sus dos fuentes de eventos hijas son: KeyEvent (para eventos
ComponentEvent). 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.
- 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.
MouseEvent
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 eventos en vez
de usar los de bajo nivel.
El protocolo para implementar correctamente este evento es mediante
ActionEvent
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
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public EjSwing()
{
setLayout(new BorderLayout (20,20));
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
add(boton2,"South");
boton3= new Button("Amarillo");
//------------------
boton3.addActionListener( new ActionListener(){
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.
El objetivo de esta clase es la de implementar en un hilo/thread separado, cualquier funcionalidad
que pudiera requerir mucho consumo de tiempo.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Definiendo un SwingWorker
En el siguiente ejemplo veremos una forma de poder haber background sobre un componente.
_
ClaseWorker sw = new_
ClaseWorker ();
sw.addPropertyChangeListener(new _
PropertyChangeListener(){
public_
void propertyChange(PropertyChangeEvent evt) {
_
if(evt.getPropertyName().equals(“Correcto”))_
});
}_
};
Objetivo
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 principal que se encargará de iniciar la aplicación, del movimiento y de
terminar la aplicación.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
- Pondremos un control JProgressBar para saber dónde estamos posicionados en el conjunto
de ventanas.
En ésta clase, los objetos serán compartidos (static) para poder acceder a ellos sin necesidad_
de crear instancias de objeto.
import javax.swing.*;
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
}
});
}
}
FRAME NUMERO 1
import java.awt.*;
FRAME NUMERO 2
import java.awt.*;
FRAME NUMERO 3
import java.awt.*;
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
/** Creates new form VariosFormularios3 */
public VariosFormularios3() {
initComponents();
this.setTitle("FRAME NUMERO 3");
this.setLocation(200, 200);
this.getContentPane().setBackground(Color.MAGENTA);
this.jProgressBar1.setValue(3);
}
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 super.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
import javax.swing.*;
import java.awt.*;
import java.io.*;
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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.*;
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las
actividades que encontrará en la unidad correspondiente de la plataforma eLearning”.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Unidad 14. Aplicaciones basadas en la
interfaz gráfica
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:
Objetivos
Conocer las principales clases en la elaboración de menús con java
Aprender a realizar un toolbar con java
Creación de un menú
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", "Formato", etc.
JMenuItem
Los elementos de un menú se representan mediante la clase JMenuItem.
Ejemplo guardar, guardar como del Jmenu de Archivo.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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);
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Creación de un Toolbar
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 acceso a funcionalidades
que también se encuentran en ítems de menús.
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");
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
ImageIcon ImagenGuardar=new ImageIcon("guardar.gif");
bot1.setIcon(ImagenGuardar);
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.
Creación de un JPopupMenu
// configurar GUI
public PruebaContextual()
{
super( "Uso de objetos JPopupMenu" );
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
String colores[] = { "Azul", "Amarillo", "Rojo" };
getContentPane().setBackground( Color.WHITE );
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las
actividades que encontrará en la unidad correspondiente de la plataforma eLearning”.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Unidad 15 . Hilos
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. 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
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.
CLASE DEFINICIÓN
Un objeto Thread representa a una tarea en ejecución. Aquí se implementan
Thread
métodos que van a permitir gestionar tareas individualmente.
Un objeto de este tipo representa a un conjunto de Threads y proporciona métodos
ThreadGroup
para gestionar dicho grupo.
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
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 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.
Detener la tarea
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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 condición varíe.
Ejemplo1.java
t2.start();
new Thread(t1).start();
Hora.java
import java.util.*;
public Hora(){
System.out.println("Constructor de Hora");
try{
System.out.println("ERROR");
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
}
}
Teclado.java
import java.io.*;
BufferedReader bin;
public Teclado(){
System.out.println("Constructor de Teclado");
bin=new BufferedReader(new InputStreamReader(System.in));
}
String linea="";
System.out.println("Método Run de Teclado");
try{
System.out.println("ERROR");
}
}
}
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Métodos de la clase Thread
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 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.
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. 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,
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 de ejecución que se está ejecutando
actualmente.
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 llamada alternativa a
este 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.
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 resume() sobre el mismo hilo para lograr
que 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 prioridad en ejecución
actualmente, pero resume() ocasiona que el hilo vuelva a ser un candidato a ser ejecutado.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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 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
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
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 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.
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.*;
Ficha[] fichas={f1};
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Actualiza ac=new Actualiza(fichas);
Leer le=new Leer(fichas,ac);
ac.start();
le.start();
Leer.java
import java.io.*;
Ficha[] fichas;
Actualiza ac;
System.out.println("Constructor de Leer");
this.fichas=fichas;
this.ac=ac;
try{
ac.sincronizar(true);
System.out.println(fichas[0].texto());
sleep(5000);
}
catch(InterruptedException e){
System.out.println(e.toString());
}
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
}
Ficha.java
/** Objeto que contiene los datos y operaciones de una Ficha de la Agenda. */
Actualiza.java
import java.io.*;
BufferedReader bin;
Ficha [] fichas;
System.out.println("Constructor de Actualiza");
bin=new BufferedReader(new InputStreamReader(System.in));
this.fichas=fichas;
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
actualiza();
if (b){
try{
wait();
}
catch(InterruptedException e){
System.out.println(e.toString());
}
}
else{
notifyAll();
}
String linea="";
System.out.println("Comenzando la actualización");
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");
}
}
}
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
Sincronización
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.
Los métodos synchronized previenen que más de un hilo acceda al código de un método crítico
simultá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 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.
Cuando 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.
import java.io.*;
switch (opcion){
case 1: try{
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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;
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las
actividades que encontrará en la unidad correspondiente de la plataforma eLearning”.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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 dentro de la red
tienen un identificador la DIRECCIÓN IP.
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
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.
Clase InetAddress
Esta clase que pertenece al paquete java.Net podemos capturar las direcciones o nombres de las
máquinas.
Ejemplo
Métodos de la clase
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
getHostAddress(): Devuelve una cadena con la dirección IP. Para llamarlo
nombre_objeto.getHostAddress().
getByName( String): Determina la dirección IP del host a partir del nombre del host. Para llamarlo
InetAddress getByName(nombre).
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().
Objetivos
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:
try{
//Muestro nombre-ip
mimaquina = InetAddress.getLocalHost();
System.out.println("Mi maquina es .getLocalHost() "+mimaquina);
//Muestro solo la ip
System.out.println("Direccion .getHostAddress() "+
mimaquina.getHostAddress());
//Muestro el nombre
String nombre= mimaquina.getHostName();
System.out.println("Nombre .getHostName() "+nombre);
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
//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 matriz
matriz= mimaquina.getAddress();
System.out.println("Con la matriz .getAddress()"+ new
String(matriz));
}catch(UnknownHostException e){
System.out.println("ERROR");
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
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
servidor respectivamente.
Ejemplo
En el siguiente ejemplo nos encargamos de leer la información que nos está entrando.
import java.net.*;
import java.io.*;
try{
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");
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
}catch (IOException ioe){
System.out.println("Error entrada salida");
}
}
}
import java.io.*;
import java.net.*;
public class Cliente{
try{
InetAddress a = misocket.getInetAddress();
System.out.println("misocket.getInetAdrress() "+a);
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());
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
//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);
CLASE URL
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.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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
la red.
Posibilidades:
Descargarnos cualquier recurso de la web.
Información del servidor: fecha de creación....
Comunicación de varios ordenadores
import java.net.*;
System.out.println(url_absoluta.toString());
}catch(MalformedURLException e){
System.out.println("URL mal formada");
e.printStackTrace();
}
}
}
import java.net.*;
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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());
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
acceder...
Creamos un objeto de la clase URLConnection con el método openConnection del objeto url
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 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:
setDoInput (boolean); Entrada
setDoOutput(boolean); Salida
Ejemplo
import java.io.*;
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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());
}
}
}
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(puerto);
Ejemplo de datagramas
/ /Este programa envia una cadena y recibe el eco, recibe lo mismo que envia.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
// El cliente envia un paquete al servidor y recibe otro
// Clase Cliente
import java.net.*;
import java.io.*;
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);
//Este programa envia una cadena y recibe el eco, recibe lo mismo que envie
//Clase Servidor
import java.net.*;
import java.io.*;
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
try{
DatagramSocket socketDatagrama = new DatagramSocket (5000);
System.out.println("Escuchando en el puerto 5000");
//Lo meto en un bucle infinito para que este escuchando
while(true){
DatagramPacket paquete = new DatagramPacket (new byte[20],20);
//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());
}
}
}
RMI
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 con ella.
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
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
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
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
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.*;
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.*;
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.
System.out.println("Esperando las llamadas del cliente");
}catch(Exception e){
System.out.println(e.toString());
}
}
}
LaInterface.java
import java.rmi.*;
//Si no lo calculo
int resultado=1;
return resultado;
}
}
Actividades
“Recuerde que para un seguimiento óptimo de la unidad es imprescindible realizar las
actividades que encontrará en la unidad correspondiente de la plataforma eLearning”.
www.learning.es
Para uso exclusivo de los alumnos de LEARNING & TRAINING CLOUD, S.L.