Sie sind auf Seite 1von 1054

 

Proogrrammacciónn
enn Jaavaa
VVolúmeen 1

   

1
Desarrollador de Software Especialista en Tecnologías Java (IFCD04TIC) 
 
   

 
2
2
Desarrollador de Software Especialista en Tecnologías Java (IFCD04TIC) 
 

El desarrollo de la Sociedad de la Información y Convergencia con Europa y entre Comunidades


Autónomas (Plan Avanza), es una nueva iniciativa para el desarrollo de la sociedad de la Información en
España durante el año 2010 – 2011.

El Plan Avanza se orienta a conseguir la adecuada utilización de las Tecnologías de la Información y las
Comunicaciones, para contribuir al éxito de un modelo de crecimiento económico basado en el incremento de
la competitividad y la productividad.

Objetivos generales del programa:

 Dotar de las habilidades interpersonales que son claves para trabajar en equipo en los proyectos, y
conseguir resultados a través de las personas, para satisfacer las necesidades de sus clientes.

 Que los alumnos, sin experiencia en el desarrollo de programas, comprendan como se estructura un
programa de aplicaciones, a nivel general.

 Diseñar y escribir programas en lenguaje Java que se ejecutan en el lado del servidor Web, utilizando el
API J2EE.

 Los alumnos que superen los cursos de formación con evaluación positiva recibirán soporte para poder
participar en diversos procesos de selección de empresas relacionadas en con el mundo de las TIC.

El propósito de esta guía es darte una pauta de apoyo para que pueda planificar tu estudio. Hemos
distribuido cada una de las unidades, por día para que tengas una referencia en la dedicación que esperamos
que tengas en el transcurso de esta formación.

 
3
3
Desarro
ollador de SSoftware Especialista e
en Tecnologgías Java (IFCD04TIC)) 
 

 
4
4
Desarrollador de Software Especialista en Tecnologías Java (IFCD04TIC) 
 

INTRODUCCIÓN

MODALIDAD TOTAL DÍAS


Presencial 4

DÍA CONTENIDOS TEÓRICOS


1 Introducción del curso y sistemas de evaluación.
2 Explicación de los contenidos teóricos
3 Explicación de los contenidos teóricos
4 Explicación de los contenidos teóricos

 
5
5
Desarrollador de Software Especialista en Tecnologías Java (IFCD04TIC) 
 

MODALIDAD TOTAL DÍAS


TELEFORMACION 38

CONTENIDOS TEÓRICOS

MÓDULO 1. TÉCNICAS DE PROGRAMACIÓN ESTRUCTURADA

1. LA INFORMÁTICA Y EL MANEJO DE LA INFORMACIÓN.

1.1. La información y el tratamiento mecanizado de la información: La informática.


1.2. El ordenador y sus componentes.
1.3. Procesamiento de la información.
1.4. Tipos de datos básicos.
1.5. Sistemas de Numeración.
1.6. Binario y Hexadecimal. Cambio de base y operaciones aritméticas básicas: suma, resta
complementos.
1.7. Codificación de la Información: ASCII, EBCDIC y orden de los datos en función del código.
Formatos clásicos internos de almacenamiento en memoria.
1.8. Tipos de archivos de información: Ficheros y Bases de datos y operaciones típicas de
entrada/salida.

2. INTRODUCCIÓN A LA PROGRAMACIÓN.

2.1. Concepto de algoritmo y de programa.


2.2. Ciclo de vida: Fases clásicas de diseño de aplicaciones informáticas.
2.3. Estructura de un centro de proceso de datos. Roles habituales.
2.4. Lenguajes de programación. Lenguajes de bajo, medio y alto nivel.
2.5. Ensambladores, intérpretes y compiladores.
2.6. Código fuente, código objeto y código ejecutable.
2.7. Estructura de un programa. Datos e instrucciones.
2.8. Flujogramas: organigramas, ordinogramas.
2.9. Flujogramas versus pseudocódigos.
2.10. Elementos básicos de programación.

3. ESTRUCTURAS BÁSICAS DE LA PROGRAMACIÓN ESTRUCTURADA. PSEUDOCÓDIGOS.

3.1. Métodos de diseños deductivos e inductivos. Diseño TOP DOWN.


3.2. Instrucciones secuenciales.
3.3. Instrucciones alternativas (bifurcaciones).
3.4. Instrucciones repetitivas (bucles).

 
6
6
Desarrollador de Software Especialista en Tecnologías Java (IFCD04TIC) 
 

4. ARRAYS Y TABLAS UNIDIMENSIONALES, BIDIMENSIONALES Y TRIDIMENSIONALES.

4.1. Diseño y creación de Tablas o Arrays.


4.2. Inicializar o preparar tablas.
4.3. Cargar una tabla desde el teclado.
4.4. Recorrer secuencialmente una tabla.
4.5. Buscar un contenido determinado dentro de uno de los elementos.
4.6. En una tabla que está ordenada.
4.7. Si la tabla no está ordenada.
4.8. Ordenar una tabla por cualquier método.
4.9. Insertar un elemento en uno libre del final.
4.10. Insertar un elemento en uno de los elemento intermedios desplazando el resto hacia el final (debe
haber elementos vacíos al final).
4.11. Borrar un elemento de una tabla.

5. FUNCIONES Y PROCEDIMIENTOS.

5.1. Introducción al concepto de rutinas, funciones y procedimientos.


5.2. Datos en los procedimientos.
5.3. Parámetros formales y actuales.
5.4. Variables globales y locales.
5.5. Funciones y ámbito de las variables.
5.6. Funciones y procedimientos: Representación gráfica.
5.7. Esquema básico de llamadas a rutinas y procedimientos.
5.8. Esquema básico de llamadas a funciones.
5.9. Ejemplo de llamada a procedimientos en lenguaje C, C++ y JAVA.
5.10. Ejemplo de llamada a procedimientos en lenguaje Visual .NET.
5.11. Ejemplo de llamada a procedimientos en lenguaje COBOL.

6. INTRODUCCIÓN AL TRATAMIENTO DE FICHEROS.

6.1. Estructura de un archivo o fichero


6.2. Programas de Creación de ficheros secuenciales.
6.3. Programas de consulta de ficheros secuenciales.

 
7
7
Desarrollador de Software Especialista en Tecnologías Java (IFCD04TIC) 
 

MÓDULO 2. INTRODUCCIÓN A JAVA

1. CARACTERÍSTICAS DE LA TECNOLOGÍA JAVA.

1.1. Características del lenguaje Java.


1.2. La Máquina Virtual Java (JVM).
1.3. Soporte de fabricantes software.

2. EDICIONES JAVA.

2.1. Java Standar Edition.


2.2. Java Enterprise Edition.
2.3. Java Micro Edition.

3. PRIMEROS PASOS EN JAVA.

3.1. El Java Development Kit JDK 6.0.


3.2. Configuración de variables de entorno.
3.3. Nociones básicas de sintaxis Java.
3.4. Creación del primer programa Java.
3.5. Utilización de un entorno de desarrollo IDE.

 
8
8
Desarrollador de Software Especialista en Tecnologías Java (IFCD04TIC) 
 

MÓDULO 3. SINTAXIS DEL LENGUAJE

1. VARIABLES, CONSTANTES Y TIPOS DE DATOS.

2. EL TIPO CADENA DE CARACTERES.

3. OPERADORES.

4. INSTRUCCIONES DE CONTROL.

5. ARRAYS.

6. CLASES Y OBJETOS.

6.1. Definición formal de clase y objeto.


6.2. Creación de objetos a partir de clases.
6.3. Implementación de métodos y atributos de una clase.
6.4. Métodos estáticos.
6.5. Modificadores de acceso.

7. CLASES DE TIPO JAVABEANS.

8. TIPOS GENÉRICOS.

8.1. La clase Object y las conversiones de tipos.


8.2. Definición de tipos genéricos. Ventajas.
8.3. Comodines y restricciones de tipos.
8.4. Métodos genéricos.

 
9
9
Desarrollador de Software Especialista en Tecnologías Java (IFCD04TIC) 
 

MÓDULO 4. UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

1. IMPORTAR CLASES Y PAQUETES EXTERNOS.

2. EL PAQUETE JAVA.LANG.

2.1. Manipulación de cadenas con la clase String.


2.2. Operaciones matemáticas con la clase Math.
2.3. Clases de envoltorio.
2.4. Autoboxing y autounboxing.

3. MANIPULACIÓN Y FORMATO DE FECHAS.

3.1. La clase Calendar.


3.2. La clase DateFormat.

4. OPERACIONES DE ENTRADA-SALIDA.

4.1. La clase PrintStream para salida de datos.


4.2. Lectura de caracteres con InputStream.
4.3. Lectura de cadenas con BufferedReader.
4.4. Lectura de datos con la clase Scanner.

5. GESTIÓN DE COLECCIONES.

5.1. Las clases de colección Java.util.ArrayList y Java.util.Hashtable.


5.2. Enumeraciones e iteraciones.

 
10
10
Desarrollador de Software Especialista en Tecnologías Java (IFCD04TIC) 
 

MÓDULO 5. PROGRAMACIÓN ORIENTADA A OBJETOS CON JAVA

1. CONSTRUCTORES.

2. SOBRECARGA DE MÉTODOS.

3. HERENCIA.

3.1. Concepto de herencia.


3.2. Características de la herencia en Java.
3.3. Ejecución de constructores en la herencia.
3.4. Uso de super y this.
3.5. Sobreescritura de métodos.
3.6. Uso de modificadores final y protected.
3.7. Herencia y tipos genéricos.

4. CLASES ABSTRACTAS.

5. POLIMORFISMO.

6. INTERFACES.

 
11
11
Desarrollador de Software Especialista en Tecnologías Java (IFCD04TIC) 
 

MÓDULO 6. EXCEPCIONES

1. CLASES DE EXCEPCIÓN.

2. EXCEPCIONES MARCADAS Y NO MARCADAS.

3. CONTROL DE EXCEPCIONES.

3.1. Utilización de los bloques try, catch, finally.


3.2. Declaración de una excepción.
3.3. Lanzamiento de excepciones.

4. EXCEPCIONES PERSONALIZADAS.

 
12
12
Desarrollador de Software Especialista en Tecnologías Java (IFCD04TIC) 
 

MÓDULO 7. APLICACIONES BASADAS EN ENTORNO GRÁFICO

1. LOS PAQUETES JAVA.AWT Y JAVAX.SWING.

2. CREACIÓN DE VENTANAS Y CUADROS DE DIÁLOGO AWT.

3. GESTIÓN DE EVENTOS.

3.1. Principales clases de eventos.


3.2. Interfaces de escucha y adaptadores.
3.3. Registro de un evento.

4. UTILIZACIÓN DE CONTROLES SWING.

4.1. Creación de un control.


4.2. Añadir controles a un contenedor.
4.3. Principales controles swing.

5. GESTORES DE ORGANIZACIÓN.

6. APPLETS.

6.1. Características de un applet.


6.2. Creación de un applet.
6.3. Métodos del ciclo de vida de un applet.

 
13
13
Desarrollador de Software Especialista en Tecnologías Java (IFCD04TIC) 
 

MÓDULO 8. ACCESO A DATOS EN JAVA

1. FUNDAMENTOS DEL LENGUAJE SQL.

2. LA TECNOLOGÍA JDBC.

2.1. Drivers JDBC.


2.2. Carga de un driver en una aplicación.
2.3. El API JDBC.

3. ACCESO MEDIANTE JDBC A UNA BASE DE DATOS RELACIONAL.

3.1. Creación de conexiones.


3.2. Ejecución de consultas SQL.
3.3. Manipulación de resultados.
3.4. Ejecución de procedimientos almacenados.

4. XML COMO ALMACENAMIENTO DE DATOS.

4.1. Características del lenguaje XML.


4.2. Manipulación de documentos XML desde una aplicación Java.

5. ACCESO A FICHEROS.

5.1. Lectura y escritura en ficheros de texto.


5.2. Serialización y des-serialización de objetos.

 
14
14
Desarrollador de Software Especialista en Tecnologías Java (IFCD04TIC) 
 

TUTORÍA

MODALIDAD TOTAL DÍAS


Presencial 2

DÍA CONTENIDOS TEÓRICOS


42 Resolución de dudas
43 Resolución de dudas 

 
15
15
Desarrollador de Software Especialista en Tecnologías Java (IFCD04TIC) 
 

MODALIDAD TOTAL DÍAS


TELEFORMACION 20

CONTENIDOS TEÓRICOS

MÓDULO 9.PROGRAMACIÓN DE APLICACIONES MULTITAREA

1. CONCEPTO DE TAREA Y MULTITAREA.

2. CREACIÓN DE APLICACIONES MULTITAREA.

2.1. Herencia de la clase Thread.


2.2. Sobreescritura del método run().
2.3. Inicio de una tarea.
2.4. Utilización de la interfaz Runnable.

3. PRINCIPALES MÉTODOS PARA EL CONTROL DE LA MULTITAREA.

4. SINCRONIZACIÓN DE PROCESOS.

 
16
16
Desarrollador de Software Especialista en Tecnologías Java (IFCD04TIC) 
 

MÓDULO 10. COMUNICACIÓN DE APLICACIONES EN RED

1. CONCEPTOS BÁSICOS SOBRE REDES.

1.1. Dirección IP, Nombre de dominio y URL.


1.2. Puertos de escucha.
1.3. El protocolo TCP.

2. LA CLASE INETADDRESS.

3. INTERCONEXIÓN DE APLICACIONES MEDIANTE SOCKETS.

3.1. Creación de un socket. La clase Socket.


3.2. Lectura y escritura a través de un socket.
3.3. Creación de sockets de servidor. La clase ServerSocket.
3.4. Escucha de peticiones en un socket del servidor.
3.5. Principales métodos de la clase ServerSocket.

 
17
17
Desarrollador de Software Especialista en Tecnologías Java (IFCD04TIC) 
 

MÓDULO 11. ARQUITECTURA DE APLICACIONES JAVA EE

1. EL MODELO DE TRES CAPAS EN INTERNET.

1.1. Características de las aplicaciones de tres capas.


1.2. Interacción cliente – capa intermedia.
1.3. El Protocolo HTTP.
1.4. Tecnologías cliente, capa intermedia y datos.

2. LA ARQUITECTURA J2EE.

2.1. Capa Web y capa de negocio.


2.2. Componentes y servicios Java EE.
2.3. Contenedores Java EE.

3. ESTRUCTURA DE UNA APLICACIÓN WEB JAVA EE.

4. EL DESCRIPTOR DE DESPLIEGUE WEB.XML.

 
18
18
Desarrollador de Software Especialista en Tecnologías Java (IFCD04TIC) 
 

MÓDULO 12. FUNDAMENTOS DE HTML Y JAVASCRIPT

1. EL PAPEL DE HTML Y JAVASCRIPT EN UNA APLICACIÓN WEB.

2. ESTRUCTURA DE UN DOCUMENTO HTML.

3. PRINCIPALES ETIQUETAS HTML.

3.1. Estilos y formato.


3.2. Imágenes.
3.3. Tablas y listas.

4. FUNDAMENTOS DE HOJAS DE ESTILO.

5. FORMULARIOS HTML.

5.1. La etiqueta <form> y sus atributos principales.


5.2. Los controles de texto.
5.3. Los controles de selección.
5.4. Controles tipo botón.

6. INCLUSIÓN DE SCRIPTS EN UNA PÁGINA WEB.

7. SINTAXIS BÁSICA DE JAVASCRIPT.

7.1. Variables
7.2. Operadores.
7.3. Instrucciones de control.
7.4. Funciones del lenguaje.
7.5. Principales Objetos Java Script.

 
19
19
Desarrollador de Software Especialista en Tecnologías Java (IFCD04TIC) 
 

MÓDULO 13. DESARROLLO DE APLICACIONES WEB CON SERVLETS

1. CARACTERÍSTICAS DE UN SERVLET.

2. CREACIÓN DE UN SERVLET.

2.1. Extensión de la clase HttpServlet.


2.2. Sobreescritura de los métodos del ciclo de vida de un servlet.
2.3. Creación del primer servlet.
2.4. Registro de un servlet en web.xml.

3. GENERACIÓN DINÁMICA DE PÁGINAS DESDE UN SERVLET.

4. ENVÍO DE DATOS A UN SERVLET.

5. REDIRECCIONAMIENTO Y REENVÍO DE PETICIONES.

6. MANTENIMIENTO DEL ESTADO EN APLICACIONES WEB JAVA EE.

6.1. Inserción de datos en URL.


6.2. Variables de petición, sesión y aplicación.
6.3. Cookies.

7. ESCUCHADORES.

8. OPCIONES DE CONFIGURACIÓN DEL ARCHIVO WEB.XML.

9. ACCESO A DATOS DESDE UN SERVLET.

 
20
20
Desarrollador de Software Especialista en Tecnologías Java (IFCD04TIC) 
 

MÓDULO 14. DESARROLLO DE APLICACIONES WEB CON JSP

1. CARACTERÍSTICAS DE LA TECNOLOGÍA JSP.

2. INSERCIÓN DE CÓDIGO JAVA EN UNA PÁGINA JSP.

3. GENERACIÓN DE PÁGINAS WEB CON JSP.

4. LOS OBJETOS INTEGRADOS JSP.

5. DIRECTIVAS JSP.

6. ACCIONES JSP.

7. UTILIZACIÓN DE JAVABEANS EN PÁGINAS JSP.

8. ACCESO A DATOS DESDE UNA PÁGINA JSP.

9. CREACIÓN DE LIBRERÍAS PERSONALIZADAS PARA JSP.

10. EL LENGUAJE DE EXPRESIONES EL PARA JSP.

11. LA LIBRERÍA DE ACCIONES ESTÁNDAR JSTL.

 
21
21
Desarrollador de Software Especialista en Tecnologías Java (IFCD04TIC) 
 

MÓDULO 15. LA ARQUITECTURA MODELO VISTA CONTROLADOR

1. PATRONES DE DISEÑO JAVA EE.

2. ESTRUCTURACIÓN DE APLICACIONES WEB JAVA EE.

3. CAPAS MVC.

3.1. El controlador.
3.2. La vista.
3.3. El modelo.

4. EL ACCESO A LOS DATOS EN UNA APLICACIÓN MVC.

5. DESPLIEGUE DE UNA APLICACIÓN EN UN SERVIDOR DE APLICACIONES.

 
22
22
Desarrollador de Software Especialista en Tecnologías Java (IFCD04TIC) 
 

MÓDULO 16. CREACIÓN DE COMPONENTES ENTERPRISE JAVABEANS


(EJBs)

1. LA ARQUITECTURA EJB.

1.1. Definición de EJB.


1.2. Características y ventajas.
1.3. Ámbito de utilización de EJBs.

2. TIPOS DE COMPONENTES EJB.

3. DIFERENCIAS ENTRE UN EJB 3.0 Y VERSIONES ANTERIORES.

4. IMPLEMENTACIÓN DE UN EJB.

4.1. Anotaciones, interfaces, clases y descriptores de despliegue.


4.2. Descriptores de despliegue.
4.3. Despliegue de un EJB.

5. CREACIÓN DE APLICACIONES WEB CLIENTES DE EJB.

5.1. Utilización de JNDI.


5.2. Parámetros de inicialización de contexto.

6. ANÁLISIS DE LOS EJBS DE SESIÓN.

6.1. Stateless Session Bean frente a Stateful Sesion Bean.


6.2. Métodos del ciclo de vida.
6.3. Proceso de construcción de un EJB de sesión.

7. MESSAGE-DRIVEN BEAN.

7.1. Introducción a JMS.


7.2. Construcción y despliegue de un MDB.

8. DESPLIEGUE DE UN MÓDULO EJB.

9. PERSISTENCIA DE DATOS.

9.1. Entidades y persistencia.


9.2. El API EntityManager.
9.3. Empaquetado y despliegue de clases de entidad.

 
23
23
Desarrollador de Software Especialista en Tecnologías Java (IFCD04TIC) 
 

TUTORÍA

MODALIDAD TOTAL DÍAS


Presencial 1

DÍA CONTENIDOS TEÓRICOS


64 Resolución de dudas

 
24
24
Desarrollador de Software Especialista en Tecnologías Java (IFCD04TIC) 
 

 
25
25
 

Módulo 1:
Técnicas de Programación
Estructurada

   

26
LA INFORMÁTICA Y
EL MANEJO DE LA
INFORMACIÓN

27
ÍNDICE
LA INFORMÁTICA Y EL MANEJO DE LA INFORMACIÓN

1. Procesamiento de la información . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3
2. Tipos de datos básicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10
3. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16

28
La informática y el manejo de la información

Objetivos

A lo largo de éste te mostraremos los dispositivos de almacenamiento de la memoria principal y las unidades
de medida del ordenador, entre otros.

1. Procesamiento de la información
Almacenamiento de la Información

El almacenamiento de la información es una de las actividades o capacidades más importantes que tiene un
ordenador. A través de esta propiedad el sistema puede recordar la información guardada en la sección o
proceso anterior. Esta información suele ser almacenada en estructuras de información denominadas
“archivos”.

i
3

29
La informática y el manejo de la información

La información se almacena en las unidades típicas de almacenamiento externos o periféricos tales como
discos magnéticos o discos duros, memorias USB y los discos compactos (CD-ROM), etc., en los cuales se
almacenan de forma segura todos los programas o datos que el usuario desee.

Los datos son introducidos por el fabricante del ordenador (instrucciones que carga el computador cuando
enciende) y la memoria auxiliar o externa (almacenamiento). Para que se procese la información es
imprescindible que todo ello, tanto instrucciones como datos sean cargados en la memoria central o principal.

Memoria Central o Principal

La memoria central o principal, se refiere a componentes de un ordenador, dispositivos y medios de grabación


que retienen datos informáticos durante un intervalo de tiempo.
Es uno de los componentes fundamentales de todos los ordenadores modernos que, acoplados a la Unidad
Central de Proceso (CPU por su acrónimo en inglés, Central Processing Unit), implementa lo fundamental del
modelo de ordenador de Von Neumann, usado desde los años 1940.

La memoria central se divide en:

MEMORIA CENTRAL

- Memoria R.O.M
- Memoria R.A.M

Memoria RAM

Es un tipo de memoria temporal que pierde sus datos cuando se queda sin energía (por ejemplo, al apagar
el ordenador), por lo cual es una memoria volátil. Esto es cierto desde el punto de vista teórico: científicos
de la Universidad de Princeton han descubierto una destrucción gradual de los datos almacenados en la
memoria RAM que oscila entre unos segundos y varios minutos, siendo inversamente proporcional a la

i
4

30
La informática y el manejo de la información

temperatura. Esto puede significar una brecha en la seguridad en tanto que las claves de acceso de cifradores
de información como BitLocker quedan almacenadas en la memoria RAM.

Direccionamiento de la información

El direccionamiento de la información es posible a través de 3 tipos de memorias:

- Memoria de localización direccionable


- Memoria de contenido direccionable
- Memoria de sistema de archivos

En la memoria de localización direccionable, cada unidad de información accesible individualmente en la


memoria se selecciona con su dirección de memoria numérica. En los ordenadores modernos, la memoria de
localización direccionable se suele limitar a memorias primarias, que se leen internamente por programas
de ordenador ya que la localización direccionable es muy eficiente, pero difícil de usar para los humanos.

Unidades de medida de almacenamiento

El ser humano, siempre ha sentido la necesidad de medir todo lo que tiene a su alcance, como por ejemplo
la distancia, el tiempo, el volumen y la velocidad, entre otros. La información, no podría ser la excepción,

i
5

31
La informática y el manejo de la información

pues es necesario conocer cuánta información podemos almacenar en un dispositivo, o qué espacio disponible
poseemos para guardar un archivo.

Información en el ordenador

La técnica de informática no es algo natural, si una máquina, como es el ordenador, es capaz de guardar y
representar datos, es porque alguien se ha inventado un procedimiento artificial para poder conseguir eso.

El principio de funcionamiento de los ordenadores se basa en la facilidad que tienen los dispositivos
electrónicos para manejar informaciones binarias. En cualquier caso, para el ordenador todas esas
informaciones siempre se resumen en lo mismo, tensión o no tensión, 0 o 1.

Sistema Binario

Cuando un ordenador guarda su información en algún periférico, sustituye el estado de tensión / no tensión
por estado como campo magnético/no magnético (discos magnéticos) o reflexión de la luz/no reflexión de
la luz (discos ópticos), pero en cualquier caso siempre podemos interpretar que estamos tratando

i
6

32
La informática y el manejo de la información

informaciones 0 o 1. Estas informaciones 0 o 1, independientemente de la naturaleza de la señal con la que


estén representadas, es la que se llama dígito binario o bit.

Un sistema como éste, que sólo maneja dos estados o dos signos, recibe el nombre de Sistema Binario, y a
la información representada con estos dos signos o estados se le llama información.

Cómo opera la memoria del ordenador

Para comprender mejor lo anteriormente expuesto, veamos el


siguiente ejemplo.

Imagina que cada una de las celditas de la tabla inferior es una


posición de memoria y que la memoria es como cada uno de los
cuadritos de una hoja de papel cuadriculada, con 160 posiciones
de memoria. Cada una de estas posiciones esta identificada
perfectamente por sus coordenadas.

i
7

33
La informática y el manejo de la información

Como se puede observar una hoja cuadriculada está compuesta única y exclusivamente de cuadros, desde
el principio hasta el final. En este caso tenemos una hoja que posee 160 cuadritos, que podría compararse
con el espacio total disponible en la memoria RAM o en cualquier dispositivo de almacenamiento. Cada
cuadro sería utilizado para colocar dentro un carácter, ya sea letra número o caracteres especiales.

El Byte

Un Byte está compuesto de 8 bits, el bit es la unidad más pequeña de este sistema de medida llamado
Sistema Binario.

El sistema métrico decimal se compone de 10 dígitos desde el 0 hasta el 9, pero el Sistema Binario solo se
compone de dos dígitos que son el 0 y el 1.

El 0 es un bit y el 1 es otro bit. Como cada carácter (letra, número, símbolo) corresponde a un BYTE (byte)
entonces, por ejemplo, el 1 en binario sería así: 00000001. Estos 8 bit dan origen al BYTE.

En el ejemplo anterior, si la hoja cuadriculada fuera un diskette, entonces podríamos decir que ese diskette
tiene un espacio total de 160 BYTES, que 99 BYTES han sido utilizados y que hay un espacio disponible en
disco de uno 60 BYTES (sin considerar los blancos intercalados).

i
8

34
La informática y el manejo de la información

Múltiplos y submúltiplos de la unidad Byte

Igual que otras unidades de medida, la unidad byte también posee múltiplos y submúltiplos.

En la conversión de las medidas se utiliza una “aproximación” haciendo siempre los cálculos de 1000 en
1000, aunque la unidad BYTE no va de 1000 en 1000, sino de 1024 en 1024. Ej: 7 Kilobytes son realmente 7168
bytes (7 x 1024 = 7168), sin embargo, generalmente se calcula multiplicando (7 * 1000 =7000).

Desde 1998, existen unidades especialmente orientadas a base 2 y no a base 10, destinadas al campo de la
informática. El KB es 210, el MB es 220, el GB es 230, el TB es 240 y así sucesivamente.

i
9

35
La informática y el manejo de la información

2. Tipos de datos básicos

En éste te mostraremos las diferentes categorías de datos y la manipulación de datos en la memoria


principal.

Los datos

Un dato se define como la expresión general que describe los objetos con que opera un ordenador.

Los datos de entrada se transforman, después de las etapas intermedias, en datos de salida.

i
10

36
La informática y el manejo de la información

Los datos se clasifican en diversas categorías, según el tipo de máquina o del lenguaje en uso. Generalmente
podemos encontrar las siguientes categorías:

- NUMÉRICOS.
- LÓGICOS.
- CADENAS.
- COMPUESTOS.

Datos numéricos

Los datos numéricos son aquellos que representan una cantidad o valor determinado.

Son todos aquellos datos creados con posibilidades de realizar operaciones numéricas con ellos. Su
representación se lleva a cabo en los formatos ya conocidos en las matemáticas (enteros, punto y fracciones
decimales si éstas existen).

A partir de estos Tipos de datos básicos el programador definirá en sus programas constantes y variables para
dar solución a determinadas funcionalidades que deberá desarrollar y comprobar

Los datos numericos pueden representarse de dos formas distintas:

- Tipo numérico ENTERO

- Tipo numérico REAL

Datos alfanuméricos o cadena de caracteres

Las cadenas de caracteres son los datos que representan información textual (palabras, frases, símbolos, etc.)
es decir, datos alfanuméricos.

i
11

37
La informática y el manejo de la información

No representan valor alguno para efectos numéricos. Pueden distinguirse porque son delimitados por
apóstrofes o comillas.

Se suelen clasificar en dos categorías en la mayoría de los lenguajes de programación actuales:

- Datos tipo CARÁCTER (Char)

- Datos tipo CADENA ALFANUMERICA (String)

Datos lógicos

También se los denomina boléanos (booleanos o boolean). Son aquellos datos que sólo pueden tomar uno de
dos valores: falso ó verdadero (false o true).

Este tipo de datos se utiliza para representar las alternativas (verdadero/falso) a determinadas condiciones.

Por ejemplo:

- Cuando se pide si un valor entero es primo, la respuesta será verdadera o falsa, según sea el
número primo o no lo sea

- Si digo que el número: -32 es positivo esto será FALSO.

(3>2)= Verdadero

(7>9)= Falso

i
12

38
La informática y el manejo de la información

Datos constantes y variables

Los datos también se pueden clasificar en función de si sus contenidos se pueden modificar o no a lo largo
de toda la ejecución de un programa, así pues, podemos diferenciar entre constantes y variables.

En ambos casos se asocian a direcciones de memoria donde el procesador guarda la información para su
proceso posterior.

Datos constantes

Tienen un valor fijo que se le da cuando se define la constante y que ya no puede ser modificado durante la
ejecución.

Las constantes pueden llevar asociadas un nombre o no, si no lo llevan, se llaman literales. El tipo,
dependiendo de los lenguajes hay que ponerlo, y en otros no hace falta ponerlo porque toma el tipo del
dato que se le asigna.

Datos variables

Su valor puede cambiar durante la ejecución del algoritmo, pero nunca varía su nombre y su tipo. Deben tener
un nombre, y debe ser un nombre significativo. Tiene que empezar por una letra, y el tamaño depende del
lenguaje.

i
13

39
La informática y el manejo de la información

Características de los datos

Los datos es una expresión general que describe los objetos con los que opera el ordenador. La información
de entrada-salida se clasifica y se convierte en datos para hacerlos más manejables.

Los algoritmos y programas que crean los programadores operan con estos datos para obtener unos
resultados. De esta forma los datos de entrada se transforman por el programa en las etapas intermedias para
generar los datos de salida, es decir unos resultados.

- Tienen un nombre asignado por el programador que los diferencia del resto de datos del programa.

- Tienen asociado un tipo de dato que determina y restringe qué tipo de operaciones podemos hacer
con estos tipos de datos.

- Se les puede cargar con un valor inicial que puede variar o no a lo largo del proceso.

- Cada uno de estos datos tiene una longitud y una dirección de almacenamiento en memoria que se
le asigna el sistema durante la fase de compilación (la cual en la actualidad es transparente para el
programador).

i
14

40
La informática y el manejo de la información

Manipulación de Datos en la Memoria Principal

Veamos un ejemplo de manipulación de datos en la memoria tal cual lo haría el ordenador al ejecutar un
programa:

Los datos definidos y usados por el programa, quedarían representados de la siguiente manera en la memoria
RAM del ordenador.

Datos en memoria antes Datos en memoria después de la


de la ejecución del programa ejecución del programa

i
15

41
La informática y el manejo de la información

3. Resumen

Has llegado al final de esta lección de formación que denominamos “La informática y el manejo de la
información”.

En esta lección hemos estudiado los siguientes contenidos:

i
16

42
SISTEMAS DE
NUMERACIÓN Y
CODIFICACIÓN DE
LA INFORMACIÓN

43
ÍNDICE
SISTEMAS DE NUMERACIÓN Y CODIFICACIÓN
DE LA INFORMACIÓN

1. Sistemas de numeración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3
2. Codificación de la información y formatos de almacenamiento . . . . . . . . . . . . . . . . . . . . . . .19
3. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33

44
Sistemas de numeración y codificación de la información

1. Sistemas de numeración
Objetivos

A lo largo éste te mostraremos los diferentes sistemas de numeración que utiliza el ordenador, cambio de
bases y operaciones aritméticas básicas de los sistemas binario y hexadecimal y conversiones entre los
diferentes sistemas.

Introducción a los sistema de numeración

Tanto el hombre como el ordenador trabajan con sistemas de numeración.

El hombre en su vida cotidiana trabaja desde el punto de vista numérico con el sistema decimal y desde el
punto de vista alfabético con un determinado idioma.

0123456789

i
3

45
Sistemas de numeración y codificación de la información

Asimismo, el ordenador debido a su construcción, lo hace desde ambos puntos de vista con el sistema binario,
utilizando una serie de códigos que permiten su perfecto funcionamiento.

0 1

Sistemas de numeración del ordenador

Tanto el sistema decimal como el binario están basados en los mismos principios. En ambos, la representación
de un número se efectúa por medio de cadenas de símbolos, los cuales representan una determinada cantidad
dependiendo del propio símbolo y de la posición que ocupa dentro de la cadena.

Los sistemas de numeración que utiliza la computadora son: el Sistema Binario, el Decimal, el Octal y el
Hexadecimal:

i
4

46
Sistemas de numeración y codificación de la información

A continuación revisaremos el sistema binario y hexadecimal. Repasaremos el sistema decimal como medio
de comparación y comprensión de los demás sistemas de numeración. Todo ello con el objetivo de poder
garantizar una mayor comprensión a la hora de manejar un sistema informático.

El Sistema Decimal

El sistema decimal es uno de los denominados sistemas posicionales, utilizando un conjunto de símbolos cuyo
significado depende fundamentalmente de su posición relativa al símbolo coma (,), denominado coma
decimal, que en caso de ausencia se supone colocada implícitamente a la derecha.

Utiliza como base el 10, que corresponde al número de símbolos que comprende para la representación de
cantidades.

Estos símbolos (también denominados dígitos) son:

0123456789

Estos dígitos pueden tener un valor absoluto o valor relativo.

Sistema de Numeración Posicional

El valor relativo posicional se deduce a partir del Teorema Fundamental de la Numeración (TFN).
Éste indica que en cualquier sistema de numeración posicional todos los números pueden expresarse mediante
la siguiente suma de productos:

i
5

47
Sistemas de numeración y codificación de la información

Es decir que una determinada cantidad, que llamaremos numero decimal, se puede expresar así:

A partir de esta formula podemos saber cuál es el valor relativo de cualquier dígito dentro de una cifra en
función de la posición que ocupa. Imaginémonos una cifra constituida por 12 cincos, sus valores relativos
serían:

Por ello, la cifra 5902 es igual a: 5 * 10³ + 9 * 10² + 0 * 10¹ + 2 * 10°

Teorema Fundamental de la Numeración (TFN)

El Teorema Fundamental relaciona una cantidad expresada en cualquier sistema de numeración con la misma
cantidad expresada en el sistema decimal:

“El valor en el sistema decimal de una cantidad expresada en otro sistema cualquiera de numeración, viene
dado por la fórmula”

i
6

48
Sistemas de numeración y codificación de la información

Donde “X” es el dígito y la “B” la base.

Este teorema es fundamental en informática, ya que los ordenadores únicamente trabajan con el sistema
binario es decir, con ceros y unos.

Origen del Sistema Numérico del ordenador

El sistema numérico binario fue el escogido por los ingenieros informáticos para el funcionamiento de los
ordenadores, porque era más fácil para el sistema electrónico de la máquina distinguir y manejar solamente
dos dígitos, o sea, el "0" y el "1" que componen el sistema numérico binario, en lugar de los diez dígitos (del
0 al 9), que constituyen el sistema numérico decimal.

i
7

49
Sistemas de numeración y codificación de la información

De no haber existido el sistema matemático binario, el desarrollo de una tecnología para que los ordenadores
pudieran funcionar empleando el sistema decimal, hubiera sido tan costosa que los ordenadores no hubieran
estado siquiera al alcance de la mayoría de las empresas, tal como ocurría con las voluminosas computadoras
o “mainframes” que se utilizaron a partir de los años 50 del siglo pasado.

El Sistema Binario

La mayoría de los circuitos electrónicos que conforman un ordenador sólo puede detectar la presencia o
ausencia de tensión en el circuito. A la presencia de tensión en un punto del circuito le asignamos el valor 1
y a la ausencia de la misma el valor (lógica positiva).

Los ordenadores son digitales, esto quiere decir que la información se guarda como cadenas de unos y ceros,
sí o no (dígitos).

Ya que el hardware por el momento sólo reconoce estos dos estados, se creó el Sistema Binario, cuya base
por lo tanto es 2 (número de dígitos del sistema).Cada dígito de un número representado en este sistema se
denomina bit (binary digit)

Ejemplo: 1 00010011101111000000111000011110

i
8

50
Sistemas de numeración y codificación de la información

Suma y resta binaria

Para comprender mejor lo anterior, a continuación veremos algunas operaciones básicas con binarios: la
suma y la resta.

Suma Binaria

Es semejante a la suma en el sistema decimal, con la diferencia de que se manejan sólo 2 dígitos (0 y 1), y
que cuando el resultado excede de los símbolos utilizados se agrega el exceso (acarreo) a la suma parcial
siguiente hacia la izquierda. Veamos en el cuadro de abajo las tablas de sumar en binario.

Como ejemplo, realizamos un paralelo a la aritmética binaria su equivalente en decimal:

51
Sistemas de numeración y codificación de la información

Resta Binaria

La resta binaria es similar a la decimal con la diferencia de tener sólo 2 dígitos y que al realizar las restas
parciales entre 2 dígitos, 1 del minuendo y otro del sustraendo, si el segundo excede al primero, se sustrae
una unidad del dígito de más a la izquierda en el minuendo (si existe y vale 1), convirtiéndose este último
en 0 y equivaliendo la unidad extraída a 1 * 2 en el minuendo de resta parcial que estamos realizando. Si es
0 el dígito siguiente a la izquierda, se busca en los sucesivos teniendo en cuenta que su valor se multiplica
por 2ª cada desplazamiento a la derecha.

Ejemplo

10

52
Sistemas de numeración y codificación de la información

Resta por complemento

Un truco para hacer la resta sin complicaciones es convertir el número a restar en su contrario, en su
“complemento” (es decir, cambiar los unos por ceros y los ceros por unos, excepto el número de la derecha)
y después realizamos la suma de los dos números. Con ello en lugar de hacer una resta directamente, estamos
recurriendo a la suma que parece más sencilla.

Ejemplo

Cambiamos el sustraendo por su complemento a 2. El complemento a 2 de un número binario es el


complemento a 1 más 1. Para este número nos quedaría así: 0 1 0 0 1 0 1

La resta se convierte en la siguiente suma:

Y nos sale el mismo resultado que si hacemos la resta.

i
11

53
Sistemas de numeración y codificación de la información

Complemento a uno y a dos

El complemento a uno de un número N, compuesto por n bits es, por definición, una unidad menor que el
complemento a dos:

Es decir: C1N = C2N – 1 y, por la misma razón: C2N = C1N + 1

Calculemos el complemento a uno del número 101101:

N = 101101, y su complemento a dos C2N = 01001


C1N = C2N – 1 = 010011 – 000001 = 010010
C1N = 010010

El complemento a uno de un número binario es el número resultante de invertir los UNOS y CEROS de dicho
número.

Ejemplo

Si: N = 110100101, obtenemos su complemento a uno invirtiendo ceros y unos, con lo que resulta:
C1N = 001011010
Y su complemento a dos es: C2N = C1N + 1 = 001011011

Sistema de Numeración Hexadecimal

En el sistema hexadecimal los números se representan con dieciséis símbolos:


0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E y F. Se utilizan los caracteres A, B, C, D, E y F representando las
cantidades decimales 10, 11, 12, 13, 14 y 15 respectivamente (porque no hay dígitos mayores que 9 en el
sistema decimal). El valor de cada uno de estos símbolos depende, como es lógico, de su posición, que se
calcula mediante potencias de base 16.

i
12

54
Sistemas de numeración y codificación de la información

Es posible para los humanos trabajar con este sistema de numeración tan complejo conociendo las
equivalencias y transformaciones posibles. Como sabemos cualquier dígito de un número del sistema
hexadecimal, como en el sistema decimal, tiene un valor relativo o posicional en función de la base 16.

Por ello, el número hexadecimal 2CA equivale al 714 en decimal:

Suma y resta en el Sistema Hexadecimal

Ejemplo de suma en Hexadecimal

i
13

55
Sistemas de numeración y codificación de la información

Ejemplo de resta en Hexadecimal

Cuadro de conversiones directas

Como recordarás, el Teorema Fundamental de la Numeración afirma qué cantidad expresada en cualquier
sistema de numeración se puede convertir a cualquier otro sistema de numeración obteniéndose valores
perfectamente equivalentes.

Para convertir un numero en b1 a otra base cualquiera b2, hay que pasarlo primero a base 10 y luego a la
base deseada. A continuación se muestra un recuadro con las conversiones más directas:

14

56
Sistemas de numeración y codificación de la información

Conversión Decimal-Binario

Para la conversión de decimales a binarios se hacen divisiones sucesivas por 2 y como resultado se recoge el
último cociente y todos los restos, colocándolos en orden inverso a como se obtuvieron.

Ejemplo: Convertir el número decimal 1992 a binario.

Conversión Decimal-Hexadecimal

Para la conversión de decimales enteros a hexadecimal, recurrimos al método de las divisiones sucesivas por
16.

i
15

57
Sistemas de numeración y codificación de la información

Se divide el número decimal y los cocientes sucesivos por 16 hasta obtener un cociente igual a cero. El
número hexadecimal buscado será el compuesto por todos los restos obtenidos en orden inverso a su
obtención.

Ejemplo: Convertir el número decimal 1000 a hexadecimal.

Conversión Binario-Hexadecimal

La conversión de números binarios a hexadecimales se realiza "expandiendo" o "contrayendo" cada dígito


hexadecimal a cuatro dígitos binarios.

Por ejemplo, para expresar en hexadecimal el número binario 1010011100112 bastará con tomar grupos de
cuatro bits, empezando por la derecha, y reemplazarlos por su equivalente hexadecimal:

i
16

58
Sistemas de numeración y codificación de la información

En caso de que los dígitos binarios no formen grupos completos de cuatro dígitos, se deben añadir ceros a la
izquierda hasta completar el último grupo. Por ejemplo:

Ejemplo de transformación directa, agrupando de 4 en 4 bits:

Conversión Hexadecimal-Binario

La conversión de números hexadecimales a binarios se hace del mismo modo, reemplazando cada dígito
hexadecimal por los cuatro bits equivalentes de la tabla.

Para convertir a binario, por ejemplo, el número hexadecimal 1F616 hallaremos en la tabla las siguientes
equivalencias

i
17

59
Sistemas de numeración y codificación de la información

Otro ejemplo de transformación directa apoyándonos en la tabla de equivalencias de arriba, 4 bits por cada
hexadecimal.

i
18

60
Sistemas de numeración y codificación de la información

2. Codificación de la información y formatos de almacenamiento


Los códigos a través de la historia I

En éste te mostraremos las diferentes códigos utilizados por los ordenadores, ejemplos de su representación
y los formatos internos de almacenamiento de datos en la memoria.

Código es el término genérico para nombrar las instrucciones del programa, utilizadas en dos sentidos
generales: código fuente y código máquina ejecutable.

El ordenador no fue el primer dispositivo en utilizar este recurso. En la década de los años 50, las grandes
empresas utilizaron ampliamente las máquinas tabuladoras IBM para realizar listados y cálculos de
contabilidad, hasta que fueron sustituidas por los ordenadores personales de mesa o PCs. Esas máquinas
empleaban tarjetas perforadas para tabular los datos.

i
19

61
Sistemas de numeración y codificación de la información

Las tarjetas IBM (también conocidas como tarjetas de código Hollerith), tenían 80 columnas a todo lo ancho
con doce posiciones predeterminadas en cada una de las columnas para ubicar las perforaciones. Por medio
de una máquina perforadora provista de un teclado de máquina de escribir, se introducían los datos
perforando las tarjetas. Una sola perforación en una columna correspondía a un número, mientras que dos
perforaciones en diferentes posiciones de una misma columna correspondían a una letra.

Los códigos a través de la historia II

En la década de 1960, se adoptó el código ASCII como nuevo estándar. ASCII es un código de caracteres basado
en el alfabeto latino tal como se usa en inglés moderno y en otras lenguas occidentales.

Fue creado en 1963 por el Comité Estadounidense de Estándares (ASA, conocido desde 1969 como el Instituto
Estadounidense de Estándares Nacionales, o ANSI) como una refundición o evolución de los conjuntos de
códigos utilizados entonces en telegrafía. Más tarde, en 1967, se incluyeron las minúsculas, y se redefinieron
algunos códigos de control para formar el código conocido como US-ASCII.

i
20

62
Sistemas de numeración y codificación de la información

ASCII fue publicado como estándar por primera vez en 1967 y fue actualizado por última vez en 1986. En la
actualidad define códigos para 33 caracteres no imprimibles, de los cuales la mayoría son caracteres de
control obsoletos que tienen efecto sobre cómo se procesa el texto, más otros 95 caracteres imprimibles que
les siguen en la numeración (empezando por el carácter espacio).

El Código ASCII

Un mapa de caracteres ASCII es una manera de mantener todos los caracteres imprimibles o mostrados por
pantalla en una lista.

Para formar cada carácter alfanumérico, es decir una letra, número o signo, los ingenieros informáticos,
después de realizar muchas pruebas, optaron por combinar ocho bits o cadena de ceros y unos para formar
un “octeto” al que denominaron “byte”. A cada carácter alfanumérico le asignaron un byte de información
y estructuraron 256 valores binarios distintos en un código que llamaron ASCII.

i
21

63
Sistemas de numeración y codificación de la información

En el Código ASCII los valores binarios entre 0 y 31 corresponden a instrucciones, entre 32 y 127 corresponden
al alfabeto alfanumérico y entre 128 y 255 a caracteres de otros idiomas y signos menos convencionales

22

64
Sistemas de numeración y codificación de la información

El Código ASCII y su equivalencia en Binario

Cada uno de los caracteres alfanuméricos del Código ASCII equivale a un Byte de información, aunque el
número binario correspondiente al decimal no ocupe ocho cifras.

En el código binario, el número “0” corresponde igualmente al "0" y el “255” al "1111 1111". En la tabla
podemos ver la representación de algunos números decimales y sus equivalentes en Binario y en Octeto
formando Bytes en código ASCII.

El código ASCII comprende sólo hasta el número decimal 255, porque a partir de ahí, el número 256 en binario
pasa a ser 1 0000 0000, sobrepasando los ocho dígitos requeridos para completar un byte de información.

i
23

65
Sistemas de numeración y codificación de la información

Origen del Código EBCDIC

El Código EBCDIC tiene como objetivo la representación de caracteres alfanuméricos, controles y signos de
puntuación.

Cada carácter está compuesto por 8 bits = 1 byte, por eso EBCDIC define un total de 256 caracteres. Gracias
a él, será posible almacenar letras mayúsculas, caracteres especiales, etc. , para los dispositivos de E/S.
Aunque EBCDIC no se utiliza mucho en las microcomputadoras, es conocido y aceptado internacionalmente,
sobre todo como código de IBM para los mainframes y minicomputadoras de la compañía.

Fue ideado entre 1963 y 1964 IBM y anunciado con el lanzamiento de la línea de ordenadores IBM System/360.
IBM adaptó el EBCDIC del código de tarjetas perforadas y lo promulgó como una táctica de control de clientes
cambiando el código estándar ASCII ampliándolo a 256 caracteres.

i
24

66
Sistemas de numeración y codificación de la información

Características del Código EBCDIC

Cuando fue ideado, el EBCDIC hizo relativamente fácil incorporar datos en un ordenador con las tarjetas
perforadas. Puesto que estas tarjetas han quedado obsoletas, el EBCDIC se utiliza en arquitecturas modernas
solamente para la compatibilidad con aparatos antiguos.

Características

- No tiene ninguna ventaja técnica sobre las páginas de código ASCII, tales como la serie ISO-8859.

- La mayoría de los codepages de EBCDIC permiten utilizar solamente hasta 2 idiomas (inglés y otra
lengua) en un archivo de base de datos o de texto.

- Cuando se requiere utilizar texto multilingüe, es necesario un sistema de apoyo con más caracteres,
generalmente una versión de Unicode.

- Existen muchas versiones ("codepages") de EBCDIC con caracteres diferentes, respectivamente


sucesiones diferentes de los mismos caracteres. Por ejemplo, al menos hay 9 versiones nacionales de
EBCDIC con Latín 1 caracteres con sucesiones diferentes.

- Para ver los valores del código EBCDIC más utilizados en programación y edición de programas

- Para ver la equivalencia de la mayoría de los caracteres que se utilizan, tanto en el código ASCII
como en el código EBCDIC,

25

67
Sistemas de numeración y codificación de la información

Cómo se traduce la información en Códigos ASCII y EBCDIC

A continuación veamos cómo se traduce la información en los diferentes códigos que acabamos de ver.

La siguiente tabla nos muestra cómo está subdividido un OCTETO de cara a la construcción de los distintos
valores de los distintos códigos existentes:

i
26

68
Sistemas de numeración y codificación de la información

Por ejemplo, cuando se escribe en el teclado la letra “A” mayúscula, se generan automáticamente 8 bits u
octeto, equivalentes a un byte, que representan esa letra.

El código numérico que se genera, para que el ordenador reconozca que se ha escrito la letra “A” , es: 0100
0001. Cada uno de los bits correspondientes a los dígitos “1” contenidos en ese byte de información generan
pulsos eléctricos, mientras que los representados por el dígito “0” no generan prácticamente ningún pulso
eléctrico.

Según lo anterior, veamos cómo quedaría almacenada en código ASCII y en código EBCDIC una frase con el
texto siguiente

“ LA PROGRAMACION ES TAN FACIL COMO ====> 1 + 1 = 2 ”

Traducido a Código ASCII

i
27

69
Sistemas de numeración y codificación de la información

Traducido a Código EBCDIC

Orden de datos en función del código

En cualquier circuito electrónico digital, como el que posee el ordenador, el bit “0” puede estar en ocasiones
cercano a “0” volt y el bit “1” cercano a 3 ó 5 volt, de forma tal que la tensión o voltaje que pueda llegar a
tener el dígito “0” nunca llegará a alcanzar un valor alto, ni el dígito “1” un valor muy bajo.

i
28

70
Sistemas de numeración y codificación de la información

Gracias a ese mecanismo el circuito digital puede diferenciar perfectamente el valor correspondiente a estos
dos dígitos sin equivocarse, por lo que el riesgo de que se produzcan confusiones o errores a la hora de
reconocer el valor de ambos es prácticamente nula.

Combinación de pulsos y no pulsos eléctricos 0100 0001


I
MEMORIA RAM
I
A

Cuando la memoria RAM del ordenador recibe una combinación de pulsos y no pulsos eléctricos
correspondientes a los unos y los ceros que forman el byte 0100 0001, reconoce que le están enviando el
código correspondiente a la letra “A”. De esa forma lo descifra y retiene como tal, permitiendo, a su vez,
que esa letra se pueda representar en la pantalla del monitor.

Formatos internos de almacenamiento de los datos en memoria.

Ahora veremos los tres formatos clásicos de almacenamiento que existen para guardar los datos en memoria.
Ello nos dará una mejor idea de cómo funcionan los bits y los bytes en el ordenador.

Existen distintos formatos de almacenamiento de datos. Estos formatos son:

i
29

71
Sistemas de numeración y codificación de la información

1. FORMATO ZONA para valores alfanuméricos


A razón de 1 carácter por octeto. (Cada uno de los caracteres del código EBCDIC ó ASCII se almacenan en un
BYTE de memoria).

2. FORMATO ZONA para valores numéricos


El signo +, - o absoluto se localiza en los 4 primeros bits del último octeto de la cifra, de esta forma:

Signo + = C 1100
Signo - = D 1101
Signo absoluto = F 1111

i
30

72
Sistemas de numeración y codificación de la información

3. FORMATO DE ALMACENAMIENTO EMPAQUETADO para valores numéricos


Se almacenan a razón de 2 dígitos por octeto, excepto el octeto extremo derecha que contiene un sólo
dígito y el signo.

El signo: +, -, o absoluto, se localiza en los 4 últimos bits del último octeto de la cifra, con las mismas
configuraciones de bits que en FORMATO ZONA (C, D o F).

i
31

73
Sistemas de numeración y codificación de la información

4. FORMATO DE ALMACENAMIENTO BINARIO PURO para valores numéricos


Es el formato que más se utiliza en los lenguajes más recientemente creados. Los valores numéricos son
almacenados en formato binario puro. Es decir, el valor numérico decimal, antes de almacenarse es traducido
al sistema numérico en base 2 (ceros y unos).

Son campos de "longitud fija" a razón de:

2 Octetos: Media palabra (de 1 a 4 dígitos)


4 Octetos: Una palabra (de 5 a 9 dígitos)
8 Octetos: Doble palabra (de 10 a 18 dígitos)

El signo: + o - , se localiza en este tipo de campos en el primer bit del primer octeto de la izquierda. Véase
el ejemplo:

i
32

74
Sistemas de numeración y codificación de la información

3. Resumen

Has llegado al final de esta lección de formación que denominamos “Sistemas de numeración y codificación
de la información”.

A continuación te invitamos a realizar un repaso de los contenidos estudiados a lo largo de la misma.

i
33

75
INTRODUCCIÓN
A LA
PROGRAMACIÓN

76
ÍNDICE
INTRODUCCIÓN A LA PROGRAMACIÓN

1. Estructura de un Programa: Datos e Instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3


2. Flujogramas y Pseudocódigos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7
3. Elementos básicos de programación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15
4. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .29

77
Introducción a la programación

1. Estructura de un Programa: Datos e Instrucciones


Objetivos

A lo largo de éste te mostraremos qué es un programa y sus características.

Programas del ordenador

Un ordenador, básicamente es capaz de realizar solo tres cosas: operaciones aritméticas muy básicas,
operaciones de tipo lógico (comparar dos valores) y almacenar o recuperar (copiar) información. Estas tres
operaciones convenientemente ligadas entre sí forman lo que llamamos programas.

i
3

78
Introducción a la programación

Un programa en definitiva es un conjunto de órdenes que ejecuta el ordenador para conseguir un objetivo.
Las órdenes se dan a través de un lenguaje de programación (códigos). Esencialmente un programa es un
conjunto de instrucciones destinadas a realizar una tarea. De forma general este conjunto de instrucciones
toma unos datos de entrada y devuelve unos datos de salida, unos resultados.

Un ordenador funciona bajo control de un programa que debe estar almacenado en la unidad de memoria
masiva, como puede ser un disco duro, un disquete, un disco óptico, etc. Este software, o parte de él, es
cargado en la memoria electrónica del ordenador para su posterior ejecución.

Fases del diseño y creación de programas

Puesto que el objetivo de un programa es realizar una tarea, ésta debe ser hecha en un tiempo finito. Además
es razonable pensar que dados unos mismos datos de entrada al programa siempre se obtengan unos mismos
datos de salida, ya que el programa está destinado a realizar una tarea definida explícitamente. Así pues,
para nuestros propósitos, un programa debe cumplir con el algoritmo a partir del cual se diseño. Cualquier
conjunto de instrucciones que no cumpla esto será considerado como un programa incorrecto o simplemente
no será considerado como tal.

i
4

79
Introducción a la programación

Especificaciones de los programas

El programador debe establecer el conjunto de especificaciones que debe contener el programa y las
entradas, salidas y algoritmos de resolución que incluirán las técnicas para obtener las salidas a partir de las
entradas.

Se debe establecer de dónde provienen las entradas al programa, es decir, los dispositivos de entrada como
el teclado, disco, etc. Las salidas de datos se deben presentar en dispositivos de salida como impresora,
monitor o disco.

i
5

80
Introducción a la programación

Instrucciones de los programas

El proceso de algoritmo o de codificación del programa consiste en definir las acciones o instrucciones que
resolverán el problema.

Las instrucciones se deben escribir y almacenar en memoria en el mismo orden en el que han de ejecutarse
es decir en secuencia. Un programa puede ser lineal o no lineal, el lineal es el que las instrucciones se den
en secuencia sin bifurcación, no lineal es si tienen bifurcación.

Tipos de instrucciones

Las instrucciones son las acciones básicas que se pueden implementar de manera general en un algoritmo y
que esencialmente soportan todos los lenguajes (son independientes del lenguaje de codificación).

- Instrucciones de inicio/fin
- Instrucciones de asignación
- Instrucciones de lectura
- Instrucciones de escritura

Para diseñar o crear nuestros programas podemos recurrir a dos herramientas básicas, los diagramas de flujo
y los pseudocódigos que veremos a continuación.

i
6

81
Introducción a la programación

2. Flujogramas y Pseudocódigos
Diagrama de flujo: Ordinograma

Uno de los procedimientos más conocidos y utilizados para resolver problemas se llama Diagrama de Flujo o
Flujogramas. Hasta la década de los 90 era uno de las más usados y aún cuando en la actualidad esta técnica
no es la más adecuada, debido a su sencillez es una de las más utilizadas.

Uno de los diagramas de flujos más utilizado es el ordinograma.

Ordinograma es un diagrama de flujos que muestra la secuencia lógica y


detallada de las operaciones que necesitamos para la realización de un
programa.

En programación, antes de escribir un programa en un lenguaje de programación específico (C, Pascal,


COBOL, etc.), es conveniente diseñar un algoritmo para definir los pasos o acciones que debe llevar a cabo
el programa en cuestión. Pues bien, dicho algoritmo se suele diseñar utilizando pseudocódigo o, también,
un ordinograma. Mediante un ordinograma se puede representar el mismo algoritmo, pero, de manera
gráfica. Como suele decirse “una imagen vale más que mil palabras”.

i
7

82
Introducción a la programación

Características de un Ordinograma

El Ordinograma es independiente del lenguaje de programación que usemos y debe estar compuesto por:

Los elementos básicos para crear Ordinogramas, son bastante intuitivos y se entienden con bastante facilidad.
Observa el resumen de los símbolos más importantes.

i
8

83
Introducción a la programación

Reglas de un Ordinograma

A la hora de hacer un Ordinograma, se deben respetar ciertas reglas:

- Todos los símbolos utilizados deben estar unidos por líneas de flujo solo horizontales y/o verticales.

- No se pueden cruzar las líneas de flujo. Evitar los cruces.

- No deben quedar líneas de flujo sin conectar.

- A un símbolo de proceso pueden llegarle varias líneas de flujo pero sólo puede salir una de él.

- Al símbolo de inicio no puede llegarle ninguna línea de flujo

- De un símbolo de fin no puede salir ninguna línea de flujo pero sí le pueden llegar varias.

- Se deben trazar los símbolos de manera que se pueda leer de arriba abajo y de izquierda a derecha.

Este símbolo se utiliza para


representar la pantalla del
ordenador

i
9

84
Introducción a la programación

Ejemplo de un Ordinograma

Veamos otro ejemplo de diseño utilizando diagramas de flujo para dar solución al algoritmo de calcular áreas
de triángulos.

En este ejemplo, suponemos que a partir de un fichero con información de Identificación del triángulo además
de la base y la altura de distintos triángulos, se irán leyendo los distintos registros con esta información y se
irá grabando en el dispositivo de salida el área de cada uno de esos triángulos. El proceso continuará hasta
que se terminen de leer todos los registros del fichero.

i
10

85
Introducción a la programación

Veamos cómo quedaría el mismo algoritmo diseñado con un algoritmo rudimentario:

Tipos de instrucciones usando Ordinogramas

A continuación se muestran los tres tipos de instrucciones que usaremos para diseñar todos nuestros
programas utilizando los ordinogramas.

i
11

86
Introducción a la programación

Y aquí tenemos dos formatos de instrucciones repetitivas:

Flujograma v/s Pseudocódigo

Cuando logremos habilidad para desarrollar programas, es posible que no recurramos a los diagramas de
flujo y que en su lugar prefiramos hacer directamente el pseudocódigo del programa.

Flujograma

Cuando sabemos cómo resolver un problema podemos planificar y dibujar gráficamente la lógica de la
alternativa seleccionada que da solución al problema. Eso es precisamente un diagrama de flujo: la
representación gráfica de una secuencia lógica de pasos a cumplir por el ordenador para producir un resultado
esperado.

Pseudocódigo

La experiencia nos ha demostrado que resulta muy útil trasladar esos pasos lógicos planteados en el diagrama
a frases que indiquen lo mismo, es decir, hacer una codificación del programa pero utilizando instrucciones
en español, como si le estuviéramos hablando al ordenador, ordenándole qué es lo que tiene que hacer. Esto
es lo que denominamos Pseudocódigo. El pseudocódigo utiliza palabras que nos indicarán el proceso a realizar.

i
12

87
Introducción a la programación

Ventajas del Pseudocódigo y Flujograma

En la programación estructurada, la técnica desarrollada para la resolución de problemas es el pseudocódigo


y es la herramienta base de diseño en la programación actual.

Ventajas del uso de un Pseudocódigo en un diagrama de flujo

- No se requieren símbolos ni líneas de flujo.


- Cada instrucción es expresada en lenguaje cotidiano.
- Ocupa menos espacio en una hoja de papel.
- Las alteraciones en la secuencia del algoritmo son reflejadas por medio de palabras reservadas.
Permite representar en forma fácil operaciones repetitivas complejas.
- Es muy fácil pasar el pseudocódigo a un programa en alguno de los lenguajes de programación
actuales.
- Fácil comprensión, fácil seguimiento y fácil corrección y modificación. Si se siguen las reglas se puede
observar claramente los niveles que tiene cada operación.

Ventajas del uso de un Flujograma en un Pseudocódigo

- Cuando se tiene poca experiencia en programación, es mucho más claro y más intuitivo.
- Una imagen vale más que mil palabras. Son más fáciles de entender.

Ejemplo comparativo

Veamos un ejemplo para clarificar esta comparativa entre flujograma y pseudocódigo:

i
13

88
Introducción a la programación

Diseño del algoritmo

Pseudocódigo

1. Inicio
2. Escribir “Área de un triangulo”
3. Leer a, b, c
4. Calcular s=(a+b+c)/2
5. Calcular A= √(s(s-a)(s-b)(s-c))
6. Escribir A
7. Fin

Flujograma

i
14

89
Introducción a la programación

3. Elementos básicos de programación

En éste recordaremos los elementos típicos de los lenguajes de programación y los tipos de operadores,
entre otros.

Como hemos visto a lo largo de este curso, para el diseño de programas son necesarios una serie de
elementos. Recordemos cuáles son éstos:

A continuación haremos una breve revisión de cada uno de ellos.

i
15

90
Introducción a la programación

Palabras claves e identificadores

Recordemos en qué consisten las palabras claves e identificadores.

Las palabras claves son características de cada lenguaje de programación, aunque muchas son comunes a
muchos lenguajes. Todos los lenguajes tienen palabras reservadas y su utilización tiene un misión previamente
establecida. Veamos como ejemplo las 32 palabras reservadas que utiliza el lenguaje C, muchas de las cuales
son comunes a JAVA.

Palabras claves:

Identificadores:

i
16

91
Introducción a la programación

Identificadores son palabras escogidas por el programador para nombrar elementos particulares del
programa. Podemos considerar que son sinónimos de los datos. Todos los lenguajes tienen unas reglas para
dar nombres válidos a los datos. Suelen ser combinaciones de letras y números que comienzan por una letra.
Pueden usarse guiones para aportar claridad. Veamos algunos ejemplos tanto válidos como inválidos para la
mayoría de los lenguajes.

Datos

Los datos constituyen la información que procesará el programa.

Podemos nombrar datos de cualquier lenguaje de programación: numéricos, alfanuméricos o de carácter y


lógicos (booleano), y están identificados gracias a:

- LUGAR DE ALOJAMIENTO: Nombre, longitud del campo.


- CARACTERISTICAS: Clase o tipo, formato y uso del dato.
- Y PERTENENCIA: A qué familia de datos pertenece para datos compuestos.

Los datos se pueden subdividir en los siguientes campos:

- Simples
-Compuestos o registros

i
17

92
Introducción a la programación

Constantes y variables

Constantes

Las constantes son datos que no modifican su


valor a lo largo del programa. Todas las
constantes tienen un nombre y un valor
asociado.

i
18

93
Introducción a la programación

Variables

Las Variables son datos cuyo valor se va modificando a lo largo del programa. Su valor cambia o varía durante
los procesos del algoritmo. Toda variable tiene un nombre y un valor asociado.

Las variables dentro de un programa pueden tener muchas utilidades. Por ello, en función de qué uso les
demos pueden clasificarse como:

- Variables de trabajo.
- Contadores.
- Acumuladores.
- Índices o indicadores.
- Switch o interruptores.

Operadores

Los Operadores son símbolos que representan las distintas operaciones que se pueden realizar con los datos:
aritméticas, alfanuméricas, de asignación, relacionales, lógicos, etc.

i
19

94
Introducción a la programación

Orden de prioridad de todos los operadores

Los operadores no los utilizamos aisladamente, sino que solemos utilizar más de uno en una misma expresión
compleja. En este caso tendremos que tener en cuenta las normas de preferencia para no encontrarnos con
resultados no deseados. Estas normas dependen del lenguaje utilizado, pero de forma general se puede
establecer de mayor a menor prioridad de la siguiente forma:

1. Paréntesis (comenzando por los más internos) 6. Concatenación


2. Signo 7. Relacionales
3. Potencia 8. Negación NOT
4. Producto, división y módulo 9. Conjunción AND
5. Suma y resta 10. Disyunción OR

20

95
Introducción a la programación

Instrucción o sentencia

Las instrucciones o sentencias, son elementos que realizan alguna acción en concreto, es decir, son
expresiones que por sí solas llevan a cabo una tarea. Serán instrucciones secuenciales, alternativas o bucles.

Las expresiones son una combinación de palabras claves, datos y operadores.

Una expresión en cualquier lenguaje de programación es cualquier combinación de operadores, constantes


y variables. Existen distintos tipos de expresiones:

- Aritméticas
- Relacionales
- Lógicas

Expresiones aritméticas

En el mundo real tenemos que trabajar con las matemáticas, y por ello debemos saber cómo las distintas
proposiciones y formulas matemáticas se introducen en el ordenador para que las ejecute correctamente.

Los operadores son expresiones que nos permiten manipular los datos que les pasamos, cada uno de los datos
que se le pasa a un operador se llama operando, y según el número de operandos de que disponga un operador
estaremos hablando de un operador unario (un operando), binario (dos operandos), ternario...

A continuación se muestran los operadores matemáticos más normales:

i
21

96
Introducción a la programación

Expresiones aritméticas algorítmicas

Observa la siguiente expresión algebraica, en ella se pretende obtener la solución de una ecuación de segundo
grado.

Veamos otro ejemplo. La expresión algorítmica correcta a partir de la siguiente expresión algebraica:

Expresiones relacionales

En ocasiones en los programas se necesitan realizar comparaciones entre distintos valores. Esto se realiza
utilizando los operadores relacionales.

i
22

97
Introducción a la programación

Los operadores de comparación son operadores en su mayoría binarios que nos permiten comparar variables
devolviendo un valor booleano a 1 (TRUE), si se cumple la condición que expresan y a 0 (FALSE), en el caso
contrario.

Estos operadores se usan mayormente como condición para las estructuras de control (instrucciones
alternativas o repetitivas. Pulsa sobre los botones para ver algunos ejemplos.

Ejemplo 1 Ejemplo 2

i
23

98
Introducción a la programación

Expresiones y operadores lógicos

Los operadores lógicos permiten combinar los resultados de los operadores relacionales, y así ver si se
cumplen varias condiciones simultáneamente o sólo alguna de ellas.

Las funciones lógicas son aquellas que nos van a permitir dar a conocer la relación entre dos condiciones, y
en función de si el resultado es verdadero o falso se pueden realizar acciones diferentes. Estas expresiones
devuelven siempre un valor 1 (true) o 0 (false).

Los operadores lógicos son:

i, NOT, no: Negación (lo contrario)

&&, AND, y: Conjunción: todas las relaciones han de ser verdad. (1)

II, OR, o: Disyunción: alguna relación ha de ser cierta. (2)

Los operadores lógicos se fundamentan en conceptos electrónicos. Recordemos que los ordenadores están
construidos por “chips o puertas lógicas” las cuales dan lugar a poder construir fácilmente los operadores
lógicos.

1.
Operador AND (&&): Operador lógico o funtor PRODUCTO.

REGLA: todas las condiciones simples han de ser verdaderas para que la compuesta también lo sea. Sólo en
tal caso se ejecuta la parte THEN del IF.

1*1*1*1=1 1*0*1*1=0

i
24

99
Introducción a la programación

2.
Operados OR (||): Operador lógico o funtor SUMA.

REGLA: basta con que una condición sea cierta para que la condición compuesta también lo sea. En tal caso
se ejecutarán las declaraciones de la parte THEN.

0+0+1+0=1 0+0+0+0=0

Roll over Operadores lógicos

i
25

100
Introducción a la programación

Expresiones y operadores lógicos: condiciones

Las condiciones pueden ser simples o compuestas. Son compuestas si aparecen varios operadores lógicos
relacionados y su formato simplificado es el siguiente:

Orden de evaluación de condiciones

1º PARENTESIS (si hay varios niveles, de dentro hacia fuera)


2º Operadores de RELACION
3º Operador lógico NOT
4º Operador lógico AND
5º Operador lógico OR
6º A IGUALDAD de operadores, de izquierda a derecha

Ejemplo en JAVA:

if ( (b > c) && (c > d) ) || (c == e) || (e == b)

Ejemplo en COBOL:

IF ( (b > c) AND (c > d) ) OR (c == e) OR (e == b)

i
26

101
Introducción a la programación

Codificación de condiciones y Leyes Morgan

El operador lógico NOT, se usa para negar una condición simple (de relación, de clase o de nombre de
condición), o una condición compuesta y se puede codificar delante de la condición completa encerrada
entre paréntesis.

Así pues:

A OR B es lo contrario de NOT (A OR B) y viceversa.


C AND D es lo contrario de NOT (C AND D) y viceversa
NOT A AND NOT B es lo contrario de NOT (NOT A AND NOT B)
NOT C OR D es lo contrario de NOT (NOT C OR D)

Una condición compuesta puede simplificarse o si se prefiere negarse directamente, aplicando las LEYES DE
MORGAN. Veamos cómo quedaría la parte de la derecha del ejemplo de arriba, simplificando o negando estas
condiciones:

Simplificando las condiciones

NOT (A OR B) es igual que NOT A AND NOT B


NOT (C AND D) es igual que NOT C OR NOT D
NOT (NOT A AND NOT B) es igual que A OR B
NOT (NOT C OR D) es igual que C AND NOT D

Negando las condiciones

A OR B es lo contrario de NOT A AND NOT B


C AND D es lo contrario de NOT C OR NOT D
NOT A AND NOT B es lo contrario de A OR B
NOT C OR D es lo contrario de C AND NOT D

i
27

102
Introducción a la programación

Asignación de valores a las variables

En programación una de las instrucciones más comunes es la de asignación de valores a las variables y
constantes. Veamos algunos ejemplos de asignación sin centrarnos en ningún lenguaje en particular.

Ejemplos:

A = 50 ó A <= 50 ó MOVER 50 => A


Queremos decir que el valor 50 se va a copiar a la variable A.

A= B+C ó A := B + C ó Calcular A = B + C
El valor de la suma de a B y C copiará a la variable A perdiéndose el valor anterior que pudiera tener la
variable A.

Frase = “Soy programador” ó Mover “Soy programador” a Frase.

i
28

103
Introducción a la programación

4. Resumen

Has llegado al final de esta lección de formación que denominamos “Introducción a la programación”.
A continuación te invitamos a realizar un repaso de los contenidos estudiados a lo largo de la misma.

i
29

104
ARRAYS Y TABLAS

105
ÍNDICE
ARRAYS Y TABLAS

1. Aspectos Generales de Tablas o Arrays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3


2. Operaciones Típicas con Tablas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8
3. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23

106
Arrays y Tablas

1. Aspectos Generales de Tablas o Arrays.


Conceptos Básicos

Antes de comenzar, revisemos algunos conceptos básicos que necesitas conocer, para el posterior diseño de
Tablas o Arrays.

Estructura de datos constituida por un número fijo de


elementos, todos ellos del mismo tipo y ubicados en
direcciones de memoria físicamente contiguas.

i
3

107
Arrays y Tablas

Clasificación de las Tablas

Las Tablas pueden clasificarse según su estructura, dimensión, valores y número de elementos.

i
4

108
Arrays y Tablas

Representación Gráfica de Tablas Unidimensionales

Las Tablas Unidimensionales también son conocidas como vectores.

Representación Gráfica

Los elementos se almacenan en posiciones contiguas adyacentes en la memoria principal de un ordenador.

Acceso Individual a los Elementos de Tablas Unidimensionales

En las Tablas Unidimensionales, los elementos se almacenan en posiciones contiguas adyacentes en la


memoria principal de un ordenador.

Es suficiente su nombre seguido de 1 índice:

- Nombre_tabla(índice)
- Nombre_Elemento(índice)

NOTA: Algunos lenguajes consideran que el primer elemento se direcciona con valor de índice 0 (cero) y
otros con valor de índice 1.

i
5

109
Arrays y Tablas

Ejemplo

Tabla Números:

Nombre de la Tabla: Números


Tipo: Numérico entero
Tamaño: 6
Elementos de la tabla:
Numéros (1) …… 2
Numéros (2) …… 4
Numéros (3) …… 6
Numéros (4) …… 8
Numéros (5) …… 10
Numéros (6) …… 12
Numéros (1) …… 2
Dimensión: 1

Representación Gráfica de Tablas BIidimensionales

Las Tablas Bidimensionales también son conocidas como matrices. Cada elemento o alguno se sus campos es,
a su vez, una tabla.

Representación Gráfica

i
6

110
Arrays y Tablas

Acceso Individual a los Elementos de Tablas Biidimensionales

En las Tablas Bidimensionales, los elementos se almacenan en posiciones contiguas adyacentes en la memoria
principal de un ordenador.

Para acceder a uno de los elementos de una tabla es necesario utilizar 2 índices: el 1º marca la fila, el 2º la
columna:
Nombre_tabla(índice_fila, índice_columna)

Ejemplo:

Tabla Notas:Alumnos del 1 al 10:

Nombre de la Tabla: Notas


Tipo: Numérico entero
Elementos de la tabla:
Notas (4,1) …… Nota del alumno 1 en Filosofía
Notas (1,3) …… Nota del alumno 3 en Matemáticas
Notas (1,9) …… Nota del alumno 9 en Matemáticas
Dimensión: 2

ASIGNATURAS (Matemáticas, Física, historia y Filosofía)

i
7

111
Arrays y Tablas

2. Operaciones Típicas con Tablas

A partir de aquí, veremos un ejercicio de programación a partir de un Array de una dimensión (vector) de 7
elementos que contendrá los gastos de cada uno de los 7 días de la semana.

Para esto, desarrollaremos algunas de las tareas habituales que se suele necesitar realizar en la mayoría de
los programas con este tipo de datos.

- Inicializar o preparar Tablas


- Cargar una Tabla
- Recorrido o acceso secuencial a una Tabla.
- Búsqueda de un contenido dentro de uno de los elementos:
- En tablas ordenadas
- En tablas desordenadas
- Ordenar una tabla por cualquier método.
- Insertar elementos en una tabla:
- Al final de la tabla
- En una tabla ordenada en su sitio en función del orden.
- Borrar elementos de una tabla.

i
8

112
Arrays y Tablas

Inicializar o Preparar Tablas

A partir de dicha TABLA de una dimensión (vector) de 7 elementos que contendrá los gastos de cada uno de
los 7 días de la semana.

Inicializar con el valor cero en cada uno de los elementos.

PROGRAMA DE INICIALIZAR TABLAS


Inicio
Definición de Datos
TablaGastosDia(7) ‘ creación sin inicializar
TablaGastosDia(7)= 1,2,3,4,5,6,7 ‘ creación con contenido
Dia=1 ‘Indice para apuntar a cada uno de los dias

1ª forma con DO WHILE y test antes

i
9

113
Arrays y Tablas

2ª forma con DO WHILE y test después

3ª forma con FOR

i
10

114
Arrays y Tablas

4ª forma con DO UNTIL y test antes

5ª forma con DO UNTIL y test después

i
11

115
Arrays y Tablas

Programas de Cargar/Rellenar Tablas

Una tabla se puede cargar/rellenar/inicializar en el momento de su definición, para ello, lógicamente, se


deben conocer los datos con los que se quiere rellenar la tabla en el momento de su creación:

TablaGastosDia(7) = 40, 29, 90, 71, 28, 93, 100

Cargar una Tabla desde el Teclado (terminal)

A partir de dicho array de una dimensión (vector) de 7 elementos que contendrá los gastos de cada uno de
los 7 días de la semana.

CARGAR UNA TABLA DESDE EL TECLADO


Inicio
Definición de Datos
TablaGastosDia(7)= 40, 29, 90, 0, 0, 0, 0
Dia= 1 ‘Indice para apuntar a cada elemento
CantidadTecleada= 0
ContinuarSiNo= ”S”

i
12

116
Arrays y Tablas

1ª forma con DO WHILE y test antes

2ª forma con FOR

i
13

117
Arrays y Tablas

Cargar una Tabla desde un Fichero

En una tabla de una dimensión (vector) de 7 elementos que contendrá los gastos de cada uno de los 7 días
de la semana.

Definicion de Datos

TablaGastosDia(7)= 40, 29, 90, 0, 0, 0, 0


Dia integer, Reg_E String, FinFichero=”NO”

Pseudocodigos
Abrir FICHERO “c:\gastos.txt”
LEER_FICHERO( ) ´rellena el registro Reg_E desde fichero
Dia=1 ,
(HAYA ELEMENTOS VACIOS EN TABLA) y (HAYA REGISTROS QUE CARGAR DESDE EL FICHERO)
DO WHILE ( Dia <= 7 AND FinFichero <> “NO” )
TablaGastosDia(Dia) = Reg_E
Dia = Dia + 1
LEER_FICHERO( )
LOOP
IF ( Dia = 8 AND FinFichero=”SI” ) Then
Imprimir “ (OK) LA TABLA está totalmente LLENA”
Imprimir “ (OK) Fichero cargado completamente”
ELSEIF ( Dia = 8 AND FinFichero=”NO” ) Then
Imprimir “ERROR Tabla pequeña, quedan regs. en fichero”
ELSEIF ((((( Dia < 7 AND FinFichero = “SI” ))))
Imprimir “OK Fich.cargado y quedan elementos vacios”
END IF
Cerrar FICHERO “c:\gastos.txt”
fin

i
14

118
Arrays y Tablas

Recorrer Secuencialmente una Tabla

A partir de dicho array de una dimensión (vector) de 7 elementos que contendrá los gastos de cada uno de
los 7 días de la semana. Una vez cargado con los gastos de cada uno de los días de la semana, imprimir el
contenido de cada uno de los elementos y la suma total de todos ellos.

RECORRER SECUENCIALMENTE UNA TABLA


Inicio
Definición de Datos 1 2 3 4 5 6 7
TablaGastosDia(7)= 40, 29, 90, 71, 28, 93, 100
Dia= 1 ‘Indice para apuntar a cada elemento
TotalSemana= 0

1ª forma con DO WHILE

i
15

119
Arrays y Tablas

2ª forma con FOR

Recorrer Secuencialmente una Tabla de Izquierda a Derecha

De izquierda a derecha, mostrando/imprimiendo el valor de cada elemento.

Suponemos que la tabla puede no estar completa.

i
16

120
Arrays y Tablas

Suponemos que la tabla está completa.

Recorrer Secuencialmente una Tabla de Derecha a Izquierda

Suponemos que la tabla esta completa, si no tendremos que averiguar previamente cuál es el último elemento
con contenido

Suponemos que la tabla está completa.

Buscar un Contenido Determinado

Buscar un contenido determinado dentro de uno de los elementos, a partir de dicha TABLA de una dimensión
(vector) de 7 elementos que contendrá los gastos de cada uno de los 7 días de la semana.

i
17

121
Arrays y Tablas

Una vez cargado con los gastos de la semana, BUSCAR secuencialmente o dicotómicamente un determinado
valor introducido desde el terminal por el usuario, sabiendo que el contenido de la tabla puede no estar
ordenado en ascendente o descendente o que el contenido de la tabla si que está con “toda seguridad
ordenado”.

En ambos casos se imprimirá la posición (el índice) donde se encuentra el valor que se desea buscar, así como
su contenido para comprobar que la búsqueda ha sido efectiva.

A continuación buscaremos un contenido en:

En Tablas Desordenadas:

- Recorrido Secuencial hasta encontrar lo que buscamos

En Tablas Ordenadas:

- Recorrido Secuencial hasta encontrar lo que buscamos


- Recorrido Secuencial hasta encontrar lo que buscamos o hasta encontrar un valor Mayor que
el que buscamos.
- Búsqueda Binaria o Dicotómica.

i
18

122
Arrays y Tablas

Buscar un Contenido Determinado en una Tabla Desordenada

Veamos como buscar un contenido determinado dentro de uno de los elementos en la Tabla que puede estar
desordenada.

RECORRER SECUENCIALMENTE UNA TABLA

Definicion de Datos 1 2 3 4 5 6 7
TablaGastosDia(7)= 40, 29, 90, 71, 28, 93, 100
Dia=1 ‘Indice para apuntar a cada elemento
ValorBuscado= 0

1ª forma con DO WHILE

i
19

123
Arrays y Tablas

2ª forma con FOR

Buscar un Contenido Determinado en una Tabla Ordenada

Veamos como buscar un contenido determinado dentro de uno de los elementos en la Tabla que puede estar
desordenada.

RECORRER SECUENCIALMENTE UNA TABLA

Definicion de Datos 1 2 3 4 5 6 7
TablaGastosDia(7)= 29, 48, 90, 98, 156, 3769, 32767
Dia=1
ValorBuscado= 0

i
20

124
Arrays y Tablas

1ª forma con DO WHILE

2ª forma con FOR

( con > solo )


(El IF de abajo se podría meter aqui dentro antes del EXIT FOR
sin el ELSE)

i
21

125
Arrays y Tablas

Búsqueda Binaria o Dicotómica de Tablas

Veamos como realizar una búsqueda binaria o dicotómica de Tablas, sólo para Tablas Ordenadas.

RECORRER SECUENCIALMENTE UNA TABLA

Definicion de Datos 1 2 3 4 5 6 7
TablaGastosDia(7)= 29, 48, 90, 98, 156, 3769, 32767
Centro=0 Izqda=1 Decha=7 ((el último elemento))
ValorBuscado= 0
Encontrado=”NO” ((esto es un swtich))

Pseudocodigo

i
22

126
Arrays y Tablas

3. Resumen

¡Enhorabuena! Has llegado al final de esta lección de formación que denominamos “Arrays y Tablas”.
En esta lección hemos estudiado los siguientes contenidos:

i
23

127
FUNCIONES Y
PROCEDIMIENTOS

128
ÍNDICE
FUNCIONES Y PROCEDIMIENTOS

1. Teoría y Funciones con Funciones y Procedimientos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3


2. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .20

129
Funciones y Procedimientos

1. Teoría y Funciones con Funciones y Procedimientos


Funciones y Procedimientos

A lo largo éste te mostraremos diferentes cálculos que puedes realizar con los distintos lenguajes de
programación

- Función de cada módulo

- Realizar una operación independiente de los restantes desde el punto de vista funcional,
pero este puede estar relacionado con otros procedimientos y funciones para el
intercambio de valores de variables.

- Cualquier algoritmo se puede transformar en un procedimiento para ser utilizado


dentro de otro algoritmo mayor.

i
3

130
Funciones y Procedimientos

Parámetros Formales y Actuales

Entre los procedimientos, funciones y su entorno se producen una relación en base a un intercambio
de valores de las variables.

Variables Globales y Locales

La Variable global es aquella que puede ser utilizada (leída, modificada, etc.) a lo largo de todo el
algoritmo principal y también por cualquiera de los sub-algoritmos (entiéndase funciones y procedimientos)
que componen el algoritmo en sí.

Variable local

Aquella que sólo puede ser referenciada dentro del sub-algoritmo en el cual ha sido
declarada

i
4

131
Funciones y Procedimientos

Funciones y Ámbitos de las Variables

Para ver las funciones y el ámbito de las variables presiona cada botón

FUNCIONES

AMBITO DE LAS VARIABLES

i
5

132
Funciones y Procedimientos

Funciones y Procedimientos. Representación Grafica

Analice la representación grafica de las Funciones y Procedimientos.

i
6

133
Funciones y Procedimientos

Llamadas a Procedimientos

A través del esquema siguiente podrá ver como se realizan las llamadas a procedimientos.

i
7

134
Funciones y Procedimientos

Esquema Básico de llamadas a Procedimientos

Ahora veremos el esquema básico de llamadas a procedimientos.

i
8

135
Funciones y Procedimientos

Formato de Funciones en Visual Basic

Analizaremos en este punto el formato de funciones en visual basic.

i
9

136
Funciones y Procedimientos

Formatos de Funciones en JAVA , C y C++

En esta pantalla se presenta el esquema de FORMATOS DE FUNCIONES EN JAVA , C y C++

i
10

137
Funciones y Procedimientos

Suma de dos números. Métodos

METODO 1º)

Sin necesidad de procedimientos. Todo en el programa principal

i
11

138
Funciones y Procedimientos

METODO 2º)

Usando variables GLOBALES dentro del procedimiento.

i
12

139
Funciones y Procedimientos

METODO 3º)

Usando variables LOCALES dentro del procedimiento..

i
13

140
Funciones y Procedimientos

METODO 4º)

Pasándole los valores de las variables GLOBALES al procedimiento y ejecutándose dentro del mismo con
variables LOCALES.

i
14

141
Funciones y Procedimientos

METODO 5º)

Pasándole los valores de las variables GLOBALES a la Función y ejecutándose el proceso dentro de la misma
con variables LOCALES y una vez ejecutado se devuelve el resultado al módulo principal .

i
15

142
Funciones y Procedimientos

METODO 6º)

Pasándole los valores de las variables GLOBALES a la Función y ejecutándose el proceso dentro de la misma
con variables LOCALES y una vez ejecutado se devuelve el resultado al módulo principal .

i
16

143
Funciones y Procedimientos

Anexo Tablas y Procedimiento Versión 1

Estudia el siguiente pseudocódigo y elige las salidas correctas del procedimiento:

POSIBLES SOLUCIONES:

a)2, 4, 6, 8, 10, 12, 14, 16, 18, 20


b)4, 6, 12, 16, 21, 27, 34, 42, 51, 61
c)1, 2, 3, 4, 5, 6, 7, 8, 9, 10
d)10, 9, 8, 7, 6, 5, 4, 3, 2, 1

i
17

144
Funciones y Procedimientos

Anexo Tablas y Procedimiento Versión 2

Estudia el siguiente pseudocódigo y elige las salidas correctas del procedimiento:

POSIBLES SOLUCIONES:
e) 2, 4, 6, 8, 10, 12, 14, 16, 18, 20
f) 4, 6, 12, 16, 21, 27, 34, 42, 51, 61
g) 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
h) 10, 9, 8, 7, 6, 5, 4, 3, 2, 1

i
18

145
Funciones y Procedimientos

Anexo Tablas y Procedimiento Versión 3

Estudia el siguiente pseudocódigo y elige las salidas correctas del procedimiento:

POSIBLES SOLUCIONES:
i) 2, 4, 6, 8, 10, 12, 14, 16, 18, 20
j) 4, 6, 12, 16, 21, 27, 34, 42, 51, 61
k) 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
l) 10, 9, 8, 7, 6, 5, 4, 3, 2, 1

i
19

146
Funciones y Procedimientos

2. Resumen

¡Enhorabuena! Has llegado al final de esta lección de formación que denominamos “Arrays y Tablas”.
En esta lección hemos estudiado los siguientes contenidos:

i
20

147
LA INFORMÁTICA Y
EL MANEJO DE LA
INFORMACIÓN

148
ÍNDICE
LA INFORMÁTICA Y EL MANEJO DE LA INFORMACIÓN

1. LA INFORMÁTICA Y EL MANEJO DE LA INFORMACIÓN. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3

149
LA INFORMÁTICA Y EL MANEJO
DE LA INFORMACIÓN
1. LA INFORMÁTICA Y EL MANEJO DE LA INFORMACIÓN.

1.1. La información y el tratamiento mecanizado de la información y La Informática.

Hoy en día el uso eficaz de la información para la empresa determina en gran medida sus
beneficios, su competitividad frente a la competencia e incluso su supervivencia a corto o largo
plazo.

La informática: Es la Ciencia que estudia el tratamiento, elaboración, transmisión y utilización de


la información.

La informática es la disciplina que estudia el tratamiento automático de la información utilizando


dispositivos electrónicos y sistemas computacionales. También es definida como el procesamiento
de la información en forma automática.

El vocablo informática proviene del francés informatique, acuñado por el ingeniero Philippe
Dreyfrus en 1962. El vocablo es acrónimo de las palabras information y automatique. En lo que hoy
día conocemos como informática confluyen muchas de las técnicas y de las máquinas que el hombre
ha desarrollado a lo largo de la historia para apoyar y potenciar sus capacidades de memoria, de
pensamiento y de comunicación.

Según el Diccionario de la Real Academia Española RAE informática es el: “Conjunto de


conocimientos científicos y técnicas que hacen posible el tratamiento automático de la información
por medio de ordenadores”.

Los computadores se han convertido en una herramienta indispensable para la vida actual. La
mayor parte de los aparatos electrónicos están dotados de algún elemento de computación
(lavadoras, celulares, televisores, etc.).

De forma genérica, podemos entender el concepto de informática como aquella disciplina


encargada del estudio de métodos, procesos, técnicas, desarrollos y su utilización en ordenadores
(computadores) con el fin de almacenar, procesar y transmitir información y datos en formato
digital.

El Computador u ordenador es una maquina electrónica que procesa gran cantidad de datos en
forma rápida y segura.

150
LA INFORMÁTICA Y EL MANEJO
DE LA INFORMACIÓN

Perspectiva histórica de la automatización de los cálculos


hasta la era de la informática:

1. Ábaco: En el 3000 a. C. Era digital.


2. En el siglo XVII Pascal construye una máquina que suma y resta. Era manual.
3. Leibnitz mejora la máquina de Pascal introduciendo la multiplicación y la división
pero seguía siendo manual.
4. En el siglo XIX Babbage introduce el concepto de programa externo.
5. En el siglo XX comienza “la era de la informática” debido a Von Newman y el
desarrollo de la electrónica.

Las primeras maquinas de calculo fueron los ábacos. Luego los científicos estaban interesados en
crear una maquina calculadora que pudiera realizar cálculos matemáticos. En 1642 el filósofo y
científico francés Blaise Pascal invento la primera maquina calculadora, ella podía sumar y restar.
En 1843 apareció la maquina analítica diseñada por Charles Babbage. Esta máquina era mecánica,
luego en 1940 aparecieron las primeras computadoras electrónicas.

En los inicios del procesado de información, con la informática sólo se facilitaba los trabajos
repetitivos y monótonos del área administrativa, gracias a la automatización de esos procesos, ello
trajo como consecuencia directa una disminución de los costes y un incremento en la producción.

151
LA INFORMÁTICA Y EL MANEJO
DE LA INFORMACIÓN
En la informática convergen los fundamentos de las ciencias de la computación, la programación
y las metodologías para el desarrollo de software, la arquitectura de computadores, las redes de
datos (como Internet), la inteligencia artificial y ciertas cuestiones relacionadas con la electrónica.
Se puede entender por informática a la unión sinergia de todo este conjunto de disciplinas.

Esta disciplina se aplica a numerosas y variadas áreas del conocimiento o la actividad humana,
como por ejemplo: gestión de negocios, almacenamiento y consulta de información, monitorización
y control de procesos, industria, robótica, comunicaciones, control de transportes, investigación,
desarrollo de juegos, diseño computerizado, aplicaciones/herramientas multimedia, medicina,
biología, física, química, meteorología, ingeniería, arte, etc. Una de la aplicaciones más
importantes de la informática es facilitar información en forma oportuna y veraz, lo cual, por
ejemplo, puede tanto facilitar la toma de decisiones a nivel gerencial (en una empresa) como
permitir el control de procesos críticos.

Actualmente es difícil concebir un área que no use, de alguna forma, el apoyo de la informática;
en un enorme abanico que cubre desde las más simples cuestiones domésticas hasta los cálculos
científicos más complejos.

Entre las funciones principales de la informática se cuentan las siguientes:

- Creación de nuevas especificaciones de trabajo.


- Desarrollo e implementación de sistemas informáticos.
- Sistematización de procesos.
- Optimización de los métodos y sistemas informáticos existentes.

La aparición del ordenador y con él de la informática en la década de los años 50 estableció


nuevas bases en el tratamiento y manipulación de la información. Lo que ha permitido avances
tecnológicos jamás soñados por el hombre hasta la fecha.

152
LA INFORMÁTICA Y EL MANEJO
DE LA INFORMACIÓN
Podemos definir el ordenador como una máquina con la que automatizar el tratamiento de la
información. Debemos entender que el ordenador no es más que una herramienta de trabajo
segura y rápida, pero no tiene inteligencia, no puede pensar, solo puede realizar las pocas tareas
para las cuales ha sido programado.

El ordenador ejecuta aplicaciones que gestionan datos con el objetivo de generar información útil
a la toma de decisiones.

Datos de Entrada Salida y el proceso de la información:

Básicamente la misión del ordenador es recoger en sus dispositivos de ENTRADA algún tipo de
información, esta es elaborada con mayor o menos complejidad, es decir, es PROCESADA y después
una vez transformada es enviada a sus dispositivos de SALIDA para que los humanos la analicemos
adecuadamente.

Esquema de Entrada, Procesamiento y salida de la información.

Un ordenador, básicamente es capaz de realizar solo tres cosas: operaciones aritméticas muy
básicas, operaciones de tipo lógico (comparar dos valores) y almacenar o recuperar (copiar)
información. Estas tres operaciones convenientemente ligadas entre sí forman lo que llamamos
programas. Debemos entender que el ordenador es una máquina “tonta” solo sabe hacer lo que
le ordenemos los humanos, pero tiene la ventaja que lo hace a una velocidad increíble.

153
LA INFORMÁTICA Y EL MANEJO
DE LA INFORMACIÓN
El esquema siguiente pretende mostrar, de una forma sencilla y gráficamente las distintas partes
de la organización física de un ordenador.

El ordenador esta integrado por un conjunto de componentes relacionados y que interactúan para
realizar una tarea determinada. Sus componentes se subdividen en dos tipos de elementos. Los
consabidos elementos HARDWARE (componentes físicos) y los elementos lógicos blandos los
conocidos como SOFTWARE:

- Elementos Hardware (CPU, dispositivos periféricos)


- Elementos Software (sistema operativo y los programas).

Vemos una comparación entre los trabajos que se hacen en la vida real, por ejemplo en una
panadería típica y los que se realizan dentro del ordenador para transformar la información que le
llega a sus componentes de entrada:

154
LA INFORMÁTICA Y EL MANEJO
DE LA INFORMACIÓN
Dispositivos de Entrada/Salida del ordenador:

1.- Los Dispositivos de Entrada:

Estos dispositivos permiten al usuario del computador introducir datos, comandos y programas en el CPU. El
dispositivo de entrada más común es un teclado similar al de las máquinas de escribir. La información
introducida con el mismo, es transformada por el ordenador en modelos reconocibles. Los datos se leen de
los dispositivos de entrada y se almacenan en la memoria central o interna. Los Dispositivos de Entrada,
convierten la información en señales eléctricas que se almacenan en la memoria central.

2.- Los Dispositivos de Salida:

Estos dispositivos permiten al usuario ver los resultados de los cálculos o de las manipulaciones de datos de
la computadora. El dispositivo de salida más común es la unidad de visualización (VDU, acrónimo de Video
Display Unit), que consiste en un monitor que presenta los caracteres y gráficos en una pantalla similar a la
del televisor.

Algunos de los dispositivos y periféricos de entrada/salida más usados y conocidas a lo largo de la historia
de la informática, (sin pretensión de recogerlos todos) se relacionan en el cuadro siguiente:

Resumen de dispositivos y periféricos de entrada/salida más conocidos.

155
LA INFORMÁTICA Y EL MANEJO
DE LA INFORMACIÓN
Como se ha podido observar existen muchos tipos de dispositivos que utiliza la computadora y que son
indispensables para poder comunicarnos con la máquina. Un ejemplo muy claro lo es el Teclado y el Mouse.
A lo largo del tiempo, se ha demostrado que la tecnología avanza cada día más en busca de mejores cosas y
mayor comodidad para el usuario.

Por ello debemos tener en cuenta como utilizar los dispositivos periférico del ordenador para obtener un
mayor aprovechamiento de cada uno de estos y hacer nuestro trabajo más rápido y con la mayor comodidad
posible, para lograr facilitar nuestras labores cotidianas en las ayuda de estas maquinas.

Los Tipos de Dispositivos de Entrada, salida o entrada/salida más comunes son:

a) Teclado: El teclado es un dispositivo eficaz para introducir datos no gráficos como rótulos de imágenes
asociados con un despliegue de gráficas. Los teclados también pueden ofrecerse con características que
facilitan la entrada de coordenadas de la pantalla, selecciones de menús o funciones de gráficas.

b) Ratón ó Mouse: Es un dispositivo electrónico que nos permite dar instrucciones a nuestra computadora a
través de un cursor que aparece en la pantalla y haciendo clic para que se lleve a cabo una acción
determinada; a medida que el Mouse rueda sobre el escritorio, el cursor (Puntero) en la pantalla hace lo
mismo. Tal procedimiento permitirá controlar, apuntar, sostener y manipular varios objetos gráficos (Y de
texto) en un programa.

156
LA INFORMÁTICA Y EL MANEJO
DE LA INFORMACIÓN
c) Micrófono, cascos, altavoces: Los micrófonos son los transductores encargados de transformar energía
acústica en energía eléctrica, permitiendo, por lo tanto el registro, almacenamiento, transmisión y
procesamiento electrónico de las señales de audio. Son dispositivos duales de los altoparlantes, constituyendo
ambos transductores los elementos mas significativos en cuanto a las características sonoras que sobre
imponen a las señales de audio.

d) Scanner: Es una unidad de ingreso de información. Permite la introducción de imágenes gráficas al


computador mediante un sistema de matrices de puntos, como resultado de un barrido óptico del documento.
La información se almacena en archivos en forma de mapas de bits (bit maps), o en otros formatos más
eficientes como Jpeg o Gif.

e) Cámara Digital. Webcam: se conecta al ordenador y le transmite las imágenes que capta, pudiendo ser
modificada y retocada, o volverla a tomar en caso de que este mal. Puede haber varios tipos. Webcam: Es
una cámara de pequeñas dimensiones. Sólo es la cámara, no tiene LCD. Tiene que estar conectada al PC para
poder funcionar, y esta transmite las imágenes al ordenador. Su uso es generalmente para videoconferencias
por Internet, pero mediante el software adecuado, se pueden grabar videos como una cámara normal y
tomar fotos estáticas.

10

157
LA INFORMÁTICA Y EL MANEJO
DE LA INFORMACIÓN
f) Pantalla o Monitor: Es en donde se ve la información suministrada por el ordenador. En el caso más habitual
se trata de un aparato basado en un tubo de rayos catódicos (CRT) como el de los televisores, mientras que
en los portátiles y en ordenadores actuales es una pantalla plana de cristal líquido (LCD).

g) Impresora: es el periférico que el ordenador utiliza para presentar información impresa en papel. Las
primeras impresoras nacieron muchos años antes que el PC e incluso antes que los monitores, siendo el
método más usual para presentar los resultados de los cálculos en aquellos primitivos ordenadores.

En nada se parecen las impresoras a sus antepasadas de aquellos tiempos, no hay duda de que igual que
hubo impresoras antes que PCs, las habrá después de éstos, aunque se basen en tecnologías que aún no han
sido siquiera inventadas.

h) Los discos magneticos: Se considera un dispositivo de almacenamiento de información magnético todo


aquel que se base en las propiedades magnéticas de algunos materiales. Un disco magnético esta constituido
por un superficie metálica, en el caso de los hard disks o plástica en el caso de los floppy disks, recubierta
por un capa de un material magnetizable, los datos se almacenan cambiando el sentido del campo magnético
de dicha sustancia, y una cabeza de lectura y grabación por cada superficie de disco (actualmente los discos
duros vienen en paquetes de varios platos), esta cabeza esta conformada por un electroimán que puede
inducir un campo magnético o detectar el sentido del cambio magnético. La cabeza se mueve radialmente

11

158
LA INFORMÁTICA Y EL MANEJO
DE LA INFORMACIÓN
mientras que el disco gira en un sentido. La información se almacena en pistas concéntricas que a su vez se
dividen en sectores que a su vez se dividen en bloques.

Dentro de los discos magnéticos existen varios tipos diferentes: Discos flexibles, Discos intercambiables,
Discos fijos, Discos con tecnología Winchester, discos externos conectables vía USB.

i) Pen Drive, Memorias FLASH, Memorias USB: Una memoria USB (de Universal Serial Bus, en inglés
pendrive o USB flash drive) es un pequeño dispositivo de almacenamiento que utiliza memoria flash para
guardar la información que puede requerir o no baterías (pilas), en los últimos modelos la batería no es
requerida, la batería era utilizada por los primeros modelos. Estas memorias son resistentes a los rasguños
(externos) y al polvo que han afectado a las formas previas de almacenamiento portátil, como los DVD y los
CDs.

12

159
LA INFORMÁTICA Y EL MANEJO
DE LA INFORMACIÓN
El Pen Drive es un dispositivo de conexión USB para almacenamiento que se puede llevar en el bolsillo y de
fácil acceso y conexión a una computadora.

Estas memorias se han convertido en el sistema de almacenamiento y transporte personal de datos más
utilizado, desplazando en este uso a los tradicionales disquetes, y a los CDs. Se pueden encontrar en el
mercado fácilmente memorias de 1, 2, 4, 8, 16, 32 GB o más (esto supone, como mínimo, el equivalente a
miles de los antiguos disquetes).

j) El disco compacto (conocido popularmente como CD, por las siglas en inglés de Compact Disc) es un
soporte digital óptico utilizado para almacenar cualquier tipo de información (audio, vídeo, documentos y
otros datos). En español o castellano, se puede escribir «cedé», aunque en gran parte de Latinoamérica (no
en España) se pronucia «sidí» (en inglés).

En un CD la información se almacena en formato digital, es decir, utiliza un sistema binario para guardar los
datos. Estos datos se graban en una única espiral que comienza desde el interior del disco (próximo al centro),
y finaliza en la parte externa. Los datos binarios se almacenan en forma de llanuras y salientes (cada una de
ellas es casi del tamaño de una bacteria), de tal forma que al incidir el haz del láser, el ángulo de reflexión
es distinto en función de si se trata de una saliente o de una llanura.

13

160
LA INFORMÁTICA Y EL MANEJO
DE LA INFORMACIÓN
k) El DVD (también conocido como “Digital Versatile Disc“ o “Disco Versátil Digital“, debido a su popular
uso en películas algunos lo llaman Disco de Video Digital) es un formato de almacenamiento óptico que
puede ser usado para guardar datos, incluyendo películas con alta calidad de vídeo y audio. Se asemeja a
los discos compactos en cuanto a sus dimensiones físicas (diámetro de 12 u 8 centímetros), pero están
codificados en un formato distinto y a una densidad mucho mayor. A diferencia de los CD, todos los DVD
deben guardar los datos utilizando un sistema de archivos denominado UDF (Universal Disk Format), el cual
es una extensión del estándar ISO 9660, usado para CD de datos. El DVD Forum (un consorcio formado por
todas las organizaciones que han participado en la elaboración del formato) se encarga de mantener al día
sus especificaciones técnicas.

14

161
LA INFORMÁTICA Y EL MANEJO
DE LA INFORMACIÓN
1.2 El ordenador y sus componentes:
CPU, UC, UAL y dispositivos de entrada/salida de la información.

Unidad Central de Proceso (CPU o UCP):

La UCP, es la Unidad Central de proceso, tambien se la conce como CPU tomado del ingles Central Process
Unit Es el verdadero cerebro de la computadora. Su misión consiste en coordinar y controlar o realizar todas
las operaciones del sistema. Se compone de elementos cuya naturaleza es exclusivamente electrónica
(circuitos).

La figura de arriba representa el esquema básico de un ordenador

15

162
LA INFORMÁTICA Y EL MANEJO
DE LA INFORMACIÓN

Diseño interno de un microprocesador

La Unidad de control (UC).

Es el centro nervioso de la computadora; desde ella se controla y gobiernan todas las operaciones (búsqueda,
decodificación, y ejecución de la instrucción).

Las funciones principales de la Unidad de Control:

1- Identificar cual es la instrucción y la operación que conlleva la instrucción.


2- Localizar los datos u operandos.
3- Desencadenar la ejecución de la instrucción.
4- Desencadenar el almacenamiento del resultado.

Funcionamiento de la unidad de control:


El secuenciador interpreta la operación que está en el registro de instrucción y activa circuitos para ejecutar
la instrucción. Envía los operandos a la unidad aritmetico-lógica. Recoge el resultado de esta y lo envía a la
unidad de memoria. Después se almacena la siguiente instrucción en el registro de instrucción y realiza de
nuevo el proceso.

16

163
LA INFORMÁTICA Y EL MANEJO
DE LA INFORMACIÓN
La Unidad aritmético–lógica (UAL).
Es la encargada de realizar las operaciones elementales de tipo aritmético (generalmente sumas o restas) y
de tipo lógico (generalmente comparaciones).

Su función es ejecutar la operación sobre los datos que recibe de la unidad de control. Solo sabe las
operaciones suma, resta, AND (‘y’ lógica) y OR (‘o’ lógica).

Las demás operaciones las realiza a través de programas.

La Unidad Aritmético Lógica consta de dos partes:


El Banco de registros generales: Que es donde se almacenan los datos que vienen de la unidad de control.
Uno de estos registros es el acumulador que es donde se van almacenando los resultados de las operaciones.
Y el operador que es el que realiza las operaciones.

Funcionamiento:

UNIDAD ARITMÉTICO-LÓGICA (UAL)


17

164
TIPOS DE
ARCHIVOS DE
INFORMACIÓN

165
ÍNDICE
TIPOS DE ARCHIVOS DE INFORMACIÓN

1. FICHEROS Y BASES DE DATOS Y OPERACIONES TÍPICAS DE ENTRADA/SALIDA . . . . . . . . . . . . . . . .3


2. CONCEPTO DE ORGANIZACIÓN DE FICHEROS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5
3. CONCEPTO DE METODO DE ACCESO A LA INFORMACION DE LOS FICHEROS . . . . . . . . . . . . . . . . .7
4. OPERACIONES TIPICAS QUE SE HACEN CON LOS FICHEROS . . . . . . . . . . . . . . . . . . . . . . . . . . .10
5. LAS BASES DE DATOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12

166
TIPOS DE ARCHIVOS DE
INFORMACIÓN
1. Ficheros y Bases de Datos y operaciones típicas de Entrada/salida.

Todas las aplicaciones necesitan almacenar y recuperar información. En una computadora, cuando se ejecuta
una aplicación (un proceso) la información se almacena en la memoria principal electrónica del computador;
este es un tipo de memoria volátil, de forma que cuando la aplicación termina la información se pierde. Esto
es inaceptable para muchas aplicaciones, que pueden requerir que la información permanezca disponible
durante largos periodos de tiempo.
Con respecto a la memoria principal de las computadoras, se trata de un tipo de memoria electrónicas cuyas
principales características son:

- La memoria principal tiene poca capacidad de almacenamiento. No se pueden manipular grandes


cantidades de datos, ya que puede haber casos en los que no quepan en la memoria principal.

- La memoria principal es volátil.

- Acceso rápido a la información.

Otro problema es que varios procesos pueden necesitar acceder a una misma información de forma
concurrente.

Como los espacios de memoria de los procesos son privados, un proceso no puede acceder a los datos en el
espacio de memoria de otro. La solución es hacer que la información sea independiente de los procesos.

Por tanto, hay tres requisitos esenciales para almacenar información durante un tiempo indefinido:

- Debe ser posible almacenar una gran cantidad de información.

- La información debe mantenerse (persistir) tras la terminación de los procesos que la usan.

- Varios procesos deben de ser capaces de acceder a la información de forma concurrente.

La solución a estos problemas consiste en almacenar la información en discos magnéticos u otros dispositivos
en unas unidades llamadas ficheros o archivos.

Podemos definir un fichero como “la abstracción de un mecanismo que permite almacenar información
en un dispositivo y leerla posteriormente”. De igual forma podemos definir un fichero “como una
colección de información que tiene un nombre”.

167
TIPOS DE ARCHIVOS DE
INFORMACIÓN
Los fichero pueden ser leídos y escritos por cualquier proceso. Son una forma de almacenamiento
denominada memoria secundaria. Sus principales cualidades son:

- Capacidad de almacenamiento sólo limitada por el soporte físico de que se disponga.

- La información está almacenada permanentemente.

- Acceso lento a la información, ya que tiene que ser transportada desde el dispositivo externo hasta
la memoria principal para su tratamiento. Existe un área de memoria principal destinada a recibir
esta información procedente del dispositivo secundario. Esta área se denomina Buffer.

De la definición vista de fichero, se deduce que existen diferentes tipos de ficheros en función de:

- El tipo de información que contienen.

- El método de organización de la información.

En función del tipo de información que contienen los ficheros y según el método usado para guardarla
codificarla dentro de estos podemos diferenciar entre :

- Ficheros de texto: Se guarda la información en caracteres, tal y como se mostraría en pantalla.

- Ficheros binarios: Se guarda la información en binario, tal y como está en memoria

168
TIPOS DE ARCHIVOS DE
INFORMACIÓN
2. CONCEPTO DE ORGANIZACIÓN DE FICHEROS

La organización hace referencia a la forma en que los registros lógicos están almacenados, o se van a
almacenar, dentro del dispositivo de memoria auxiliar para ese fichero.

La elección de la organización de un fichero determina un mayor o menor uso de recursos del sistema, o una
mayor o menor velocidad de procesamiento así como el tipo de acceso a la hora de procesar los registros.

La organización es decidida por el analista en función del tamaño del fichero y de la volatilidad y actividad
de los registros lógicos.

Para soportar las distintas organizaciones, los sistemas operativos contienen un conjunto de rutinas
especializadas llamadas métodos de acceso (secuencial, aleatorio o los dos).

ORGANIZACIONES STANDARD DE FICHEROS (ANSI)

Son tres las organizaciones que suelen estar implementadas en todos los compiladores. (ANSI = AMERICAN
NATIONAL STANDARD INSTITUTE).

- Organización Secuencial
- Organización Indexada
- Organización Relativa

ORGANIZACION SECUENCIAL (SEQUENTIAL)

Los registros lógicos son almacenados unos detrás de otros, por orden de llegada.

Sólo se pueden procesar en forma secuencial.

Se pueden colocar en cualquier tipo de almacenamiento auxiliar.

El archivo sólo contiene registros lógicos (ninguna información secundaria).

ORGANIZACION INDEXADA (INDEXED)

Los registros son almacenados en orden ascendente de acuerdo con el contenido de un CAMPO CLAVE
predefinido, que identifica a cada registro lógico.

169
TIPOS DE ARCHIVOS DE
INFORMACIÓN
Se pueden procesar tanto secuencialmente como aleatoriamente y sólo son posible en dispositivos de acceso
directo.

También se conoce a esta organización como SECUENCIAL-INDEXADA.

Los ficheros indexados están compuestos de un área de datos y un área de índices en la cual se guarda la
clave de registro y la dirección de su posición en el área de datos. Esto permite el acceso directo a él.

ORGANIZACION DIRECTA O ALEATORIA O RELATIVA (RELATIVE)

Se basa en la división del espacio físico de que disponga el fichero, en celdas destinadas a contener un sólo
registro. Estas celdas están numeradas por el número de posición relativa en el fichero, y podrán o no
contener registro.

El usar archivos con organización relativa requiere que el programador desarrolle un algoritmo de
direccionamiento que asocie la clave de los registros lógicos con el número de posición del registro en el
fichero.

Es posible el proceso secuencial (en el orden del número de registro); también es posible el acceso directo
a un registro, ya que, el sistema operativo es capaz de calcular la dirección en el disco a partir del número
de registro.

Es imprescindible dispositivo de almacenamiento de acceso directo. Esta organización también recibe el


nombre de “aleatoria“.

170
TIPOS DE ARCHIVOS DE
INFORMACIÓN
3. CONCEPTO DE METODO DE ACCESO A LA INFORMACION DE
LOS FICHEROS.
Los métodos de acceso a ficheros son el conjunto de técnicas que tienen por objeto facilitar la búsqueda
de información dentro de la organización física de los ficheros.

Esta función la realizan el Subsistema de Gestión de Ficheros integrado en el Sistema Operativo, que actúa
como intermediario entre la “organización física” y la “organización lógica” (lo cual, es transparente al
usuario).

Los principales métodos son: ACCESO SECUENCIAL, ACCESO DIRECTO y ACCESO DINAMICO. El acceso Dinámico,
se usa, para procesar un mismo fichero empleando los dos métodos de acceso anteriores a la vez.

ACCESO SECUENCIAL (SEQUENTIAL)

Permite procesar registros secuencialmente, es decir, se leen o actualizan en el mismo orden en el que se
encuentren. Para acceder a un determinado registro es imprescindible, recorrer todos los anteriores hasta
llegar a él.

Es el tipo de acceso que se asume por defecto.

ACCESO DIRECTO (RANDOM)

Permite acceder directa y aleatoriamente a cualquier registro del fichero.

Es posible el acceso directo con ficheros Indexados (ISAM, y VSAM-KSDS) y también en ficheros Relativos (y
VSAM-RRDS).

SECUENCIAL Y DIRECTO A LA VEZ (DYNAMIC)

Este tipo de acceso en realidad es una mezcla de los dos anteriores.

Nos permite acceder directamente a un determinado registro lógico y después secuencialmente, todos los
que estén grabados a continuación de él, hasta el final del fichero.

171
TIPOS DE ARCHIVOS DE
INFORMACIÓN
CONCEPTOS BÁSICOS SOBRE FICHEROS

La información almacenada en ficheros debe ser persistente, es decir, no debe verse afectada por la creación
y finalización de los procesos. La gestión de ficheros es tarea del sistema operativo, y la parte del mismo que
realiza dicha gestión se conoce como sistema de ficheros.

Desde el punto de vista de los usuarios, el aspecto más importante de un sistema de ficheros es cómo éste
se presenta a ellos. Es decir, qué es un fichero, cómo se nombra, qué operaciones se permiten, etc. En
definitiva, al usuario le interesa saber qué es lo que puede hacer. Desde el punto de vista de los diseñadores
de sistemas, lo interesante es saber cómo está implantado el sistema de ficheros.

Veamos ahora una serie de conceptos básicos:

- Registro lógico: Un registro es una colección de información relativa a una entidad particular. Por
tanto, el registro va a contener a todos aquellos campos lógicamente relacionados, referentes a una
determinada entidad, y que pueden ser tratados globalmente por un programa. Por ejemplo la
información de un determinado alumno, que contiene los campos DNI, nombre, apellidos, fecha de
nacimiento, etc.

- Clave de un registro lógico: Una clave es un campo o conjunto de campos de datos que identifica
al registro lógico y lo diferencia del resto de registros lógicos del fichero. Por tanto, esta clave debe
ser distinta para cada registro.

- Registro activo: El registro lógico que va a procesarse en la siguiente operación del fichero.

- Apuntador: Marca interna que siempre apunta al registro lógico activo. Se incrementa
automáticamente cada vez que se procesa un registro (se lee o se escribe).

- Marca de fin de fichero: Una marca situada al final de cada fichero, para no acceder mas allá del
último registro lógico existente, ya que el tamaño del fichero no está limitado y no se conoce a
priori. Existe una función lógica, eof (end of file), que toma el valor verdadero cuando llegamos al
final del fichero y falso en caso contrario.

172
TIPOS DE ARCHIVOS DE
INFORMACIÓN
- Registro físico o bloque: Un registro físico o bloque es la cantidad más pequeña de datos que pueden
transferirse en una operación de entrada/salida entre la memoria principal del ordenador y los
dispositivos periféricos o viceversa. El tamaño del bloque o registro físico dependerá de las
características del ordenador. En la mayoría de los casos el tamaño del bloque suele ser mayor que
el del registro lógico. La adaptación consiste en empaquetar en cada bloque tantos registros lógicos
como se pueda. El empaquetamiento puede ser de tipo fuerte o débil, según que se permita o no
aprovechar el sobrante de un bloque, situando registros a caballo entre dos bloques contiguos.

- Factor de bloqueo: Factor de bloqueo es el nº de registros lógicos que puede contener un registro
físico.

173
TIPOS DE ARCHIVOS DE
INFORMACIÓN
4. OPERACIONES TIPICAS QUE SE HACEN CON LOS FICHEROS

Una vez visto lo que es un fichero y los principales conceptos al hablar de ellos, pasemos ahora a estudiarlos
desde un punto de vista operativo. Básicamente se trata de responder: ¿qué operaciones se pueden realizar
sobre un fichero?. La respuesta es:

- Creación: Para poder realizar cualquier operación sobre un fichero es necesario que haya sido creado
previamente, almacenando sobre el soporte seleccionado la información requerida para su posterior
tratamiento, como por ejemplo el nombre del dispositivo, el nombre del fichero, etc. Con
anterioridad a la creación de un archivo se requiere diseñar la estructura del mismo mediante los
campos del registro, longitud y tipo de los mismos.

- Apertura: Para poder trabajar con la información almacenada en un fichero, éste debe estar abierto,
permitiendo así el acceso a los datos, dando la posibilidad de realizar sobre ellos las operaciones de
lectura y escritura necesarias.

- Cierre: Una vez finalizadas las operaciones efectuadas sobre el fichero, éste debe permanecer
cerrado para limitar el acceso a los datos y evitar así un posible deterioro o pérdida de información.
Para cerrar un fichero previamente debe estar abierto.

- Actualización: Esta operación permite la puesta al día de los datos del fichero mediante la escritura
de nuevos registros (alta) y la eliminación (baja) o modificación de los ya existentes. La actualización
puede afectar a parte o la totalidad de los registros del fichero. Cuando se escribe un nuevo registro
en el fichero se debe comprobar que no existe previamente. La baja de un registro puede ser lógica
o física. Una baja lógica supone el no borrado del registro en el archivo. Esta baja lógica se manifiesta
en un determinado campo del registro con una bandera, indicador o “flag”, o bien con la escritura
o rellenado de espacios en blanco en el registro específico. Una baja física implica el borrado y
desaparición del registro, de modo que se crea un nuevo archivo que no incluye al registro dado de
baja.

- Consulta: Tiene como fin visualizar la información contenida en el fichero, bien de un modo
completo, bien de modo parcial.

- Borrado o destrucción: Es la operación inversa a la creación de un fichero. Consiste en la supresión


de un fichero del soporte o dispositivo de almacenamiento. El espacio utilizado por el archivo borrado
puede ser utilizado por otros archivos. Para borrar un fichero tiene que estar cerrado.

10

174
TIPOS DE ARCHIVOS DE
INFORMACIÓN
- Ordenación o clasificación: Consiste en lograr una nueva disposición sobre el soporte de los registros
de un archivo, con una secuencia de ubicación determinada por el valor de uno o varios campos.

- Compactación o empaquetamiento: Esta operación permite la reorganización de los registros de un


fichero eliminando los huecos libres intermedios existentes entre ellos normalmente ocasionados por
la eliminación de registros.

11

175
TIPOS DE ARCHIVOS DE
INFORMACIÓN
5. LAS BASES DE DATOS.

Una base de datos o banco de datos es un conjunto de datos pertenecientes a un mismo contexto y
almacenados sistemáticamente para su posterior uso. En este sentido, una biblioteca puede considerarse una
base de datos compuesta en su mayoría por documentos y textos impresos en papel e indexados para su
consulta. En la actualidad, y debido al desarrollo tecnológico de campos como la informática y la electrónica,
la mayoría de las bases de datos están en formato digital (electrónico), que ofrece un amplio rango de
soluciones al problema de almacenar datos.

Existen unos programas denominados sistemas gestores de bases de datos, abreviado SGBD, que permiten
almacenar y posteriormente acceder a los datos de forma rápida y estructurada. Las propiedades de estos
SGBD, así como su utilización y administración, se estudian dentro del ámbito de la informática.

Tipos de bases de datos.


Las bases de datos pueden clasificarse de varias maneras, de acuerdo al criterio elegido para su clasificación:

Según la variabilidad de los datos almacenados:

Bases de datos estáticas: Éstas son bases de datos de sólo lectura, utilizadas primordialmente para
almacenar datos históricos que posteriormente se pueden utilizar para estudiar el comportamiento de un
conjunto de datos a través del tiempo, realizar proyecciones y tomar decisiones.

Bases de datos dinámicas: Éstas son bases de datos donde la información almacenada se modifica con el
tiempo, permitiendo operaciones como actualización y adición de datos, además de las operaciones
fundamentales de consulta. Un ejemplo de esto puede ser la base de datos utilizada en un sistema de
información de una tienda de abarrotes, una farmacia, un videoclub, etc.

Según el contenido:

Bases de datos bibliográficas: Solo contienen un surrogante (representante) de la fuente primaria, que
permite localizarla. Un registro típico de una base de datos bibliográfica contiene información sobre el autor,
fecha de publicación, editorial, título, edición, de una determinada publicación, etc. Puede contener un
resumen o extracto de la publicación original, pero nunca el texto completo, porque sino estaríamos en
presencia de una base de datos a texto completo (o de fuentes primarias—ver más abajo). Como su nombre
lo indica, el contenido son cifras o números. Por ejemplo, una colección de resultados de análisis de
laboratorio, entre otras.

12

176
TIPOS DE ARCHIVOS DE
INFORMACIÓN
Bases de datos de texto completo: Almacenan las fuentes primarias, como por ejemplo, todo el contenido
de todas las ediciones de una colección de revistas científicas.

Modelos de bases de datos:

Además de la clasificación por la función de las bases de datos, éstas también se pueden clasificar de acuerdo
a su modelo de administración de datos.

Un modelo de datos es básicamente una “descripción” de algo conocido como contenedor de datos (algo en
donde se guarda la información), así como de los métodos para almacenar y recuperar información de esos
contenedores. Los modelos de datos no son cosas físicas: son abstracciones que permiten la implementación
de un sistema eficiente de base de datos; por lo general se refieren a algoritmos, y conceptos matemáticos.

Algunos modelos con frecuencia utilizados en las bases de datos:

- Base de datos relacional


- Bases de datos orientadas a objetos
- Gestión de bases de datos distribuida
- Bases de datos jerárquicas
- Base de datos de red
- Bases de datos documentales
- Bases de datos documentales
- Bases de datos multidimensionales

13

177
INTRODUCCIÓN
A LA
PROGRAMACIÓN

178
ÍNDICE
INTRODUCCIÓN A LA PROGRAMACIÓN

1. Concepto de algoritmo y de programa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3


2. Ciclo de vida: Fases clásicas de diseño de aplicaciones informáticas. . . . . . . . . . . . . . . . . . . . .4
3. Estructura de un Centro de Proceso de Datos. Roles habituales . . . . . . . . . . . . . . . . . . . . . . .7
4. Lenguajes de Programación. Lenguajes de bajo, medio y alto nivel . . . . . . . . . . . . . . . . . . . . .9
5. Ensambladores, Interpretes y Compiladores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15
6. Código fuente, código objeto y código ejecutable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19

179
INTRODUCCIÓN A LA
PROGRAMACIÓN
1. Concepto de algoritmo y de programa.

Un algoritmo es un método de resolución de problemas en un número finito de pasos. Un algoritmo es la


descripción exacta y sin ambigüedades de la secuencia de pasos elementales a aplicar a un proceso para, que
a partir de unos datos iniciales se obtenga la solución buscada a un problema determinado.

Un programa es la expresión de un algoritmo en un lenguaje de programación entendible por el ordenador.


Cualquier programa por muy complejo que sea, consta de: datos de entrada, instrucciones para tranformar
estos datos y obtener los resultados que se mostrarán en la salida.

Un programa en definitiva es un conjunto de órdenes que ejecuta el ordenador para conseguir un objetivo.
Las órdenes se dan a través de un lenguaje de programación (códigos).

180
INTRODUCCIÓN A LA
PROGRAMACIÓN
2. Ciclo de vida: Fases clásicas de diseño de aplicaciones informáticas.

Se conoce como ciclo de vida de un sistema informático, al conjunto de actividades a realizar desde que se
concibe la realización de un producto software hasta la retirada de de la explotación del mismo.

Análisis.-
En esta fase se establece cuál es el producto a desarrollar, siendo necesario especificar los procesos y
estructuras de datos que se van a emplear, para satisfacer las necesidades y restricciones en el desarrollo
de la aplicación. Suele ser misión del analista funcional.

Su principal objetivo es establecer QUÉ debe hacer el software a desarrollar (y no CÓMO).

- Recoger las ideas expuestas poe el cliente, y transformarlas en especificaciones válidas para el
diseñador.

- Validar con el cliente que las especificaciones realizadas por él, se ajustan a los deseos que cliente
le transmitió.

Diseño.-
En esta fase, partiendo de la información recogida en el análisis el diseñador establece CÓMO se llevan a
cabo los objetivos presentados en el Análisis. Suele ser ésta, la misión del analista orgánico.

- Todo gasto de tiempo en diseño se convierte en ahorro cuando se escriba y depura el programa.

181
INTRODUCCIÓN A LA
PROGRAMACIÓN
En esta fase se alcanza una solución óptima, detallada y con la mayor precisión posible para el desarrollo de
la aplicación. Para esta fase se utilizan principalmente dos tipos de herramientas de diseño para dar solución
a los algoritmos definidos en fases anteriores::

Pseudocódigo: El algoritmo se expresa con palabras del lenguaje común y de la forma más detallada posible.

Diagrama de flujo:

Se definen como la representación gráfica que mediante el uso de símbolos estándar conectados o unidos
mediante líneas de flujo, muestran la secuencia lógica de las operaciones o acciones que debe de realizar u
ordenador, así como la corriente o flujo de datos en la resolución de un problema.

Los diseños deben de ser normalizados para facilitar el intercambio de documentación entre el personal
informático. Los diagramas de flujo se pueden clasificar en dos grandes grupos:

- a) Organigramas
- b) Ordinogramas

Una de las principales diferencias entre ambos, es que pertenecen a diferentes fases o etapas de la resolución
de un programa. Mientras que los organigramas corresponden a la fase de análisis, los ordinogramas
corresponden a la fase de diseño. Pese a estas diferencias, en muchos ámbitos, se suele llamar
indistintamente a los dos generalizando ambos con el nombre de organigramas.

El gráfico de debajo, muestra otro esquema clásico


del ciclo de vida de las aplicaciones informáticas:

182
INTRODUCCIÓN A LA
PROGRAMACIÓN

Las otras fases del ciclo de vida de las aplicaciones informáticas son:

183
INTRODUCCIÓN A LA
PROGRAMACIÓN
3. Estructura de un Centro de Proceso de Datos. Roles habituales.

Un Centro de procesos de Datos CPD (tambien conocido como un sistema de información (SI) es un conjunto
organizado de elementos, estos elementos son de 4 tipos:

- Personas.
- Datos.
- Actividades o técnicas de trabajo.
- Recursos materiales en general (típicamente recursos informáticos y de comunicación, aunque no
tienen por qué ser de este tipo obligatoriamente).

Todo ese conjunto de elementos interactúan entre si para procesar los datos y la información (incluyendo
procesos manuales y automáticos) y distribuirla de la manera más adecuada posible en una determinada
organización en función de sus objetivos. Normalmente el término es usado de manera errónea como
sinónimo de sistema de información informático, estos son el campo de estudio de la tecnología de la
información (IT), y aunque puedan formar parte de un sistema de información (como recurso material), por
sí solos no se pueden considerar como sistemas de información, este concepto es más amplio que el de
sistema de información informático.

184
INTRODUCCIÓN A LA
PROGRAMACIÓN
Los sistemas de información tratan el desarrollo, uso y administración de la infraestructura de la tecnología
de la información en una organización.

El mayor de los activos de una compañía hoy en día es su información, representada en su personal,
experiencia, conocimiento, innovaciones (patentes, derechos de autor, secreto comercial). Para poder
competir, las organizaciones deben poseer una fuerte infraestructura de información, en cuyo corazón se
sitúa la infraestructura de la tecnología de información. De tal manera que el sistema de información se
centre en estudiar las formas para mejorar el uso de la tecnología que soporta el flujo de información dentro
de la organización.

LOS ROLES de las personas implicadas en un CPD son muchos y muy variados, pudiendo estos variar en función
de la organización en que desempeñen su trabajo. Los más habituales son:

- Director del departamento


- Gerente de cuentas claves
- Jefe de Proyectos
- Analista Funcional
- Analista Orgánico
- Analista-Programador
- Programador Senior
- Programador Junior
- Usuarios
- Técnico de sistemas de redes
- Técnico de seguridad
- Técnico de calidad software
- Jefe de explotación
- Operadores
- Administrador de Bases de Datos
- Administrador se Seguridad
- Otros 8

185
INTRODUCCIÓN A LA
PROGRAMACIÓN
4. Lenguajes de Programación. Lenguajes de bajo, medio y alto nivel.

La codificación de programas.

Consiste en la traducción de la solución obtenida a un determinado lenguaje de programación, basándonos


en las especificaciones de diseño expresadas en el cuaderno de carga, dando como resultado unas
instrucciones ejecutables por el ordenador. Asimismo, se deberán realizar las pruebas necesarias para depurar
errores y verificar la calidad de los programas.

Lenguajes de Programación.

Los lenguajes de programación son una notación para escribir programas, a través de los cuales podemos
comunicarnos con el hardware y dar así las órdenes adecuadas para la realización de un determinado proceso.

Lógicamente, para escribir los programas, aplicaciones o “softwares” que el ordenador emplea para trabajar,
el programador utiliza un lenguaje de programación denominado “de alto nivel”, que le permite crearlos
escribiendo líneas de texto codificadas. Esas líneas de texto u órdenes el programador las puede escribir, leer
y entender, no así el ordenador mientras se mantengan escritas de esa forma.

Para que el ordenador pueda entender las ordenes contenidas en un programa cualquiera escrito por el
programador en lenguaje de “alto nivel”, es necesario que otro programa denominado “compilador” las
traduzca y convierta a código máquina “de bajo nivel”. Este código, compuesto solamente de unos y ceros,
es el único que entiende el ordenador y es el que le permite interpretar las órdenes contenidas en los
programas para que las pueda ejecutar.

186
INTRODUCCIÓN A LA
PROGRAMACIÓN
Los lenguajes de programación a lo largo de la historia.

Periodo Influencias Lenguajes

1950 - 1955 Ordenadores primitivos Lenguajes ensamblador.


Lenguajes experimentales de alto nivel

1956 - 1960 Ordenadores pequeños, caros y lentos FORTRAN


Cintas magnéticas. ALGOL 58 y 60
Compiladores e intérpretes COBOL
Optimización del código. LISP

1961 - 1965 Ordenadores grandes y caros FORTRAN IV


Discos magnéticos COBOL 61 Extendido
Sistemas operativos ALGOL 60 Revisado
Lenguajes de propósito general. APL (como notación sólo)

1966 - 1970 Ordenadores de diferentes tamaños, PL/I


velocidades, y costes. FORTRAN 66 (estándar)
Sistemas caros de almacenamiento COBOL 65 (estándar)
masivo de datos. ALGOL 68
Sistemas operativos multitarea SIMULA 67
e interactivos. BASI
Compiladores con optimización. C
Lenguajes estándar, flexibles APL/360
y generales.

1971 - 1975 Micro ordenadores. PASCAL


Sistemas pequeños y baratos de COBOL 74
almacenamiento masivo de datos. PL/I
Programación estructurada.
Ingeniería del software.
Lenguajes sencillos.

10

187
INTRODUCCIÓN A LA
PROGRAMACIÓN
Periodo Influencias Lenguajes

1976 - 1980 Ordenadores baratos y potentes. ADA


Sistemas distribuidos. FORTRAN 77
Programación interactiva. PROLOG
Abstracción de datos. COBOL II
Programación con fiabifidad y fácil
mantenimiento.

1980 -1990 Ordenadores más baratos y potentes. SmallTalk


Mayor abstracción de datos. OOCOBOL
Menor costo de memorias C++
Programación Orientada o Objetos Objective C
Object Pascal (Delphi)
Visual Basic

1990 - 2008 Ordenadores más baratos y potentes. JAVA


Conexión universal. INTERNET HTML,XM
Ordenadores mucho más pequeños. JAVASCRIPT
…, …, …, … . C#
Visual Basic .NET y muchos más, …,

Tipos de lenguajes de programación.

Un lenguaje de programación es un conjunto de símbolos y caracteres combinados entre sí de acuerdo con


una sintaxis ya definida para posibilitar la transmisión de instrucciones al ordenador. Estos símbolos son
traducidos a un conjunto de señales eléctricas representadas en código binario porque es el único lenguaje
que entienden los microprocesadores.

El único lenguaje que realmente maneja una computadora es el lenguaje Máquina, este lenguaje esta
formado exclusivamente de números binarios. Además un programa en lenguaje máquina debe especificar
todos los detalles referentes al hardware, lo que hace que además de muy largo, sea dependiente de la
máquina en que se trabaje.

Por su parte un programa escrito en un lenguaje de alto nivel, esta compuesto de sentencias en un lenguaje
más cercano al lenguaje natural con respecto al primero. Un lenguaje de alto nivel es por tanto mas fácil de
entender y aprender, permite a los programadores olvidarse de los detalles del hardware y concentrarse en

11

188
INTRODUCCIÓN A LA
PROGRAMACIÓN
la lógica del programa; además produce programas que se pueden ejecutar en diferentes equipos de computo
con pocos o ningún cambio.

Tipos de lenguajes de programación:

Bajo nivel (Lenguaje máquina)


Intermedios (Lenguaje ensamblador), C
Alto nivel Gestión Científicos Propósito general y específicos

Lenguajes máquina. Lenguajes de Bajo Nivel.-

Fue el primer lenguaje utilizado en la programación de computadoras.

Son también llamados de bajo nivel por que el lenguaje que utilizan unos y ceros (sistema binario) para dar
órdenes al ordenador. Son los que más bajan al nivel hardware de la maquina, los ceros y unos son en realidad
niveles de tensión eléctrica más o menos elevada.

Es el único que entiende directamente la computadora. Utiliza el alfabeto binario que como vimos más
arriba, que consta de los dos únicos símbolos 0 y 1, denominados bits (abreviatura inglesa de dígitos binarios).

EJEMPLO:

0000 0001 1010 0001 01 A1


1000 1001 1001 1010 89 9A
0011 1010 1001 1100 3A 9C
0111 0100 0111 0000 74 70
1110 1001 0010 0000 E9 20

12

189
INTRODUCCIÓN A LA
PROGRAMACIÓN
Lenguaje de ensambladores.-

Es el primer intento de sustituir el lenguaje máquina por otro más similar a los utilizados por las personas.
Cada instrucción equivale a una instrucción en lenguaje máquina, utilizando para su escritura palabras
nemotécnicas en lugar de cadenas de bits.

Formado por nemotécnicos es decir, palabras abreviadas procedentes del inglés formadas por letras y
números (Ejemplo: MOV A, B). La programación en lenguaje ensamblador precisa de un amplio conocimiento
sobre la constitución, estructura y funcionamiento interno de un ordenador, así como un hábil manejo de
los códigos y sistemas de numeración, en especial el binario y el hexadecimal.

EJEMPLO:

INICIO: ADD B, 1
MOV A, E
CMP A, B
JE FIN
JMP INICIO
FIN : END

Este lenguaje presenta la mayoría de los inconvenientes del lenguaje máquina:

Cada modelo de computadora tiene un lenguaje ensamblador propio diferente del de los demás, por lo cual
un programa sólo puede utilizarse en la máquina para la cual se programó.

El programador ha de conocer perfectamente el hardware del equipo, ya que maneja directamente las
posiciones de memoria, registros del procesador y demás elementos físicos.

Todas las instrucciones son elementales, es decir, en el programa se deben describir con el máximo detalle
todas las operaciones que se han de llevar a cabo en la máquina para la realización de cualquier proceso.
Mínima ocupación de memoria y mínimo tiempo de ejecución en comparación con el resultado de la
compilación del programa equivalente escrito en otros lenguajes.

13

190
INTRODUCCIÓN A LA
PROGRAMACIÓN
Lenguajes de Alto Nivel.-

Se llaman lenguajes de alto nivel cuando el conjunto de órdenes que utilizan son fáciles de entender y
aprender. Además no hay incompatibilidades entre un microprocesador y otro. Como inconveniente
destacable, es la necesidad de traducir los programas escritos en un lenguaje de alto nivel a un lenguaje de
programación tan primitivo como el lenguaje máquina para que pueda ser interpretado y ejecutado por la
unidad central de proceso, lo que significa disponer necesariamente de un traductor (ensamblador,
compilador o intérprete) para cada tipo de ordenador utilizado.

Las características de los lenguajes de alto nivel son:

- Lograr independencia de la máquina, pudiendo utilizar un mismo programa en diferentes equipos


con la única condición de disponer de un programa traductor o compilador, que lo suministra el
fabricante, para obtener el programa ejecutable en lenguaje binario de la máquina que se trate.
Además, no se necesita conocer el hardware específico de dicha máquina.

- Aproximarse al lenguaje natural, para que el programa se pueda escribir y leer de una forma más
sencilla, eliminando muchas de las posibilidades de cometer errores que se daban en el lenguaje
máquina, ya que se utilizan palabras (en inglés) en lugar de cadenas de símbolos sin ningún significado
aparente.

- Incluir rutinas de uso frecuente como son las de entrada/salida, funciones matemáticas, manejo de
tablas, etc, que figuran en una especie de librería del lenguaje, de tal manera que se pueden utilizar
siempre que se quieran sin necesidad de programarlas cada vez.

14

191
INTRODUCCIÓN A LA
PROGRAMACIÓN
5. Ensambladores, Interpretes y Compiladores.

Cuando programamos en un lenguaje distinto al lenguaje máquina, los programas diseñados deben ser
traducidos a código binario, para que así las instrucciones en ellos especificadas puedan ser entendidas y
ejecutadas. El sistema o software encargado de traducir estos programas (denominados programas fuentes)
puede ser un ensamblador, intérprete o compilador.

Representación grafica de los 3 modelos de traducción a ejecutable.

Programas Ensambladores.-

Son los encargados de transformar o traducir directamente (lo que aporta al ordenador mayor velocidad de
operación) los programas escritos en ensamblador a su correspondiente en código máquina o código binario
para que puedan ser ejecutados por la CPU.

Programas Intérpretes.-

Analiza el programa fuente y lo ejecuta directamente, sin generar ningún código equivalente. Suele generar
programas más rápidos y eficientes, ya que el análisis del lenguaje fuente se hace una sola vez, durante la
generación del programa equivalente. Un intérprete es un programa de software encargado de procesar y
traducir cada instrucción o sentencia de un programa escrito en un lenguaje de alto nivel a código máquina
y después ejecutarla; es decir, que el microprocesador ejecuta la orden o instrucción una vez traducida y
después de comprobar que no existe error alguno de sintaxis. La traducción o interpretación y la ejecución
no se realizan como procesos independientes, sino en una misma operación e instrucción por instrucción,
respetando rigurosamente el orden establecido en ellas.

15

192
INTRODUCCIÓN A LA
PROGRAMACIÓN
Programas Compiladores.-

Son los traductores a lenguaje máquina de los lenguajes de alto nivel. Un compilador es un programa de
software escrito en algún lenguaje de programación cuyo objetivo es traducir el correspondiente programa
fuente (fichero constituido por un conjunto de instrucciones desarrolladas en un lenguaje de alto nivel) a su
equivalente en código máquina, también denominado programa objeto. Su misión, con otras palabras es,
analizar el programa fuente y traducirlo a otro equivalente escrito en otro lenguaje (por ejemplo, en el
lenguaje de la máquina).

La diferencia más destacable entre un compilador y un intérprete radica en que, mientras que un intérprete
acepta un programa fuente que traduce y ejecuta simultáneamente analizando cada sentencia o instrucción
por separado, un compilador efectúa dicha operación en fases independientes, primero traduce
completamente el programa fuente a código máquina y seguidamente ejecuta el programa.

Otra de las funciones del compilador además de la DEPURACIÓN SINTÁCTICA del programa FUENTE es
producir un listado indicando la línea donde se ha detectado y la regla sintáctica que se ha infringido.

Pasos para la creación de un programa ejecutable


escrito en un lenguaje de alto nivel:

1. - Escribir el código fuente (editor de texto).


2. - Compilar y Linkeditar el código
3. - Ejecutar el código que produce la compilación.

Como se ha enumerado más arriba, las Fases de creación de ejecutables son:

1. Edición:
El programador con un editor de textos genera el código fuente, en un archivo o en varios.

2. Compilación:
Cada archivo de código fuente se compila y se obtiene un archivo de código objeto.

La compilación tiene las siguientes fases:

- Análisis léxico
- Análisis sintáctico
- Análisis semántico
- Optimización
- Generación de código.

16

193
INTRODUCCIÓN A LA
PROGRAMACIÓN

Linkaje:
Se montan, enlazan y vinculan todos los códigos objeto y se genera un archivo en código máquina, capaz de
ser ejecutado en el ordenador.

Ejecución:
El sistema operativo monta en memoria el programa ejecutable y lo ejecuta.

Visto secuencialmente :

17

194
INTRODUCCIÓN A LA
PROGRAMACIÓN
Y este mismo proceso de compilación en los lenguajes de alto nivel se ve secuencialmente y con un poco
más de profundidad en el esquema siguiente:

El analizador léxico: Detecta las palabras reservadas, signos de puntuación, variables etc.

El analizador sintáctico: Comprueba que las sentencias son correctas desde el punto de vista sintáctico.

El analizador semántico: Comprueba que las sentencias son correctas desde el punto de vista semántico.

El operador de código intermedio: Realiza la primera traducción del código fuente.

El optimizador de código: Realiza mejoras en la eficiencia del programa.

El operador de código final: Realiza la última traducción dando lugar al código objeto, que es el código
escrito en lenguaje ensamblador.

18

195
INTRODUCCIÓN A LA
PROGRAMACIÓN
6. Código fuente, código objeto y código ejecutable.

Definición de conceptos de Compilación:

PROGRAMA FUENTE: Programa cuyas instrucciones están escritas en un lenguaje simbólico.

PROGRAMA OBJETO: Programa cuyas instrucciones están escritas en lenguaje reconocible por el
ordenador.

COMPILAR: Fundamentalmente acción de traducir un programa FUENTE a OBJETO.

COMPILADOR: Programa que realiza básicamente la función de traducir un programa


FUENTE a OBJETO.

Un programa FUENTE que ha sido compilado y por tanto traducido a lenguaje máquina, es decir, convertido
en programa OBJETO, es un programa que todavía no es EJECUTABLE. No es EJECUTABLE, porque está
incompleto.

Cada una de las instrucciones de un programa FUENTE, al ser ‘traducido’ a OBJETO, se ‘EXPANDEN’ en varias
INSTRUCCIONES MAQUINA. Estas instrucciones, además, son ordenadas y direccionadas secuencialmente.

Existen, sin embargo, en el programa ya compilado algunas instrucciones que necesitan un número de
instrucciones complejas para poderse EJECUTAR.

Estos conjuntos de INSTRUCCIONES MAQUINA se almacenan en unas LIBRERIAS, formando MODULOS


localizables mediante unos nombres que el compilador ‘asocia’ a determinadas instrucciones especiales.

Por tanto, en el programa OBJETO no están todavía las instrucciones de esos MODULOS, aunque estos sí
están definidos y direccionados.

Además, existen instrucciones del lenguaje de alto nivel que piden la ayuda de otros programas. Por ejemplo,
el verbo CALL. El compilador direcciona la instrucción, pero no incorpora el programa LLAMADO.

19

196
INTRODUCCIÓN A LA
PROGRAMACIÓN
El programa “LINKEDITADOR”, tiene como función básica incorporar (ENLAZAR), tanto los módulos OBJETO
definidos por el compilador, como los programas o subprogramas también llamados funciones o
procedimientos.

Con el conjunto formado por el programa OBJETO, más los módulos o librerias incorporados, más los
subprogramas añadidos, genera lo que se denomina programa EJECUTABLE.

Definición de conceptos de Linkeditación y enlace:

MODULO COBOL: Conjunto de instrucciones máquina, que son capaces de realizar la acción
pedida por un verbo COBOL.

NOMBRE MODULO: Nombre predefinido que asocia el compilador a un verbo COBOL y el


LINKEDITOR a un conjunto de instrucciones residentes en una librería.

PROGRAMA EJECUTABLE: Programa generado por el linkeditor a partir del programa OBJETO
generado por el compilador, los módulos COBOL Y LOS POSIBLES PRO-
GRAMAS LLAMADOS. El programa EJECUTABLE, como dice la palabra,
está dispuesto para realizar el proceso.

PROGRAMA LLAMANTE: Programa, en nuestro caso COBOL, que contiene una o n veces el
verbo CALL para solicitar que se le incorpore una copia del programa
indicado como operando de dicho verbo.

Ejecución y Puesta a Punto de Programas.

Una vez que el programa ha sido LINKEDITADO, ya SI se puede ejecutar.

Los PROGRAMAS que de forma automática desarrollan los Sistemas de la Compañía (nóminas, control de
producción, etc..) son, como es lógico, PROGRAMAS EJECUTABLES, que residen permanentemente en
LIBRERIAS.

Para que se ejecuten, basta con “llamarlos” o referenciarlos adecuadamente.

Sin embargo, hasta que un PROGRAMA pasa a SER EJECUTABLE, ha de recorrer un camino que podemos
definir como de PUESTA a PUNTO.

20

197
INTRODUCCIÓN A LA
PROGRAMACIÓN
Este camino a recorrer tiene como objetivo garantizar que el PROGRAMA ‘funciona’ y ‘funciona bien’. Sólo
a partir de este momento el programa podrá pasar a residir en la librería de PROGRAMAS EJECUTABLES
(programas en explotación).

Durante la PUESTA a PUNTO el programa se hará EJECUTABLE solamente el tiempo necesario para ‘probarlo’
y conseguir unos resultados. Si es necesario, se corregirán instrucciones y de nuevo se probará el Programa.

El circuito de la PUESTA a PUNTO será COMPILAR, LINKEDITAR y EJECUTAR tantas veces como se considere
necesario.

Lógicamente en esta Fase intervienen también los DATOS de ENTRADA así como los RESULTADOS.

Definición de conceptos de Ejecución y puesta apunto de programas:

PROGRAMA EJECUTABLE TEMPORAL:


Programa en situación de prueba que permanece en un disco durante el tiempo
imprescindible para que pueda ser probado.

PROGRAMA EJECUTABLE CATALOGADO:


Programa Puesto a Punto que reside permanentemente en una LIBRERIA dispuesto para SER
EJECUTADO cuando sea llamado.

CIRCUITO DE PRUEBA:
Ciclo normalmente repetitivo en el que intervienen: EL PROGRAMA FUENTE recién
corregido, que pasa a ser PROGRAMA OBJETO, a continuación PROGRAMA EJECUTABLE
(provisional) que da unos resultados revisables.

JUEGO DE FICHEROS DE PRUEBAS ENSAYO:


FICHEROS que simulan a FICHEROS REALES, como entrada de datos al programa, para
conseguir probar todas las instrucciones y todas las situaciones y “caminos” del Programa.

21

198
LA PROGRAMACIÓN
ESTRUCTURADA.
PSEUDOCÓDIGOS Y
ESTRUCTURAS
BÁSICAS

199
ÍNDICE
LA PROGRAMACIÓN ESTRUCTURADA. PSEUDOCÓDIGOS Y
ESTRUCTURAS BÁSICAS

1. Introducción a la Programación Estructurada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3


2. Instrucciones secuenciales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6
3. Instrucciones alternativas (bifurcaciones) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7
4. Instrucciones repetitivas (bucles) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11

200
LA PROGRAMACIÓN ESTRUCTURADA.
PSEUDOCÓDIGOS Y ESTRUCTURAS BÁSICAS
1. Introducción a la Programación Estructurada.

Como se vio más arriba, un algoritmo es un conjunto finito de acciones o pasos ordenados que terminan en
la solución del problema, y que nos permitan resolver cualquier problema, ya sea práctico o no. Un algoritmo
es solución para un solo problema, es decir, distintos problemas tienen sus propios algoritmos específicos para
cada uno, pero un problema puede tener uno o más algoritmos distintos como solución.

Ejemplo de Algoritmo: “Encender un fósforo”.

- Tenemos una caja de fósforos con al menos 1 fósforo en su interior.


- Abrimos la caja de fósforos.
- Introducimos dedo pulgar e índice en la caja de fósforos.
- Tomamos y sacamos un fósforo de la caja.
- Sin soltar el fósforo, deslizamos su cabeza por el costado de la caja de fósforos.
- El fósforo se enciende.

A finales de los años sesenta surgió una nueva forma de programar que no solamente daba lugar a programas
fiables y eficientes, sino que además estaban escritos de manera que facilitaba su comprensión posterior. El
teorema del programa estructurado, demostrado por Böhm-Jacopini, demuestra que todo programa puede
escribirse utilizando únicamente por tres tipos de instrucciones de control.

Esta metodología es esencial e imprescindible para la programación de los ordenadores.

En la programación estructurada, la técnica desarrollada para la resolución de problemas es el


pseudocódigo y es la herramienta base de diseño en la programación actual.

El primer paso de la realización de un programa es razonar la solución del problema para determinar:

- Las operaciones que debe realizar el ordenador, y


- En qué secuencia

Al diseñar el pseudocódigo el programador tendrá en cuenta:

- El objetivo que persigue el programa y como llegar a él, según su forma habitual de razonar.
- Siempre ayuda algo, a encontrar una solución más fácilmente, el tener en cuenta el lenguaje de alto
nivel escogido para su codificación final. De esta forma se facilita la traducción de la solución al
lenguaje final.
- También es conveniente tener presente, las limitaciones de los recursos de los ordenadores
en donde se ejecutará.

201
LA PROGRAMACIÓN ESTRUCTURADA.
PSEUDOCÓDIGOS Y ESTRUCTURAS BÁSICAS
La programación estructurada se basa en unos conceptos y unas técnicas muy básicas. Para diseñar programas
vamos a utilizar las siguientes reglas:

- Diseño descendente (TOP-DOWN). Consiste en descomponer una acción compuesta o compleja en


otras acciones más simples. Realizamos el diseño partiendo de lo más general a lo más particular
descomponiendo el problema en aproximaciones sucesivas.
- El programador sigue un razonamiento deductivo subordinando lo lo particular a lo general. De
esta forma, establece las líneas maestras de su algoritmo atendiendo a las funciones generales que
deberá hacer su programa. Debe razonar que “grandes cosas” debe hacer el programa y en que
secuencia. Así pues, utilizará en sus diseños:

- Recursos abstractos (subprogramas, rutinas, etc.).


- Refinamientos sucesivos hasta lo más elemental.

En programación y diseño de algoritmos, el diseño estructurado persigue elaborar algoritmos


que cumplan la propiedad de modularidad, para ello, dado un problema que se pretende
resolver mediante la elaboración de un programa de ordenador, se busca dividir dicho programa
en módulos siguiendo los principios de diseño de Descomposición por refinamientos sucesivos,
creación de una Jerarquía modular y elaboración de módulos Independientes.

- Teorema de la estructura: Todo programa por muy complejo que sea puede ser diseñado con solo
tres estructuras básicas:

- secuencias
- alternativas o instrucciones condicionales
- y repetitivas ligadas a condiciones (bucles o iteraciones )

Solamente con estas tres estructuras se pueden escribir todos los programas y aplicaciones posibles. Si bien
los lenguajes de programación tienen un mayor repertorio de estructuras de control, éstas pueden ser
construidas mediante las tres básicas.

Ventajas de la programación estructurada

Con la programación estructurada, elaborar programas de computador sigue siendo una labor que demanda
esfuerzo, creatividad, habilidad y cuidado. Sin embargo, con este estilo podemos obtener las siguientes
ventajas:

202
LA PROGRAMACIÓN ESTRUCTURADA.
PSEUDOCÓDIGOS Y ESTRUCTURAS BÁSICAS
- 1. Los programas son más fáciles de entender, ya que pueden ser leído de forma secuencial, sin
necesidad de hacer seguimiento a saltos de línea (GOTO) dentro de los bloques de código para
entender la lógica.

- 2. La estructura del programa es clara puesto que las instrucciones están más ligadas o relacionadas
entre sí.

- 3. Reducción del esfuerzo en las pruebas. El seguimiento de los fallos o errores del programa
(“debugging”) se facilita debido a la estructura más visible, por lo que los errores se pueden detectar
y corregir más fácilmente.

- 4. Reducción de los costos de mantenimiento de los programas.

- 5. Programas más sencillos y más rápidos (ya que es más fácil su optimización).

- 6. Los bloques de código son auto explicativos, lo que facilita a la documentación.

- 7. Los GOTO se reservan para construir las instrucciones básicas. Aunque no se usan de forma directa,
por estar prohibida su utilización, están incluidas implícitamente en las instrucciones de selección e
iteración.

- 8. Un programa escrito de acuerdo a estos principios no solamente tendra una estructura sino también
una excelente presentación.

- 9. La programación estructurada ofrece estos beneficios,pero no se la debe considerar como una


panacea ya que el desarrollo de programas es, principalmente, una tarea de dedicación, esfuerzo y
creatividad.

Inconvenientes de la programación estructurada

El principal inconveniente de este método de programación, es que se obtiene un único bloque de programa,
que cuando se hace demasiado grande puede resultar problemático su manejo, esto se resuelve empleando
la programación modular, definiendo módulos interdependientes programados y compilados por separado. Un
método un poco más sofisticado es la programación por capas, en la que los módulos tienen una estructura
jerárquica muy definida y se denominan capas.

203
LA PROGRAMACIÓN ESTRUCTURADA.
PSEUDOCÓDIGOS Y ESTRUCTURAS BÁSICAS
2. Instrucciones secuenciales.

El Teorema de la estructura afirma que todo programa por muy complejo que sea puede ser diseñado con
solo tres estructuras básicas. Las instrucciones secuenciales son una se ellas.

Y en último termino, TODO SON INSTRUCIONES secuenciales en un programa, ya que en la CPU del ordenador
todo se ejecuta secuencialmente. Una instrucción detrás de otra. El único matiz a destacar que estas
instrucciones secuenciales una veces serán muy elementales y otras veces serán más complejas.

Veamos su representación en pseudocódigo y su equivalente en ordinagrama.

204
LA PROGRAMACIÓN ESTRUCTURADA.
PSEUDOCÓDIGOS Y ESTRUCTURAS BÁSICAS
3. Instrucciones alternativas (bifurcaciones).

En el mundo real constantemente tenemos que tomar decisiones, y en función de la elección se toman
distintos caminos o acciones para dar solución a nuestros problemas diarios.

Cuando queremos plasmar estas mismas decisiones en el pseudocódigo usamos una serie de reglas muy
estandarizadas en programación.

El Teorema de la estructura afirma que todo programa por muy complejo que sea puede ser diseñado con
solo tres estructuras básicas. Las instrucciones alternativas o instrucciones condicionales o bifurcaciones
condicionales son las otras estructuras de diseño necesarias.

Siempre en las instrucciones o bifurcaciones condicionales, tendremos la posibilidad de “bifurcar” el orden


secuencial típico de los ordenadores gracias al análisis de una condición.

En función de que la condición se cumpla, (sea verdadera “trae”) o que la condición asociada al IF no se
cumpla (sea falsa) se pueden realizar las instrucciones que coloquemos en dos o más caminos alternativos.

Veamos a continuación todos los formatos conocidos de alternativas condicionales y su representación en


pseudocódigo y su equivalente en ordinagrama.

205
LA PROGRAMACIÓN ESTRUCTURADA.
PSEUDOCÓDIGOS Y ESTRUCTURAS BÁSICAS

206
LA PROGRAMACIÓN ESTRUCTURADA.
PSEUDOCÓDIGOS Y ESTRUCTURAS BÁSICAS

207
LA PROGRAMACIÓN ESTRUCTURADA.
PSEUDOCÓDIGOS Y ESTRUCTURAS BÁSICAS

10

208
LA PROGRAMACIÓN ESTRUCTURADA.
PSEUDOCÓDIGOS Y ESTRUCTURAS BÁSICAS
4. Instrucciones repetitivas (bucles).

Como razonábamos antes, en el mundo real constantemente tenemos que realizar acciones y algunas de
ellas las tenemos que repetir varias o muchas veces hasta dar por terminado una tarea.

Cuando queremos plasmar estas mismas tareas repetitivas en el pseudocódigo usamos una serie de reglas muy
estandarizadas en programación.

El Teorema de la estructura afirma que todo programa por muy complejo que sea puede ser diseñado con
solo tres estructuras básicas.

Las instrucciones repetitivas ligadas a condiciones también conocidas como instrucciones iterativas o
más coloquialmente como bucles son la tercera estructura de diseño necesarias para diseñar nuestros
programas.

Veamos todos los formatos conocidos de repetitivas y su representación en pseudocódigo y su equivalente


en ordinagrama.

11

209
LA PROGRAMACIÓN ESTRUCTURADA.
PSEUDOCÓDIGOS Y ESTRUCTURAS BÁSICAS

12

210
LA PROGRAMACIÓN ESTRUCTURADA.
PSEUDOCÓDIGOS Y ESTRUCTURAS BÁSICAS

13

211
LA PROGRAMACIÓN ESTRUCTURADA.
PSEUDOCÓDIGOS Y ESTRUCTURAS BÁSICAS

14

212
LA PROGRAMACIÓN ESTRUCTURADA.
PSEUDOCÓDIGOS Y ESTRUCTURAS BÁSICAS

Funcionamiento interno del BUCLE FOR

Se ejecutan las instrucciones de la repetitiva


mientras la condición es cierta.

15

213
LA PROGRAMACIÓN ESTRUCTURADA.
PSEUDOCÓDIGOS Y ESTRUCTURAS BÁSICAS

16

214
LA PROGRAMACIÓN ESTRUCTURADA.
PSEUDOCÓDIGOS Y ESTRUCTURAS BÁSICAS

17

215
LA PROGRAMACIÓN ESTRUCTURADA.
PSEUDOCÓDIGOS Y ESTRUCTURAS BÁSICAS

18

216
LA PROGRAMACIÓN ESTRUCTURADA.
PSEUDOCÓDIGOS Y ESTRUCTURAS BÁSICAS
Los 4 modelos o paradigmas de la programación actual se pueden ver representados gráficamente a
continuación:

Un programa secuencial es un programa que:


- Arranca
- Lee los datos que necesita
- Realiza los cálculos
- Imprime o guarda en el disco los resultados.

Mientras un programa secuencial está ejecutándose no necesita ninguna intervención del usuario.

A este tipo de programas se les llama también programas basados u orientados a procedimientos o a
algoritmos (procedural languages).

Este tipo de programas siguen utilizándose ampliamente en la actualidad, pero la difusión de los PC’s y los
GUIs (Interfaces Gráficos de Usuario) ha puesto de actualidad otros tipos de programación.

19

217
LA PROGRAMACIÓN ESTRUCTURADA.
PSEUDOCÓDIGOS Y ESTRUCTURAS BÁSICAS

Los programas interactivos exigen la intervención del usuario en tiempo de ejecución:

- Para suministrar datos


- Para indicar al programa lo que debe hacer por medio de menús.

Los programas interactivos limitan y orientan la acción del usuario.

Como en los programas secuenciales también se les llama programas basados u orientados a procedimientos
o a algoritmos (procedural languages).

Este tipo de programas siguen utilizándose ampliamente en la actualidad, pero la difusión de los PC’s y los
GUIs (Interfaces Gráficos de Usuario) ha puesto de actualidad otros tipos de programación.

20

218
LA PROGRAMACIÓN ESTRUCTURADA.
PSEUDOCÓDIGOS Y ESTRUCTURAS BÁSICAS

Los programas orientados a eventos son los programas típicos de Windows, tales como Explorer, Word,
Excel, PowerPoint, Access y otros.

Cuando uno de estos programas se ha iniciado, se queda en espera de las acciones del usuario o del sistema,
dichas acciones se denominan eventos.

El usuario decide, interactuando con el interfaz, si quiere abrir y modificar un fichero existente, o bien
comenzar a crear un fichero desde el principio, o cualquier otra acción que el programa ofrezca al usuario
mediante el interfaz. El tipo de programación que ejecuta código cuando se producen determinados eventos
es la denominada programación orientada a eventos. Un evento se produce sobre un elemento del interfaz,
y esto hace que se ejecute el código asociado a ese elemento para ese evento.

Los elementos del interfaz se denominan controles y los códigos que un control ejecuta como reacción a un
evento se llaman métodos.

Los controles tienen caracterizado su comportamiento según el estado de sus propiedades.

21

219
LA PROGRAMACIÓN ESTRUCTURADA.
PSEUDOCÓDIGOS Y ESTRUCTURAS BÁSICAS

22

220
TÉCNICAS DE
PROGRAMACIÓN
ESTRUCTURADA

221
ÍNDICE
TÉCNICAS DE PROGRAMACIÓN ESTRUCTURADA

1. TIPOS DE DATOS MÁS UTILIZADOS EN LA MAYORÍA DE LOS LENGUAJES


DE PROGRAMACIÓN (Revisión de Conceptos) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3

2. EJERCICIOS DE TEORÍA Y TÉCNICASDE PROGRAMACIÓN ESTRUCTURADA . . . . . . . . . . . . . . . . .8

222
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA
1. TIPOS DE DATOS MÁS UTILIZADOS EN LA MAYORÍA DE LOS LENGUAJES
DE PROGRAMACIÓN. (Revisión de Conceptos)

Número enteros:
Caracter Byte (1 byte) 0 a 255
Numerico Entero Integer (2 bytes) -32768 a 32767
Numerico Entero largo Long (4 bytes) -2.147.483648 a
+2.147.483647

Número decimales o reales (coma flotante):


Coma flotante. Simple Precisión Single/Float (4 bytes)
-3,40E+38 a 3,40E+38

Coma flotante. Doble Precisión Double (8 bytes) -1,79D+308 a 1,79D+308

Coma fija con 4 decimales Currency (8 bytes)


+/- 922.337.203.685.477,5807

Datos Alfanuméricos
Cadena de caracteres alfanum. String (hasta 64K. Un caracter por byte)

Datos Boleanos (verdadero/falso)


Booleano/Switch Boolean (2 bytes) True o False

Datos tipo Fechas


Fecha y Hora Date (8 bytes) desde año 100 a 9999

RESUMEN: Tipología y Tamaño de los datos

BYTE 0 a 255 BOOLEAN True / False


INTEGER -32.768 a 32.767 FLOAT Decimales
LONG INTEGER -2.147.483.648 a STRING Alfanuméricos
2.147.483.647

223
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA
LOS OPERADORES EN INFORMÁTICA: Los operadores son símbolos que sirven para conectar los datos
haciendo diversas clases de operaciones.

TIPOS DE OPERADORES DE DATOS EN INFORMÁTICA:

Prioridad de los Operadores Aritméticos

- Todas las expresiones entre paréntesis se evalúan primero. Las expresiones con paréntesis anidados
se evalúan de dentro a fuera, el paréntesis mas interno se evalúa primero.

- Dentro de una misma expresión los operadores se evalúan en el siguiente orden .

1º.- ^ Exponenciación
2º.- *, /, mod. (Multiplic., división, resto).
3º- +, -(Suma ,resta).

- Los operadores en una misma expresión con igual nivel de prioridad se evalúan de izqui. a dcha.

- Los operadores aritméticos permiten la realización de operaciones matemáticas con los valores
(variables y constantes).

- Los operadores aritméticos pueden ser utilizados con tipos de datos enteros o reales. Si ambos son
enteros, el resultado es entero; si alguno de ellos es real, el resultado es real.

224
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA

- Se utilizan para establecer una relación entre dos valores.


- Compara estos valores entre si y esta comparación produce un resultado de verdadero o falso.
- Los operadores relaciónales comparan valores del mismo tipo (numéricos o cadenas).
- Tienen el mismo nivel de prioridad en su evaluación.
- Los operadores relaciónales tiene menor prioridad que los aritméticos.

225
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA
Formatos De Las Instrucciones Utilizadas En La Programación Estructurada
Para El Diseño De Algoritmos Y Programas A Través De Pseudocódigos.

226
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA
Instrucciones Repetitivas o Instrucciones Cíclicas.

227
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA
2. EJERCICIOS DE TEORÍA Y TÉCNICAS DE PROGRAMACIÓN ESTRUCTURADA

1. Leer un número y, si es par, que lo imprima, si no, que vuelva a leer otro.
(Se leerá uno o dos números dependiendo de que meta el par a la primera).

(Ejemplo de lo que no se debe hacer en Programación estructurada).

228
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA
Versión del uno: Leer un número y, si es par, que lo imprima, si no, que vuelva a leer números
indefinidamente hasta que se introduzca un número par. Cuando se lee un par se parará el programa.

OJO: CON (numero MOD 2 = 0) EL CERO SE CUELA COMO PAR

229
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA
2. Leer dos números e imprimir el mayor de ellos.

10

230
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA
3. Leer un número, si es negativo lo imprime, si no, lee un nuevo número e imprime la suma de ambos.

11

231
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA
4. Leer TRES números y decir cual es el mayor de los tres (no se considerará la opción de iguales, es decir,
al programa llegarán siempre tres números distintos. Se da por supuesto que los tres núm. siempre serán
distintos).

12

232
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA
(4.2 continuación. Otra forma válida)

13

233
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA
(4.3 continuación.
Otra forma Válida. Aunque solo se guarda el número mayor. Los tecleados se van perdiendo. )

14

234
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA
(4.4 continuación. Otras formas Válidas. Aunque solo se guarda el número mayor.
Los tecleados se van perdiendo. CON REPETITIVAS).

15

235
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA
(4.5 continuación.
Otra forma válida EN LA QUE SE DETECTA LA POSIBILIDAD DE QUE HAYA NÚMEROS IGUALES).

Se pueden dar tres situaciones: N1 N2 N3


Que los 3 números sean iguales 1 1 1 N1=N2 Y N1=N3
Que 2 de ellos sean iguales 1 1 2 N1=N2 ó N1=N3 ó N2=N3
1 2 1
2 1 1
2 2 1
2 1 2
1 2 1
Y que los 3 sean distintos ===> Ya visto en versiones anteriores en la pizarra

16

236
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA
5. Leer dos números e imprimir todos los números naturales comprendidos entre los dos números leídos.

17

237
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA
(Tercera Versión valida : Se imprimirá del numero primero al número segundo con independencia de
cual sea el mayor y el menor).

18

238
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA
(Versiones Cuarta y quinta : Se imprimirá del numero primero al número segundo con independencia
de cual sea el mayor y el menor).

HACEN LO MISMO QUE LA VERSION ANTERIOR.

19

239
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA
(Sexta Versión: Se imprimirá del numero primero al número segundo con independencia de cual sea el
mayor y el menor).

Con WHILE y text posterior y CONTROL DE IGUALES)

20

240
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA
6. Leer el nombre de una figura geométrica (triángulo, cuadrado o pentágono) e imprimir su área.

21

241
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA
LO MISMO PERO LLAMANDO A PROCEDIMIENTOS DONDE SE DESARROLLA

22

242
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA
7. Leer un número, entre 1 y 9, e imprimir su tabla de multiplicar

NOTA: Esta es una solución válida, muy eficaz ya que no se tienen que analizar condiciones antes de hacer
la multiplicación de cada número, pero menos práctica que usar repetitivas. Si tuviesemos que hacer la tabla
de multiplicar de hasta el 1000 de un numero tecleado entre el 1 y el 9, nos veríamos obligados a repetir mil
veces esa linea en el programa, con lo que el programa fuente sería muy grande. Veamos a continuación,
otras opciones de codificación más estandarizadas.

23

243
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA

24

244
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA
OTRAS POSIBILIDADES:

(MENOS NORMALES)

25

245
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA
8. Leer un número entero positivo e imprimir su tabla de multiplicar así como la de los números anterior
y posterior al tecleado.

26

246
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA
OTRAS POSIBILIDADES: TABLA DE MULTIPLICAR DE UN NÚMERO Y DEL ANTERIOR Y DEL POSTERIOR QUE ESTE
COMPRENDIDO ENTRE EL 0 Y EL 300 Y ADEMÁS SE MULTIPLICA HASTA EL nº 20 EN LUGAR DE HASTA EL 10
Y ADEMAS SE VALIDA LA ENTRADA DE UN NÚMERO VALIDO

27

247
TÉCNICAS DE PROGRAMACIÓN
ESTRUCTURADA
OTRAS POSIBILIDADES: TABLA DE MULTIPLICAR DE UN NÚMERO Y DEL ANTERIOR Y DEL POSTERIOR QUE ESTE
COMPRENDIDO ENTRE EL 0 Y EL 300 Y ADEMÁS SE MULTIPLICA HASTA EL nº 20 EN LUGAR DE HASTA EL 10
Y ADEMAS SE VALIDA LA ENTRADA DE UN NÚMERO VALIDO

LOS TRES EN LA MISMA LINEA

28

248
EJERCICIOS DE
METODOLOGÍA DE
PROGRAMACIÓN

249
EJERCICIOS DE METODOLOGÍA
DE PROGRAMACIÓN
1. Leer un número entero e imprimir todos los NÚMEROS NATURALES comprendidos entre 1 y el número
entero leído inclusive.

250
EJERCICIOS DE METODOLOGÍA
DE PROGRAMACIÓN
2. Leer un número e imprimir todos los números PARES comprendidos entre 1 y ese número.

251
EJERCICIOS DE METODOLOGÍA
DE PROGRAMACIÓN
3. Leer un número e imprimir la suma de todos los números comprendidos entre 1 y el número leído.
Una vez terminado el programa, modificarlo para que además de la suma final imprima cada uno de los
números que se van sumando además de las sumas parciales que se van obteniendo.

252
EJERCICIOS DE METODOLOGÍA
DE PROGRAMACIÓN
4. Crear un programa que lea las edades de una serie de personas (hasta que se reciba una EDAD
NEGATIVA o CERO) y que después imprima la media de todas las edades procesadas (tecleadas).

253
EJERCICIOS DE METODOLOGÍA
DE PROGRAMACIÓN
5. Leer cinco números y si alguno de ellos es par, que imprima la suma de estos cinco números.

254
EJERCICIOS DE METODOLOGÍA
DE PROGRAMACIÓN
6. Lee las notas de los alumnos de una clase de 40 alumnos e imprime el número de aprobados y de
suspensos. Imprime además la media de los aprobados y la media de los suspensos.

255
EJERCICIOS DE METODOLOGÍA
DE PROGRAMACIÓN
7. Lee las notas (entre 0 y 10) de Matemáticas de los 40 alumnos de una clase introducidas por el
profesor e imprime la nota mayor y la nota menor.

256
EJERCICIOS DE METODOLOGÍA
DE PROGRAMACIÓN
(AQUÍ CON ALGÚN MATIZ DISTINTO)

257
EJERCICIOS DE METODOLOGÍA
DE PROGRAMACIÓN
8. El programa nada más comenzar solicita al usuario que teclee una clave o password numerica de ac-
ceso. Si esta es correcta, le pide un nuevo número y el programa imprime todos los pares menores que
ese número hasta llegar al cero (ó desde el cero hasta el número tecleado).

Si la clave no es correcta el programa vuelve a solicitar otra vez la password, hasta un máximo de 5 in-
tentos.

(Yo soy el programador y sé que la PW definida internamente es 88).

10

258
ARRAYS Y TABLAS
UNIDIMENSIONALES,
BIDIMENSIONALES,
TRIDIMENSIONALES Y
MULTIDIMENSIONALES.

259
ÍNDICE
ARRAYS Y TABLAS UNIDIMENSIONALES, BIDIMENSIONALES,
TRIDIMENSIONALES Y MULTIDIMENSIONALES.

- Ordenar una tabla por cualquier método

- Insertar un elemento en uno libre del final

- Insertar un elemento en uno de los elemento intermedios desplazando


el resto hacia el final (debe haber elem. vacios al final).

- Borrar un elemento de una tabla.

260
ARRAYS Y TABLAS UNIDIMENSIONALES, BIDIMENSIONALES,
TRIDIMENSIONALES Y MULTIDIMENSIONALES.
Programas de proposito General con TABLAS
(Arrays, Vectores, Matrices, Poliedros)
A partir de un Array de una dimensión (vector) de 7 elementos que contendrá los gastos de cada uno de
los 7 días de la semana:

Hacer la tareas habituales que se suele necesitar realizar en la mayoría de los programas con este tipo
de datos:

- ORDENAR UNA TABLA POR CUALQUIER MÉTODO

- INSERTAR UN ELEMENTO EN UNO LIBRE DEL FINAL

- INSERTAR UN ELEMENTO EN UNO DE LOS ELEMENTO INTERMEDIOS DESPLAZANDO EL RESTO HACIA


EL FINAL (DEBE HABER ELEM. VACIOS AL FINAL).

- BORRAR UN ELEMENTO DE UNA TABLA.

261
ARRAYS Y TABLAS UNIDIMENSIONALES, BIDIMENSIONALES,
TRIDIMENSIONALES Y MULTIDIMENSIONALES.
1. ORDENACION DE TABLAS (Existen múltiples Métodos)

5. A partir de dicho tabla de una dimensión (vector) de 7 elementos que contendrá los gastos de cada
uno de los 7 días de la semana.
Ordenar los elementos de la tabla e imprimirlos una vez ordenados.

Con este método en la primera pasada se compara el primer elemento con todos los demás y, al final de ésta
el valor más pequeño queda en el primer elemento. En la segunda pasada se compara el segundo elemento
con todos los demás y al final de esta el siguiente valor más pequeño queda ordenado en el segundo elemento
y así sucesivamente.

262
ARRAYS Y TABLAS UNIDIMENSIONALES, BIDIMENSIONALES,
TRIDIMENSIONALES Y MULTIDIMENSIONALES.

263
ARRAYS Y TABLAS UNIDIMENSIONALES, BIDIMENSIONALES,
TRIDIMENSIONALES Y MULTIDIMENSIONALES.

264
ARRAYS Y TABLAS UNIDIMENSIONALES, BIDIMENSIONALES,
TRIDIMENSIONALES Y MULTIDIMENSIONALES.
ORDENACION DE TABLAS (OTRO MÉTODO OPTIMIZADO)

6. A partir de dicho tabla de una dimensión (vector) de 7 elementos que contendrá los gastos de cada
uno de los 7 días de la semana.
Ordenar los elementos de la tabla e imprimirlos una vez ordenados.

Con este segundo método de ordenación, se van comparando parejas de elementos, siempre juntos. Todos
los elementos que van quedándose detrás, van quedando ordenados. Conforme se avanza, cada vez que se
encuentran dos elementos que no están ordenados se ordenan y se va retrocediendo hasta dejar el valor más
pequeño colocado en su lugar. Una vez ordenado se continua a partir del elemento desde el que se comenzó
a retroceder. Y así sucesivamente hasta dejar todos los elementos ordenados en su lugar.

265
ARRAYS Y TABLAS UNIDIMENSIONALES, BIDIMENSIONALES,
TRIDIMENSIONALES Y MULTIDIMENSIONALES.
PROGRAMA ORDENACION DE TABLAS MUY OPTIMIZADO (continuación)

266
ARRAYS Y TABLAS UNIDIMENSIONALES, BIDIMENSIONALES,
TRIDIMENSIONALES Y MULTIDIMENSIONALES.

267
ARRAYS Y TABLAS UNIDIMENSIONALES, BIDIMENSIONALES,
TRIDIMENSIONALES Y MULTIDIMENSIONALES.
ORDENACION POR MÉTODO DE LA BURBUJA MEJORADO

Este tercer método de ordenación, es uno de las más representativos (aunque no por ello el más eficaz). Se
van comparando parejas de elementos, siempre juntos. Si se encuentra un valor desordenado se va
arrastrando hacia la izquierda hasta dejar el valor más pequeño en la posición CERO. Conforme se avanza,
cada vez que se encuentran dos elementos que están desordenados se ordenan y se activa el Switch y se va
retrocediendo hasta dejar el valor más pequeño colocado en su lugar. Después de incrementar el indice más
a la izquierda se comienza el proceso hasta que el indice de la izquierda se iguala al indice máximo posible
para esa tabla.

10

268
ARRAYS Y TABLAS UNIDIMENSIONALES, BIDIMENSIONALES,
TRIDIMENSIONALES Y MULTIDIMENSIONALES.
ORDENACION POR MÉTODO DE LA BURBUJA MEJORADO

11

269
ARRAYS Y TABLAS UNIDIMENSIONALES, BIDIMENSIONALES,
TRIDIMENSIONALES Y MULTIDIMENSIONALES.
6. A partir de una tabla como de 7 elementos. Y QUE ESTA INCOMPLETA, es decir, que HAY SITIO LIBRE
AL FINAL de la tabla y los últimos elementos están vacios. Insertar uno o más números (u otros datos)
introducidos por el usuario desde el teclado.

12

270
ARRAYS Y TABLAS UNIDIMENSIONALES, BIDIMENSIONALES,
TRIDIMENSIONALES Y MULTIDIMENSIONALES.
INSERTAR UN NUMERO EN SU LUGAR EN UNA TABLA ORDENADA DESPLAZANDO LOS VALORES MAYORES
QUE EL HACIA EL FINAL

(Como es lógico, debe haber elementos vacios al final de la tabla y conocer la posición del 1º vacio).

7. A partir de una tabla ordenada como de 7 elementos y que está incompleta. Insertar uno o más
números introducidos por el usuario.

13

271
ARRAYS Y TABLAS UNIDIMENSIONALES, BIDIMENSIONALES,
TRIDIMENSIONALES Y MULTIDIMENSIONALES.

14

272
ARRAYS Y TABLAS UNIDIMENSIONALES, BIDIMENSIONALES,
TRIDIMENSIONALES Y MULTIDIMENSIONALES.
BORRAR UN ELEMENTO DE UNA TABLA .

8. A partir de una tabla de 7 elementos. Eliminar uno o más números de elementos introducidos por el
usuario.

15

273
ARRAYS Y TABLAS UNIDIMENSIONALES, BIDIMENSIONALES,
TRIDIMENSIONALES Y MULTIDIMENSIONALES.
BORRAR UN ELEMENTO DE UNA TABLA (continuación)

16

274
EJERCICIOS CON
TABLAS/ARRAYS
BIDIMENSIONALES
(MATRICES)

275
EJERCICIOS CON TABLAS/ARRAYS
BIDIMENSIONALES (MATRICES)
FORMATOS TIPICOS DE TRATAMIENTOS DE TABLAS BIDIMENSIONALES:

276
EJERCICIOS CON TABLAS/ARRAYS
BIDIMENSIONALES (MATRICES)
1. Diseñar un programa que a partir de un array o tabla de dos dimensiones de 16 por 16 elementos
(16 filas y 16 columnas) cuyo nombre será producto:

A.) Cargar el array con el PRODUCTO del número de la fila por el número de la columna .
B.) Imprimir en pantalla el contenido del array una vez cargado.

277
EJERCICIOS CON TABLAS/ARRAYS
BIDIMENSIONALES (MATRICES)
2. Diseñar un programa que cargue un array BIDIMENSIONAL llamado DIAGONAL de 10 por 10 elementos
de tal forma que los elementos de una de las diagonales se rellenen con el valor ‘1’ y todos los demás
con el valor ‘0’.

278
EJERCICIOS CON TABLAS/ARRAYS
BIDIMENSIONALES (MATRICES)
Opcion2: Si el lenguaje NO permite inicializar a la hora de crear las variables.

279
EJERCICIOS CON TABLAS/ARRAYS
BIDIMENSIONALES (MATRICES)
Opcion3: AQUÍ SE METEN UNOS EN LA OTRA DIAGONAL.

280
EJERCICIOS CON TABLAS/ARRAYS
BIDIMENSIONALES (MATRICES)
3. A partir de una tabla BIDIMENSIONAL de 4 filas por 10 columnas ya cargada con los valores que se
deseen por parte del alumno, obtener su array transpuesto (10 filas por 4 columnas).

281
EJERCICIOS CON TABLAS/ARRAYS
BIDIMENSIONALES (MATRICES)
Otra posibilidad con tablas de tamaños invertidos:

282
EJERCICIOS CON TABLAS/ARRAYS
BIDIMENSIONALES (MATRICES)
4. A partir de una tabla BIDIMENSIONAL de 20 filas por 10 columnas ya cargada con los valores de las
notas de las 10 asignaturas de 20 alumnos.

A: Hallar la media de las notas de cada uno de los alumnos y mostrarlas por pantalla con el
formato que desee el alumno.

B: Hallar también la media obtenida por los alumnos en cada una de las 10 asignaturas.

OTRA VERSION PODRIA SER CREAR UNA NUEVA TABLA CON UNA FILA MAS Y UNA COLUMNA MÁS PARA
GUARDAR EN ELLAS LA MEDIA DE LAS ASIGNATURAS Y LA MEDIA DE LOS ALUMNOS CONFORME SE VAN
OBTENIENDO Y SE VAN IMPRIMIENDO.

283
EJERCICIOS CON TABLAS/ARRAYS
BIDIMENSIONALES (MATRICES)
5. Tenemos la información de las notas de un colegio guardadas en un array de tres dimensiones,
organizada de la siguiente forma:

EL primer nivel de 20 cursos, el segundo nivel 10 alumnos por curso y en el tercer nivel las 15
asignaturas de cada uno de los alumnos.

Hacer el algoritmo que recorra todos los elementos de la tabla y que a todas las notas con valor 4 ó
5 que les sume 1 punto más. A la vez irá sumando todas las notas (después del posible incremento)
y al final del programa imprimir por pantalla la media de todas las notas de la tabla. (RECORRIDO
SECUENCIAL de una tabla Tridimensional).

10

284
EJERCICIOS CON TABLAS/ARRAYS
BIDIMENSIONALES (MATRICES)
6. Tenemos la información de las notas de un colegio guardadas en un array de tres dimensiones,
organizada de la siguiente forma:

EL primer nivel de 20 cursos, el segundo nivel 10 alumnos por curso y en el tercer nivel las 15
asignaturas de cada uno de los alumnos.

Hallar e imprimir por pantalla la media de las notas de cada uno de los alumnos así como la media
de las notas de cada uno de los 20 cursos y además la media total de todas las medias.

11

285
EJERCICIOS CON TABLAS/ARRAYS
BIDIMENSIONALES (MATRICES)
7. A partir de un array tridimensional con informacion acumulada con los gastos de 10 años cada uno
de 12 meses y a su vez cada uno con 31 gastos (31 días, 31 posible gasto por mes).

Sacar un informe semejante e este:

12

286
EJERCICIOS CON TABLAS/ARRAYS
BIDIMENSIONALES (MATRICES)

13

287
PRÁCTICAS DE
PROGRAMACIÓN
ESTRUCTURADA CON
PSEUDOCÓDIGOS
(seguimiento de
algoritmos)

288
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
1. Indica qué Tipo de Estructura de la PROGRAMACIÓN ESTRUCTURADA es cada una de los siguientes
Pseudocódigos. Recuerda: el Teorema de la Estructura afirma que para realizar cualquier programa basta
con utilizar distintas combinaciones de tres tipos básicos de instrucciones, que son ... :

Tipo de Estructura de:

289
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
2. Los siguientes algoritmos pretenden validar un código con cuatro posibles valores válidos de ficha (1, 2,
3 y 4). ¿Qué pseudocódigo investigaría correctamente si el código de ficha es válido o erróneo?

290
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
3. Dada una variable llamada Num con un valor mayor que 0 (cero), indica cuál de los siguientes
pseudocódigos imprimiría el resultado de las siguientes operaciones:

291
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
4. Cuando termine el algoritmo siguiente qué procedimiento se habrá procesado:

292
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
5. Cuando haya finalizado el siguiente proceso, indica el valor de las variables “R”, “ T” y “X”.

293
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
6. Cuando haya finalizado el siguiente proceso, indica el valor de la variables “A”, “ B” , “Z” e “Y”.

294
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
7. Qué valor deberá tener la variable “Z” para que, con independencia del resto del proceso, la estructura
del DO WHILE más interna SE REPITA SÓLO TRES VECES.

8. Qué valor deberá tener la variable “T” cuando finalice el proceso.

295
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
Finalizado el proceso ¿Qué valores tendrán las variables A y B ?

10. Finalizado el proceso ¿Qué valor de X se imprimirá ?

296
PRÁCTICAS DE
PROGRAMACIÓN
ESTRUCTURADA CON
PSEUDOCÓDIGOS
(seguimiento de
algoritmos)

297
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
1.- Finalizado el proceso ¿Qué valores tendrán las variables A y B ?.

1. Finalizado el proceso ¿Qué valor de X se imprimirá ?.

298
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
2. Finalizado el proceso ¿Qué valores tendrán las variables A y B ?.

3. Finalizado el proceso ¿Qué valor de X y de P se imprimirán ?.

299
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
4. Finalizado el proceso ¿Qué valores tendrán las variables A y B ?.

5. Finalizado el proceso ¿ Qué valor de I se imprimirá ?.

300
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
6. Finalizado el proceso ¿Qué valores tendrán las variables X, Y y Z ?.

301
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
7. Finalizado el proceso ¿Qué valores tendrán las variables A y B ?.

302
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
8. Finalizado el proceso ¿ Qué valor de X y de A se imprimirá ?

303
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
9. Se desea sumar los números enteros desde 10 hasta 20 ambos inclusive.
¿Cuál de los siguientes pseudocódigos lo haría correctamente ?

(10-19)(10-21)(11-21)(10-20)

304
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
10. Los siguientes Pseudocódigos pretenden buscar un código de artículo en una Tabla de 20 elementos ya
cargada con los 20 artículos existentes. El código de artículo a buscar se obtiene a partir de un Registro
de un fichero. Selecciona el Pseudocódigo que realiza una búsqueda secuencial de artículos en esta tabla,
parando la búsqueda al encontrar el artículo en alguno de los 20 elementos de la tabla. (El primer
elemento de la tabla es el 1).

305
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)

10

306
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)

11

307
PRÁCTICAS DE
PROGRAMACIÓN
ESTRUCTURADA CON
PSEUDOCÓDIGOS
(seguimiento de
algoritmos)

308
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
1. Los siguientes Pseudocódigos pretenden buscar un código de artículo en una Tabla de N elementos ya
cargada con los N artículos existentes. El código de artículo a buscar se obtiene a partir de un Registro
de un fichero. Selecciona el Pseudocódigo que realiza una búsqueda secuencial de artículos en dicha
tabla, parando la búsqueda (saliendo de la repetitiva), en el caso de encontrar el artículo en alguno de
los N elementos de la tabla.
(El primer elemento de la tabla se direcciona con el índice con valor 1).

309
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
1. Los siguientes Pseudocódigos pretenden buscar un código de artículo en una Tabla de 20 elementos ya
cargada con los 20 artículos existentes. El código de artículo a buscar se obtiene a partir de un Registro
de un fichero. Selecciona el Pseudocódigo que realiza una búsqueda secuencial de artículos en esta tabla,
parándo la búsqueda Saliendo de la repetitiva) al encontrar el artículo en alguno de los 20 elementos
de la tabla. (El primer elemento de la tabla es el 1).

310
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
2. Dado el siguiente pseudocódigo con DOS REPETITIVAS. ¿Cuántas veces se ejecuta cada uno de los dos
bucles?

RESPUESTAS: ¿Cuántas veces se ejecutan las 2 repetitivas?

a.- El Bucle 1º INFINITAS Veces y el Bucle 2º TAMBIÉN.

b.- El Bucle 1º INFINITAS Veces y el Bucle 2º NUNCA.

b.- El Bucle 2º se realiza 3 Veces por cada 10 del Bucle 1º.

d.- Ninguna de las anteriores respuestas es válida.

OPCIÓN CORRECTA:

311
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
3. Qué valor tendrá la variable “X” cuando termine el programa.

4. Qué valor tendrá la variable “Z” cuando termine el programa.

312
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
5. Qué valor tendrá la variable “Z” cuando termine el programa.

313
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
6. Finalizado el proceso ¿ Qué valor de X y de C se imprimirá ?.

314
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
7. ¿ Qué valor debería estar puesto en el recuadro, para que una vez finalizado el programa, el valor impreso
de X sea igual a 10 ?.

8. Para que una vez finalizado el programa, el valor impreso de X sea igual a 10.
¿ Qué valor inicial se debería haber dado a P ?.

315
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
9. Finalizado el proceso ¿ Qué valor tendrá CONTADOR ?

10. Finalizado el proceso ¿ Qué valor tendrá CONTADOR ?

316
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
11. ¿Qué valor tendrán estas variables cuando haya finalizado el programa?

10

317
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
12. ¿Qué valor tendrán estas variables cuando haya finalizado el programa?

11

318
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
13. Cuál de los Tres pseudocódigos siguientes cumple mejor la especificación siguiente: “ De estas 3 ciudades:
Zaragoza, Oviedo y Sevilla, ¿Cuál es la que tiene mayor extensión? “. (NOTA: No es posible que sean
iguales).

12

319
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
Dado el siguiente pseudocódigo que pretende leer datos de un fichero y guardar en una tabla los datos de
los registros con código=1 e imprimir los restantes. También, una vez rellenada la tabla y antes de terminar
el proceso, tiene que imprimir la tabla. Indica cuál de las afirmaciones de abajo es correcta (Nota: El
primer elemento de la tabla es el 1).

RESPUESTAS: ¿Qué afirmación es la válida?

a.- En el Punto-1 debería poner “Imprimir Tabla(I)” y en el Punto-2 “J<I “.

b.- En el Punto-1 debería poner “Leer Otro Registro” y en el Punto-2 “J<I “.

c.- En el Punto-1 debería poner “Leer Otro Registro” y en el Punto-2 “J<=I “.

d.- En el Punto-1 debería poner “Imprimir Tabla(I)” y en el Punto-2 “J<=I “.

OPCIÓN CORRECTA:

13

320
PRÁCTICAS DE PROGRAMACIÓN ESTRUCTURADA
CON PSEUDOCÓDIGOS (seguimiento de algoritmos)
14. Indica si el resultado de las expresiones siguientes es correcto o no

15. Indica si el resultado de las expresiones siguientes es correcto o n

14

321
 

Módulo 2:
Introducción a java

   

322
CARACTERÍSTICAS
DE LA
TECNOLOGÍA JAVA

323
ÍNDICE
CARACTERÍSTICAS DE LA TECNOLOGÍA JAVA

1. Características del lenguaje Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3


2. La Máquina Virtual de Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9
3. Soporte de Fabricantes de Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13
4. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14

324
Características de la Tecnología Java

1. Características del lenguaje Java

A lo largo éste te mostraremos los inicios del lenguaje Java y sus principales características

Creación y usos de Java

Los inicios de Java se remontan a finales de los años 80 aunque no es hasta 1990 cuando el equipo de James
Gosling, en su afán de crear un lenguaje tal que los programas desarrollados con él pudieran ejecutarse
sobre cualquier arquitectura, desarrolla el Oak.

En principio se desarrolló para pequeños electrodomésticos de mano pero en 1993 y mientras este equipo
continuaba desarrollando el proyecto, la World Wide Web alcanzó su máximo auge.

i
3

325
Características de la Tecnología Java

Desarrollo de las primeros navegadores

Java se convierte en un asunto de máxima importancia para SUN. Es entonces cuando desarrolla un
navegador, el HotJava, que permite trabajar con Applets Java (pequeños programas escritos Java
ejecutables/interpretables desde un navegador) y además estaba hecho en Java.

Tenía una importancia doble:

- La ejecución sobre cualquier máquina de programas en un nuevo lenguaje.

- La potencia del mismo al desarrollar el navegador en el mismo lenguaje Java

Es así como nace el primer paquete de desarrollo que, con la experiencia y práctica de
programadores, se iría depurando poco a poco. El programa evoluciona y da lugar al primer kit
completo de programación: el Java Developers Kit ver. 1.0, que después va a evolucionar hasta
la actual versión.

Netscape primeramente, en su versión 2.0 del Netscape Navigator y Microsoft más tarde en su
Internet Explorer 3.0, incorporaron en sus navegadores la posibilidad de interpretar la Applets
Java.

i
4

326
Características de la Tecnología Java

Evolución de Java

Java sigue depurándose y esto obliga a los navegadores que se precien, a seguir por el camino que Java
marca, mejorando así sus browsers incorporando las nuevas generaciones de intérpretes de Java.

Es tal el desarrollo de Java que se estudia:

Crear chips que ejecuten los bytecodes Java (código Java) por hardware para mejorar los
tiempos de respuesta, que por software dejan todavía mucho que desear.

Actualmente IBM y SUN trabajan en un proyecto para desarrollar microprocesadores que ejecuten Java
directamente.

Ventajas de Java

Java es un moderno lenguaje de programación orientada a objetos desarrollado por SUN MICROSYSTEMS,
empresa de reconocido prestigio por sus estaciones de trabajo UNIX de alta calidad y cuya sede está en
California.

¿Cómo ejecutar un programa Java?

Primeramente se compila el código fuente, proceso que genera un fichero llamado “bytecodes” que será
interpretado por un software llamado JVM o Máquina Virtual de Java que habrá que instalar previamente en
nuestro ordenador.

i
5

327
Características de la Tecnología Java

De Java se dice que hereda la mayoría de las ventajas de C++ y elimina sus inconvenientes permitiendo, de
esta manera, un desarrollo de código más eficiente y simplificado. El motivo principal de su éxito podemos
encontrarlo en una de sus principales características: la independencia de la plataforma. Unido a esta
característica, la segunda y de gran importancia también sería que es compatible con el protocolo HTTP, es
decir, los ficheros ejecutables de java son transportables a través de la red Internet, mediante este protocolo,
permitiendo que las aplicaciones Java se distribuyan en la World Wide Web.

Portabilidad de Java

Una de la características principales de Java es su portabilidad

Debido a:

- Permite interpretar los programas Java desde cualquier plataforma de programación.

- Es un lenguaje de plataforma independiente tanto a nivel de código fuente como a nivel binario.

- Podemos escribir código Java en una plataforma y marcharnos a otra, con la garantía de que ésta
también entenderá el código sin necesidad de tener que reescribirlo.

- Los archivos binarios Java resultado de la compilación, conocidos por bytecodes, podrán ejecutarse
desde cualquier plataforma sin necesidad de ninguna recopilación.

Para ejecutar los programas en Java se hacen dos operaciones:

- Compilación
- Interpretación

El inconveniente del uso de bytecodes, como tenemos ocasión de ver, cuando cargamos un Applet desde una
pagina Web, es la pérdida de velocidad de ejecución. Vale la pena recordar aquí el intento de desarrollar
hardware especifico para trabajar con los bytecodes Java.

i
6

328
Características de la Tecnología Java

Tipos de programas de Java: applets

Dentro de Java podemos distinguir entre dos tipos de programas: los applets y las aplicaciones.

Los applets, son programas dinámicos e interactivos que puede ejecutarse dentro de una página Web.
Debe ser visualizado por un browser (navegador) con capacidad para soportar Java. Los applets se diseñan
para ser vistos en el navegador, el navegador lleva una máquina virtual propia de cada fabricante y es en esa
JVM (Máquina Virtual de JAVA) donde se ejecuta el applet y no en la JVM instalada en el ordenador.

i
7

329
Características de la Tecnología Java

Tipos de programas de Java: las aplicaciones

Las aplicaciones, no requieren navegador para ejecutarlas y son programas como los desarrollados en otro
lenguaje, pero esta vez en Java.

Sólo se diferencian de éstos en que después de la compilación, requieren un intérprete de aplicaciones java,
es decir, una JVM o Máquina Virtual de Java. El código de las aplicaciones debe llevar obligatoriamente una
función o método llamado main(), mientras que en los applets esta función no es obligatoria y además casi
nunca se suele poner. Se ejecutan en entorno MS-DOS.

i
8

330
Características de la Tecnología Java

2. La Máquina Virtual de Java (JVM)


Qué es JVM

La Máquina Virtual de Java (en inglés Java Virtual Machine, JVM) es un programa nativo, es decir, ejecutable
en una plataforma específica, capaz de interpretar y ejecutar instrucciones expresadas en un código binario
especial (el bytecode), el cual es generado por el compilador del lenguaje Java.

El código binario de Java no es un lenguaje de alto nivel, sino un verdadero código máquina de bajo nivel,
viable incluso como lenguaje de entrada para un microprocesador físico.

La JVM es una de las piezas fundamentales de la plataforma Java. Básicamente se sitúa en un nivel superior
al hardware del sistema sobre el que se pretende ejecutar la aplicación, y éste actúa como un puente que
entiende tanto el bytecode, como el sistema sobre el que se pretende ejecutar.

Ventaja de JVM

La gran ventaja de la Máquina Virtual de Java es aportar portabilidad al lenguaje de manera que desde Sun
Microsystems se han creado diferentes Máquinas Virtuales de Java para diferentes arquitecturas

i
9

331
Características de la Tecnología Java

Ejemplos:

- Un programa .class escrito en Windows puede ser interpretado en un entorno Linux, tan sólo es
necesario disponer de dicha máquina virtual para dichos entornos. De ahí el famoso axioma que sigue
a Java, "escríbelo una vez, ejecútalo en cualquier parte", o "Write once, run anywhere".

- La Máquina Virtual de Java puede estar implementada en software, hardware, una herramienta de
desarrollo o un browser, lee y ejecuta código precompilado bytecode que es independiente de la
plataforma.

Especificaciones JVM

La JVM tiene especificaciones para un conjunto de instrucciones, un conjunto de registros, un formato para
archivos de clases, la pila, un heap con recolector de basura y un área de memoria.

Cualquier implementación de la JVM que sea aprobada por SUN


debe ser capaz de ejecutar cualquier clase que cumpla con la
especificación. Para ello, cuenta con el departamento de
software denominado JAVASOFT que en este caso sería el
encargado de validar cualquier JVM para que se ajuste a la
normativa de SUN.

i
10

332
Características de la Tecnología Java

A partir de J2SE 5.0, los cambios en la especificación de la JVM han sido desarrollados bajo el auspicio de la
Java Community Process (JCP) y especificada en la JSR 924. Desde el año 2006, cambios en la especificación
para soportar las modificaciones del formato del fichero de clases (JSR 202) se están llevando a cabo en una
versión de mantenimiento en la JSR 924. Las especificaciones para la JVM están publicadas en lo que se
conoce como "el libro azul".

Compiladores JIT

Existen los compiladores JIT (Just In Time) que lo que hacen es


optimizar el bytecode que se crea haciendo como una segunda
compilación del mismo, acorde a la plataforma en la que vamos a
ejecutar el programa Java, de este modo vamos a ganar en velocidad
de ejecución.

La verificación de código también asegura que los patrones de bits


arbitrarios no pueden usarse como direcciones. La protección de
memoria se consigue sin necesidad de una unidad de Gestión de
Memoria (MMU). Así, JVM es una forma eficiente de obtener protección
de memoria en chips que no tienen MMU.

i
11

333
Características de la Tecnología Java

Instrucciones para grupos de tareas

La JVM tiene instrucciones para los siguientes grupos de tareas:

- Carga y almacenamiento.
- Aritméticas.
- Conversión de tipos.
- Creación y manipulación de objetos.
- Gestión de pilas (push/pop).
- Transferencias de control (branching).
- Invocación y retorno a métodos.
- Lanzar excepciones (errores en tiempo de ejecución).

Sistema de seguridad

Una arquitectura de máquina virtual implementa un sistema de


seguridad denominada sand box security model sobre las acciones que
el código puede hacer dentro de la máquina. Esto está diseñado para
permitir ejecución segura de código no confiable desde fuentes
remotas.

En el caso de los applets, las restricciones fundamentales por defecto


serían:

- No puede acceder ni en modo escritura ni en modolectura a


nuestros sistemas de ficheros, por lo tanto, a bases de datos de
nuestro sistema.

- No puede establecer una comunicación vía red (sockets) con


ningún servidor distinto al del que procede el applet.

i
12

334
Características de la Tecnología Java

3. Soporte de Fabricantes de Software


Entornos de desarrollo

Actualmente en el mercado Java, existen diversos entornos de desarrollo más conocidos como IDE, que nos
permiten simplificar las tareas a la hora de compilar y ejecutar nuestra clase o clases Java.

Entre los más populares y utilizados por las empresas se encuentran

- NJbuilder
- etBeans
- Eclipse
- JDeveloper

La mayoría de estos entornos disponen de plug-ins adicionales a


la hora de desarrollar partes más específicas del extenso API de
Java así como J2EE.

Muchos de ellos incluyen servidores de aplicaciones de prueba al


estilo Tomcat.

i
13

335
Características de la Tecnología Java

4. Resumen
Has llegado al final de este recurso formativo que denominamos “Características de la Tecnología Java”

En esta lección hemos estudiado los siguientes contenidos:

i
14

336
EDICIONES JAVA

337
ÍNDICE
EDICIONES JAVA

1. Java Standar Edition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3


2. Java Enterprise Edition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5
3. Java Micro Edition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10
4. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15

338
Ediciones Java

1. Java Standar Edition

En éste te mostraremos los grandes bloques en que se divide la tecnología Java

Ediciones de la Tecnología Java

Actualmente podríamos decir que la Versión 2 de Java de Sun Microsystem


contiene 3 ediciones distintas: Java Estándar Edition (J2SE), Java Enterprise
Edition (J2EE) y Java Micro Edition (J2ME).

i
3

339
Ediciones Java

Java Standar Edition

Java Estándar Edition sería lo que normalmente entendemos como aplicaciones “cliente”, todo lo que sería
el desarrollo de la parte del cliente, lo que va a manejar en su puesto de trabajo.
En esta parte se suele incluir todo lo que son los fundamentos del lenguaje, la sintaxis con todo lo que
abarca, tipos de datos, etc. También lo que es el tratamiento de errores, todos los bucles de control de
flujo, arrays, colecciones.

La edición J2SE se emplea para programar en dispositivos personales tales como desktops y laptops.

A un nivel un poco más avanzado, permite el desarrollo de applets para Internet y el desarrollo de interfaces
gráficas de usuario mediante las APIS AWT y Swing que nos proporciona el lenguaje Java.

i
4

340
Ediciones Java

2. Java Enterprise Edition


Funciones de J2EE

Internet y la World Wide Web representan el fundamento sobre los cuales se está construyendo la economía
de la información. Transacciones bancarias, ventas por Internet, comercio electrónico etc.
La meta de J2EE es definir un estándar que ayude a suplir los retos tecnológicos en esta nueva era.

1. Soporta aplicaciones distribuidas que toman las ventajas de las tecnologías existentes y en
desarrollo, simplificando el proceso a través de un modelo de aplicaciones basados en componentes
(unidades de software reutilizables).

2. Soporta aplicaciones desde las propias corporativas hasta e-commerce con Web en Internet.

3. Provee soporte tanto para el lado del servidor como para el lado del cliente, para aplicaciones
corporativas multi-capa (multi-tier)

Contenedor

De la mano de un modelo basado en componentes se encuentra la noción de contenedor. Un contenedor es


un entorno estandarizado de ejecución que provee servicios específicos a componentes.

Por ejemplo todos los contenedores Web proveen soporte para requerimientos de clientes, realizar un
procesamiento y retornar los resultados (como cuando rellenamos un formulario y enviamos los resultados a
un servidor para ser procesados).

341
Ediciones Java

Componentes

J2EE tiene perfectamente especificada la API para que un desarrollador pueda hacer: componentes,
servicios y comunicaciones.

i
6

342
Ediciones Java

Componentes: contenedor

Todos los componentes dependen de una entidad de nivel de sistema llamada “contenedor”.
Los contenedores proveen a los componentes, servicios como ciclo de vida, seguridad, multithreading, etc.

Contenedores Servlets

Los componentes Web son hospedados por contenedores Servlets, JSP y Web.

i
7

343
Ediciones Java

Enterprise Java Beans

La arquitectura Enterprise Java Beans (EJB) es una tecnología del lado del servidor para desarrollo y ejecución
de componentes para lógica de negocio de una aplicación empresarial.

EJB son escalables, transaccionales y multiusuario. Básicamente son lo que llamamos las “reglas de negocio”
o dicho de otro modo los algoritmos que resuelven los problemas de la empresa.

Hay tres tipos de EJB:

- Session Bean

- Entity Bean

-Message Beans

Servicios de la Plataforma J2EE

La plataforma J2EE provee los Servicio de Nombres, Servicios Deployment, Servicios Transaccionales y
Servicios de Seguridad

Servicio de Nombres

Ofrece a los clientes de aplicación , EJB y componentes Web acceso a ambiente de nombres JNDI, lo que
significa poder localizar un objeto o servicio dentro de una red ( por ejemplo una Intranet) a través de un
único nombre.

i
8

344
Ediciones Java

Comunicaciones

Las comunicaciones se refieren a las tecnologías de mensajería: envío y recepción de mensajes asincrónicos,
Java Message Service (JMS) y Java Mail. Pulsa en las imágenes y podrás conocer más detalles de estas
tecnologías.

Java Message Service Java Mail

i
9

345
Ediciones Java

3. Java Micro Edition

Java Micro Edition (J2ME) es la versión de Java orientada a los dispositivos móviles.

Debido a que los dispositivos móviles tienen una potencia de cálculo baja e interfaces de usuario pobres, es
necesaria una versión específica de Java destinada a estos dispositivos, ya que el resto de versiones de Java,
J2SE o J2EE, no encajan dentro de este esquema. J2ME es por tanto, una versión “reducida” de J2SE.

La configuración es un mínimo grupo de APIs (Application Program Interface), útiles para desarrollar las
aplicaciones destinadas a un amplio rango de dispositivos. La configuración estándar para los dispositivos
inalámbricos es conocida como CLDC (Connected Limited Device Configuration).

CLDC (Connected Limited Device Configuration)

El CLDC proporciona un nivel mínimo de funcionalidades para desarrollar aplicaciones para un determinado
conjunto de dispositivos inalámbricos.

i
10

346
Ediciones Java

Se puede decir que CLDC es el conjunto de clases esenciales para construir aplicaciones. Hoy por hoy, sólo
tenemos una configuración, pero es de esperar que en el futuro aparezcan distintas configuraciones
orientadas a determinados grupos de dispositivos.

Encontramos requisitos en los CLDC tanto de hardware como de memoria.

- Requisito de hardware
- Requisito de memoria

Limitaciones CLDC

Es complicado definir una serie de clases de error estándar, que se ajuste a todos los dispositivos
contemplados dentro de CLDC. La solución es soportar un grupo limitado de clases de error y permitir que
el API específico de cada dispositivo defina su propio conjunto de errores y excepciones.

Limitaciones impuestas por CLDC

- Operaciones en coma flotante. CLDC no proporciona soporte para matemática en coma flotante.
- Eliminación del método Object.finalize. Este método es invocado cuando un objeto es eliminado de
la memoria, para optimizar los recursos.
- Se limita el manejo de las excepciones.

La seguridad dentro de CLDC es sencilla, sigue el famoso modelo sandbox. Las líneas
básicas del modelo de seguridad sandbox enC LDC son:

- Los ficheros de clases deben ser verificados como aplicaciones válidas.


- Sólo las APIs predefinidas dentro de CLDC están disponibles.
- No se permiten cargadores de clases definidos por el usuario.
- Sólo las capacidades nativas proporcionadas por CLDC son accesibles.

i
11

347
Ediciones Java

Arquitectura de J2ME

En la arquitectura de J2ME, por encima de la configuración, tenemos el perfil (profile). El perfil es un grupo
más especifico de APIs, desde el punto de vista del dispositivo. Es decir, la configuración se ajusta a una
familia de dispositivos, y el perfil se orienta hacia un grupo determinado de dispositivos dentro de dicha
familia.

El perfil, añade funcionalidades adicionales a las proporcionadas por


la configuración.

La especificación MIDP (Mobile Information Device Profile), describe


un dispositivo MIDP como un dispositivo pequeño, de recursos
limitados, móvil y con una conexión “inalámbrica”

MIDLet

Las aplicaciones J2ME desarrolladas bajo la especificación MIDP, se denominan MIDLets.

- Las clases de un MIDLet, son almacenadas en bytecodes java, dentro de un fichero .class.
- Estas clases, deben ser verificadas antes de su “puesta en marcha”, para garantizar que no realizan
ninguna operación no permitida.
- Este preverificación, se debe hacer debido a las limitaciones de la máquina virtual usada en estos
dispositivos.
- Esta máquina virtual se denomina KVM. Para mantener esta máquina virtual lo más sencilla y pequeña
posible, se elimina esta verificación, y se realiza antes de la entrada en producción.
- La preverificación se realiza después de la compilación, y el resultado es una nueva clase, lista para
ser puesta en producción.

i
12

348
Ediciones Java

Ficheros Jar

Los MIDLets, son empaquetados en ficheros “.jar”. Se requiere alguna información extra, para la puesta en
marcha de las aplicaciones.

Esta información se almacena en el fichero de “manifiesto”, que va incluido en el fichero “.jar” y en un


fichero descriptor, con extensión “.jad”. Un fichero “.jar” típico, por tanto, se compondrá de:

- Clases de soporte

- Recursos (imágenes, sonidos...)

- Manifiesto (fichero “.mf”)

- Descriptor (fichero “.jad”)

Un fichero “.jar” puede contener varios MIDLets. Esta colección de MIDLets, se suele llamar “MIDLet Suite”.
Esta unión de varios MIDLets en una distribución, permite compartir recursos (imágenes, sonidos...), y por
tanto optimizar los recursos del dispositivo.

MIDP Api

Los elementos principales involucrados en el proceso de desarrollo con Java, son el lenguaje Java
propiamente dicho y el grupo de APIs (Application Programming Interface) que proporcionan el soporte para
el software desarrollado.

i
13

349
Ediciones Java

Como ya se ha mencionado, los MIDlets son aplicaciones especiales, diseñadas bajo los requerimientos de la
especificación MIDP. Esta especificación es una serie de normas que indican las capacidades y restricciones
de Java respecto a los dispositivos móviles. Un aspecto importante de estas capacidades y limitaciones, es
el conjunto de clases e interfaces disponibles para afrontar el desarrollo de aplicaciones.

La especificación MIDP provee una descripción detallada del API disponible para el desarrollo de MIDlets. El
CLDC proporciona un API adicional. De hecho, el API de MIDP, se basa en el API de CLDC, para construir clases
e interfaces más específicos.

i
14

350
Ediciones Java

4. Resumen

Has llegado al final de este recurso formativo que denominamos “Ediciones Java”.

En esta lección hemos estudiado los siguientes contenidos:

i
15

351
PRIMEROS PASOS
EN JAVA

352
ÍNDICE
PRIMEROS PASOS EN JAVA

1. Java Development Kit JDK 6.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3


2. Configuración de variables de entorno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6
3. Nociones básicas de sintaxis Java. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8
4. Creación del primer programa Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9
5. Utilización de un entorno de desarrollo IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11
6. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .18

353
Primeros pasos en Java

1. Java Development Kit JDK 6.0.

A lo largo de éste te mostraremos qué es Java Development Kit y cómo


realizar su correcta instalación.

Compilado de lenguaje Java

Básicamente un programa Java tiene primeramente un proceso de compilación con un compilador de lenguaje
Java.

Al ser compilado se genera un fichero de bytecodes Java (este fichero tendrá la extensión .class).
Posteriormente dicho programa compilado ya sin errores será interpretado por la JVM o Java Vitual Machine.

Cada fabricante implementa su propia Máquina Virtual de Java pero siempre siguiendo las directrices de
JAVA SOFT COMPANY que es la delegación de SUN MICROSYSTEMS encargada de regir todas las especificaciones
software de Java.

i
3

354
Primeros pasos en Java

Java Developers Kit (JDK)

Dentro del Java Developers Kit (JDK) están las herramientas necesarias para el desarrollo de applets y
aplicaciones en Java.

El compilador

Toma el programa en Java y genera los bytecodes que se van a poder ejecutar desde cualquier plataforma.
El compilador se llama javac.exe y se utiliza de la siguiente forma:

C:> javac NombrePrograma.java

Instalación JDK

Para instalar el JDK se debe disponer de un espacio libre en el disco duro de alrededor de 30 Mb, a lo que
hay que sumar otros 30 Mb para la instalación de la documentación del producto, si bien esta última se
puede descargar de la página de SUN.

i
4

355
Primeros pasos en Java

Para instalar el JDK basta hacer doble clic sobre su archivo ejecutable y seguir las instrucciones que se
muestren a continuación.

Una vez realizado el proceso de instalación se puede liberar espacio del disco duro borrando los archivos de
instalación que no se volverán a necesitar.

Para instalar la documentación de ayuda del producto se procede de igual manera descomprimiendo el
archivo principal de documentación. Es conveniente aunque no imprescindible, que la instalación de la
documentación se realice en un directorio dentro del de JDK.

i
5

356
Primeros pasos en Java

2. Configuración de variables de entorno


Directorio de instalación

Una vez instalados el JDK y la documentación, será necesario configurar ciertas variables de entorno antes
de empezar a trabajar con el producto.

Java utiliza una variable de entorno CLASSPATH para indicarle en qué directorio encontrar las clases de Java.

Si se ha instalado el JDK en la ubicación por defecto, las clases de Java se encuentran en la


carpeta lib dentro del directorio jdk1.6.0 que es el que se crea por defecto en la instalación o
jdk1.6.0_xx en función de la versión, donde xx serían números para indicar una versión más
moderna.

Para crear la variable CLASSPATH hay que editar las variables de entorno de Windows y crear una nueva
variable a la que llamaremos classpath con el siguiente valor:

c:\jdk1.6.0\lib;.;

Donde jdk1.6.0 es el directorio donde se instala el JDK. El punto que añadimos al final es para
poder ejecutar las clases desde el directorio actual, normalmente nuestro directorio de trabajo.

i
6

357
Primeros pasos en Java

Directorios de instalación del JDK

Si se examina el contenido del directorio JDK se encontrarán estos directorios:

i
7

358
Primeros pasos en Java

3. Nociones básicas de sintaxis Java.


Directorios de instalación del JDK

Todos los programas Java van dentro de la definición de una clase. Además dentro de una aplicación Java
siempre es obligatorio definir el método main al igual que ocurre en el lenguaje C.

Ya tenemos, entonces, una idea aproximada de lo que sería el esqueleto de un programa Java:

Nombre de una clase (lo que sería el nombre del programa), abriríamos una llave ( { ) , definiríamos el
método main con todos sus parámetros y finalmente cerraríamos la llave ( } ).

Si por ejemplo quisiéramos definir el programa Prueba1 lo haríamos de la siguiente forma:

class Prueba1 {

public static void main (String args [])


{

La definición del método main es tal y como aparece obligatoriamente (más adelante indicaremos lo que
significa cada palabra reservada que lo acompaña).

En relación a la sintaxis Java, al final de cada sentencia es obligatorio el punto y coma ( ; ) , además el
lenguaje java es case sensitive, es decir, diferencia entre mayúsculas y minúsculas.

i
8

359
Primeros pasos en Java

4. Creación del primer programa Java


Creando un programa Java I

Para poder entender mejor el funcionamiento de este lenguaje, realizaremos un ejercicio de un primer
programa Java al que vamos a llamar ImprimirFrase. Este programa lo que hará será visualizar por pantalla
la frase “mi primer programa java”.

Lo primero, antes de usar ningún editor, vamos a probar todo el mecanismo utilizando el bloc de notas. De
este modo aprenderemos a trabajar desde la consola MS-DOS. Lo primero que haremos será crear la clase
ImprimirFrase. Para ello escribiremos nuestro programa dentro del bloc de notas.

Una vez escrito el código en el bloc de notas lo vamos a guardar en un directorio conocido (por ejemplo
c:/cursojava>) y con el mismo nombre con el que hemos creado la clase, respetando mayúsculas y minúsculas
y con la extensión .java , en nuestro caso, el fichero se guarda como ImprimirFrase.java

i
9

360
Primeros pasos en Java

Creando un programa Java II

Una vez hecho lo anterior, abrimos una sesión de MS-DOS , y nos situamos en el directorio de trabajo.
Tecleamos javac ImprimeFrase.java como sigue:

Se habrá generará el fichero ImprimirFrase.class que es nuestro fichero de bytecodes. Volveremos a MS-
DOS y ejecutaremos nuestro fichero .class de la siguiente forma:

El resultado será :

i
10

361
Primeros pasos en Java

5. Utilización de un entorno de desarrollo IDE


JCREATOR

Para este curso hemos elegido un eeditor ditor muy sencillo de usar y altamente intuitivo, cuyas
características lo asemejan a un de los de alto rendimiento, es el JCREATOR (lo puedes descargar
gratuitamente desde www.jcreator.com)

El aspecto general que tiene dicho IDE es el siguiente:

Lo primero será crearnos un proyecto, todos los ficheros que vayamos a utilizar han de estar dentro de un
proyecto, si no, el propio Jcreator los ubicará en su propia ruta por defecto y después nos será complicado
poder localizar los archivos. A continuación veremos cómo hacerlo.

i
11

362
Primeros pasos en Java

Creando un proyecto

Para crear un proyecto nuevo iremos a la opción del menú de arriba Project seleccionando a continuación
la opción New Project.

Al hacer lo anterior se nos abrirá la siguiente pantalla:

En ésta seleccionaremos Basic Java Application y pulsaremos a continuación el botón de Next. Se nos abrirá
una nueva ventana que te mostramos en la siguiente pantalla.

i
12

363
Primeros pasos en Java

Creando un proyecto II

En el recuadro Name indicaremos el nombre del proyecto y en el recuadro Location indicaremos la ruta
donde estará ubicado el mismo.

Una vez seleccionada la ruta, automáticamente se rellenará la misma en los recuadros Source Path (ubicación
del fichero .java ) y Out Path (ubicación del fichero .class).

i
13

364
Primeros pasos en Java

Proyecto 1

Este sería el aspecto de la creación de un proyecto, al que hemos llamado Proyecto1:

Ahora para crear una clase nueva iremos al menú


de arriba y seleccionaremos la opción File y dentro
de ésta la opción New y dentro de ésta la opción
Class. A continuación aparecerá una nueva
ventana, mostramos en la siguiente pantalla.

i
14

365
Primeros pasos en Java

Crear una nueva clase

En el recuadro Name pondremos el nombre de la clase (nuestro programa Java) y en un principio, como es
una clase básica, de momento no añadiremos ninguna opción más y pulsaremos el botón de Finish.

i
15

366
Primeros pasos en Java

Crear una nueva clase llamada Prueba

Si por ejemplo creásemos una clase llamada Prueba, el resultado sería el que se muestra más abajo.

Podríamos añadirle una línea dentro del método main, que imprimiese por pantalla el mensaje “Clase de
Prueba” (System.out.println (“Clase de Prueba”);),

Dentro de la botonera de arriba tendremos botones tanto para compilar como para ejecutar el programa.

i
16

367
Primeros pasos en Java

Resultado final

El resultado final sería el siguiente:

Como puedes ver este editor es sencillo de manejar y la gran ventaja que tiene es que no consume muchos
recursos de máquina y es bastante intuitivo.

i
17

368
Primeros pasos en Java

6. Resumen
Has llegado al final de este recurso formativo que denominamos “Primeros pasos en Java”.

En esta lección hemos estudiado los siguientes contenidos:

i
18

369
INTRODUCCIÓN
A JAVA

370
INTRODUCCIÓN A JAVA

INTRODUCCIÓN A JAVA

Plataforma JAVA. Operadores especiales. Prototipos, paso por referencia y recursividad.

Características principales

- Gran parecido con el lenguaje C++.


- Es independiente de la plataforma (Maquina Virtual de JAVA- JVM Java Virtual Machine).
- Lenguaje Interpretado.
- Lenguaje Orientado a Objetos.
- Es un lenguaje concurrente, ya que ejecuta múltiples líneas de código simultáneamente (Hilos).
- Applets (Programas dentro de la Web)

Entorno de desarrollo

JDK (Java Development Kit) incluye el JRE (Java Runtime Environment)

CLASSPATH > Variable de entorno que le indica al sistema dónde localizar las librerías de JAVA
PATH > Utilidades de Java.

Pasos en el desarrollo de aplicaciones Java

- Editor de texto (código fuente). Se archiva con la extensión .java.

- Compilación: javac.exe. Se genera el archivo con extensión .class. A este archivo se le denomina
BYTECODE

- Intérprete de Java: java.exe (ejecución del Bytecode)

- Visor de Applets: appleviewer.exe (ejecución del Bytecode).

- Depurador: jdb.exe.

- Generador de documentación javadoc.exe. Analiza el código fuente y genera documentación en


código HTML.

371
INTRODUCCIÓN A JAVA

Estructura del JDK 1.5 stándar edition ( J2SE)

Imagen sacada de la página oficial de SUN Microsystems

372
INTRODUCCIÓN A JAVA

Operadores condicional y de bits

1. Operador condicional:
<condición> ? <valor cierto> : <valor falso>

c = b!= 0 ? b : 0;

2. Operadores a nivel de bits:


& (AND Binario)
| (OR Binario)
~ (NOT Binario)
^ (XOR Binario)

&
1& 1 > 1 a = 30; b = 12; c= a & b; //c = 12
1& 0 > 0 a 00011110
0& 1 > 0 b 00001100
0& 0 > 0 —————————
c 00001100
|
1 | 1 > 1 a = 30; b = 12; c= a | b; //c = 30
1 | 0 > 1 a 00011110
0 | 1 > 1 b 00001100
0 | 0 > 0 —————————
c 00011110

1|1>1 a = 30; b = 12; c= a | b; //c = 30

1|0>1 a 00011110
0|1>1 b 00001100
0|0>0 ------------------
c 00011110
~
~1>0 a = ~a; a 00011110
~0>1 ~a 11100001

^
1 ^ 1 > 0 a = 30; b = 12; c= a ^ b; //c = 18
1 ^ 0 > 1 a 00011110
0 ^ 1 > 1 b 00001100
1 ^ 1 > 0 —————————
c 00010010

373
INTRODUCCIÓN A JAVA

Las funciones o métodos estáticos

1. Introducción

Función se considera un conjunto de sentencias recogidas bajo un nombre:

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

salidaCliente(); // Llamada a función.

...

// Mis Operaciones.

...

despideCliente() // Llamada a función.


}

static void salidaCliente () {

System.out.println (“Buenos días.”);

static void despideCliente () {

System.out.println (“Adios.”);

}
}

374
INTRODUCCIÓN A JAVA

2. El prototipo, la implementación y la llamada a la función.

Implementar la función consiste en diseñar el interior de la función.

La llamada a la función se considera el hecho de ejecutar las instrucciones implementadas dentro de la fun-
ción.

Una función sólo se la puede implementar una vez pero se la puede llamar muchas veces.

Las funciones pueden estar parametrizadas, es decir, la ejecución depende de las variables que se pasan en
la función. Estas variables que se pasan se las denomina parámetros.

Además opcionalmente la función puede devolver una solución. A esta solución se le denomina retorno de la
función.

static <tipo de dato> <nombre de función> (<parámetros>) {

cuerpo de la función

[return <valor de retorno>]


} parámetros

static void saludaCliente (String Usuario) {


System.out.println (“Buenos días”+Usuario);
}
Retorno parámetro

static int suma (int a, int b) {

return (a+b);
}

Ejecución del Retorno


String usuario;
saludoCliente(usuario);

int z, x=8, y=7;


Llamadas a las funciones
z = suma(x,y);

System.out.println(“Resultado “+suma(x,y));
if (suma(x,y) > 13)
6

375
INTRODUCCIÓN A JAVA

Organización de la memoria en un programa Java

Todos los programas que se ejecutan en la misma Máquina Virtual de Java (JVM) utilizan el HEAP (espacio de
memoria) en tiempo de ejecución:

- Segmento Código, contiene el programa (bytecode) que se ejecuta.


- Segmento Datos, contiene las variables de clases.
- Segmento Pila, sirve para almacenar las variables locales.

Para recoger espacio de memoria del Heap se utiliza el operador new. El Heap también es llamado memoria
dinámica.

Los arrays se almacenan en el Heap. La referencia del array se almacena en el segmento de datos como va-
riable de clase o en el segmento de pila cuando es una variable local.

El tamaño del array se genera en el Heap (new).

Paso por valor y paso por referencia

- Parámetros formales, variables donde recogen los parámetros la implementación de la función.

- Parámetros reales, valores que se pasan a la función durante la llamada. Los parámetros reales pueden
tener los mismos nombres que los parámetros formales.

376
INTRODUCCIÓN A JAVA

static int suma (int a, int b) {


return (a + b);
} PARÁMETROS FORMALES

public static void main (String [] args) {


int c = suma (3,4);
int x = 3, y = 5;
int z = suma(x,y);
int a = 1, b = 8; PARÁMETROS REALES
int z = suma (a,b);
}

- Paso de parámetros por valor, consiste en hacer una copia de los parámetros y pasarlos a la función para
que la función no modifique las variables originales.
- Paso de parámetros por referencia, consiste en pasar la variable original a la función.

En Java los tipos de datos fundamentales se pasan por valor y no hay forma de pasarlos por referencia.
Los arrays y los objetos se pasan por referencia y no hay forma por pasarlos por valor.

static void intercambia(int a, int b) {


int x = a;
a = b; PASO POR VALOR
b = x;
}
public static void main (String [] args) {
int a = 2, b = 5;
intercambia (a, b);
System.out.println(“a: “+a+” b: “+b); // Visualiza a: 2 b: 5.
}
static void intercambia(int [] numeros) {
int z = numeros[0];
numeros[0] = numeros[1]; PASO POR REFERENCIA
numeros[1] = z;
}
public static void main (String [] args) {
int [] numeros {2,5};
intercambia (numeros);
System.out.println(“a: “+numeros[0]+” b: “+numero[1]s);
// Visualiza a: 5 b: 2.
}

377
INTRODUCCIÓN A JAVA

Recursividad

Una función para resolver un problema, en vez de llamar a otra función, se llama a sí misma pero con unos
valores en los parámetros más cercanos a la solución.

La idea de recursividad va ligada a la de repetición. Son recursivos aquellos programas que, estando encap-
sulados dentro de una función, son llamados desde ella misma una y otra vez, en contraposición a los algo-
ritmos iterativos, que hacen uso de bucles while, do-while, for, etc.

Ejemplo:

Calcular el factorial de un número:

n != n * (n –1) * (n –2) …. * 1

static int factorial (int n) {


if (n == 1) return 1;
return n * factorial (n – 1);
}

Calcular la sucesión de Fibonacci para los primeros 20 números:

static int fibonacci (int n) {


if (n == 1 | n == 2) return 1;
return fibonacci (n – 1) + fibonacci (n - 2);
}

public static void main (String [] args) {


for (int i=0; i < 20); i++)
System.out.print (fibonacci(i)+” “);
System.out.println();
}

378
INTRODUCCION A JAVA – Caso práctico

Módulo: INTRODUCCION A JAVA – Caso práctico


Explica brevemente cuáles son las dos características fundamentales del lenguaje JAVA y por qué
decimos que es un lenguaje portable, seguro y multitarea.

379
INTRODUCCION A JAVA – Caso práctico

Módulo: INTRODUCCION A JAVA – Caso práctico


Realiza un programa JAVA, llamado Mostrar en modo MS-DOS, que muestre por pantalla la famosa frase
“ Hellow World”, describiendo uno a uno todos los pasos desde que empezamos a escribir el código
fuente en el bloc de notas hasta que obtenemos el resultado por pantalla, explicando en qué paso se
realiza la compilación y en cuál la ejecución.

380
 

Módulo 3:
Sintaxis del lenguaje

   

381
TIPOS DE DATOS Y
CADENAS DE
CARACTERES

382
ÍNDICE
TIPOS DE DATOS Y CADENAS DE CARACTERES

1. Variables, constantes y tipos de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3


2. Cadena de caracteres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9
3. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11

383
Tipos de datos y cadenas de caracteres

1.Variables, constantes y tipos de datos


Variables y tipos de variables

Una variable representa un espacio de memoria donde almacenamos un valor,


que puede variar durante la ejecución del programa.

- Características de las variables: nombre, tipo y valor.


- Operaciones con las variables: declaración, uso general
(asignaciones, operaciones, ...).

Ejemplo:

int x=2; Declaramos la variable numérica x y le damos el valor 2 con el que se guarda en
memoria.
x=4; Posteriormente variamos su valor asignándole un valor de 4.

Tipos de variables en Java

- Variables de instancia: algo similar a variables globales, van dentro de la clase y fuera de
cualquier método.

- Variables de clase: van dentro de la clase y fuera de cualquier método. Llevan el modificador
static (lo veremos más adelante).

- Variables locales: van siempre dentro de los métodos.

i
3

384
Tipos de datos y cadenas de caracteres

Declaración de variables

Lo primero que se hace con una variable es declararla y en ese momento, si interesa, se le asigna un valor.
La declaración de una variable consiste en incluirla en un tipo y darle un nombre.

Ejemplo:

int numero; Variable de tipo entero


String nombre; Variable de tipo cadena
boolean verdadero; Variable de tipo booleano

Las variables se suelen declarar al comienzo de una clase o de un método.

Las variables locales han de tener un valor asignado antes de su utilización.

Las variables de clase y las de instancia tienen valores por defecto y al crearse se inicializan automáticamente
a uno de los siguientes valores según el tipo de almacenamiento:

- Variables de cadena: null


- Variables numéricas enteras: 0 , reales: 0.0
- Variables de carácter:’ \u0000’
- Variables booleanas: false

Nombrar variables

Al nombrar variables no se puede comenzar por números. Podemos utilizar los caracteres que queramos,
pero cuidado con usar operadores. Java es case-sensitive y por ello diferencia las mayúsculas de las
minúsculas.

i
4

385
Tipos de datos y cadenas de caracteres

Expresiones

Conjunto de variables relacionadas con todo tipo de operadores (=, +, -, *, /, etc.). Terminadas en ";" siempre.
Todas las sentencias de Java al igual que en C y C++ finalizan en punto y coma.

Y Java también al igual que C y C++ diferencia entre mayúsculas y minúsculas. No es lo mismo SUMA que suma
o que Suma.

Ejemplo:

int i = 1;
int c=a+b;
boolean verdad = true;

Tipos primitivos de datos o tipos de datos básicos

Los tipos básicos (primitivos) en Java son: enteros, números en coma flotante, caracteres y booleanos.

Enteros:

i
5

386
Tipos de datos y cadenas de caracteres

Números en coma flotante:

Hay dos tipos de datos de números en coma flotante:

- float 32 bits simple-precisión


- double 64 bits doble-precisión

Caracteres:

- char 16 bits de precisión.

Los caracteres se representan entre comillas simples:

char letra=’n’;

Booleanos

Este tipo de datos tienen dos posibles valores: true o false (por defecto).
boolean verdad=true;

Asignación de valores a variables

Podemos asignar un valor a una variable simplemente utilizando el operador "=".

Para asignar a una variable un número que queremos sea flotante se añade al final del valor una "f", ya que
Java cuando detecta un literal (lo que va a la derecha del símbolo =) con coma, automáticamente se lo
asigna al tipo double, con lo que si estamos definiendo un float habrá que ponerle la “f” al final.

Ejemplo:

float b = 12.5f;

i
6

387
Tipos de datos y cadenas de caracteres

Comentarios

1. Haciendo uso del señalizador de comentario de varias líneas:

Ejemplo:

/* esto es
un comentario
multilinea
*/

2. Utilizando el señalizador de comentario de una línea:

Ejemplo:

// esto es un comentario
// multilinea

Caracteres de escape

Los caracteres de escape, como en la mayoría de los lenguajes, representan secuencias de escape que se
pueden representar dentro de un programa Java.

388
Tipos de datos y cadenas de caracteres

Una combinación de caracteres es un String. Se especifican entre dobles comillas. Los Strings pueden
contener caracteres de escape:

"Esto es un String"
"" // String vacío
"Esto es un \t String"

i
8

389
Tipos de datos y cadenas de caracteres

2. Cadenas de caracteres
El tipo String

Java define además otros tipos que no están en la anterior clasificación de tipos primitivos o elementales de
datos, uno de éstos es el tipo String.

Los “String” son objetos de Java con una sintaxis especialmente cómoda para representar cadenas de
caracteres.

También en Java los arrays son considerados como objetos (ésta es otra característica importante del
lenguaje Java).

Ejemplo:

String cadena =”Hola”;

Aunque en otros lenguajes sería un tipo básico, en Java se considerará un objeto de la clase String con lo
que tendrá propiedades y métodos.

Dentro de una clase Java, lo que vamos a tener siempre son propiedades y métodos únicamente, solo en
algunos casos que veremos más adelante, se pueden incluir otras clases también.

En Java no sucede como en C, no podemos “apuntar” a cada posición dentro de un String, solamente a la
cadena entera. Para poder manipular cada posición de un String tendríamos la clase StringBuffer que nos
permite acceder igual que en C a cada una de las posiciones como si se tratara de un array .

i
9

390
Tipos de datos y cadenas de caracteres

Creación de objetos de la clase String

Los Strings u objetos de la clase String se pueden crear explícita o implícitamente.

String Implícitamente
Para crearlo se pone una cadena de caracteres entre comillas dobles:

System.out.println("Curso de Java");

Java crea un objeto de la clase String automáticamente.

String Explícitamente
Para crear un String explícitamente (operador new) escribimos:

String cadena=new String("Curso de Java");

También se puede escribir, alternativamente:

String cadena="Nuestro primer programa";

String Vacío o Nulo


Para crear un String vacío o nulo (cadena vacía) se puede hacer de estas dos formas:

String cadena="";
String cadena=new String();

i
10

391
Tipos de datos y cadenas de caracteres

3. Resumen

Has llegado al final de este recurso formativo que denominamos “Tipos de datos y cadenas de caracteres”
En esta lección hemos estudiado los siguientes contenidos:

i
11

392
OPERADORES Y
SENTENCIAS DE
CONTROL DE
FLUJO

393
ÍNDICE
OPERADORES Y SENTENCIAS DE CONTROL DE FLUJO

1. Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3
2. Sentencias de control de flujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7
3. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15

394
Operadores y Sentencias de control de flujo

1. Operadores
Operadores Java

Las variables, como base de información de un lenguaje, pueden ser creadas,


modificadas y comparadas con otras por medio de los llamados operadores.

A continuación se enumeran los operadores utilizados en el lenguaje Java, pulsa


sobre cada uno para conocerlos.

Operadores aritméticos

Asignaciones

i
3

395
Operadores y Sentencias de control de flujo

Incrementos y decrementos

Comparaciones

Operadores lógicos

i
4

396
Operadores y Sentencias de control de flujo

Operadores bit a bit

Precedencia y Jerarquía de Operadores

Los operadores se organizan de acuerdo al nivel de precedencia de cada uno. Primeramente preceden
incrementos y decrementos, luego los aritméticos, después las comparaciones, detrás vienen los booleanos
u operaciones lógicas y por último las operaciones de asignación.

Los operadores de líneas superiores tienen prioridad sobre los que están por debajo y en una misma línea se
evaluarían de izquierda a derecha según aparecieran en la expresión.

397
Operadores y Sentencias de control de flujo

Aritmética de Strings

A continuación revisemos la aritmética de Strings.

El comando System.out.println("hola “+” desde Java"), manda el mensaje a la salida standard de nuestro
sistema, es decir, a la pantalla. El signo "+" sirve para concatenar cadenas con el fin de obtener una única
cadena, con lo que en la salida se obtendrá la concatenación (suma) de ambas cadenas Hola desde Java.

Si lo que queremos es concatenar una cadena de texto con una variable, la variable no debe de ir
entrecomillada.

Ejemplo

int x=3;
System.out.println(“valor de x es: “ + x );
La salida que se obtiene es  valor de x es: 3

i
6

398
Operadores y Sentencias de control de flujo

2.Sentencias de control de flujo


Sentencia condicional if

Existe una condición que se evalúa a cierto o falso; si resulta cierto, se evalúan las sentencias que están
inmediatamente a continuación y si resulta falso se evalúan las sentencias dentro del else.

La sintaxis o estructura general de la sentencia condicional if es la siguiente:

if (condicion) {
sentencia1;
sentencia2;
...
sentencian;
}
else {
sentencia1;
sentencia2;
...
sentencian;
}

i
7

399
Operadores y Sentencias de control de flujo

El operador ternario

El operador ternario se emplea para asignar valores a una variable en función del cumplimiento o no de una
condición, es decir, evalúa una condición y retorna un valor dependiendo si la condición es verdadera (true)
o falsa (false).

La sintaxis del operador ternario es la siguiente:

pregunta ? trueresultado : falseresultado;

Ejemplo

int radio = (x<y)? a : b;

Que equivale a las sentencias con if:

if (x<y) { r adio= a; }
else { radio = b; }

El condicional Switch

El condicional switch, es usado para evaluar el valor de una variable y actuar de una forma u otra según sea
su valor.

i
8

400
Operadores y Sentencias de control de flujo

Su sintaxis es:

switch (variable) {
case valor1:
sentencias1;
break;
case valor2:
sentencias2;
break;
case valorn:
sentenciasn;
break;
default:
sentenciasPorDefecto;
}

El bloque de sentencias por defecto es opcional. En la variable que evaluamos sólo se pueden comparar y
utilizar tipos de variables: int, char, byte y short. Ésta es una característica muy importante del lenguaje
Java.

Es importante reseñar la función de break. Su utilidad está en que las sentencias correspondientes a un valor
se ejecutan hasta llegar a un break, punto en el cual saltan al final del switch. Así, si nos interesa que se
ejecuten unas mismas sentencias para varios valores distintos, podemos teclear las sentencias una sola vez
y omitir los breaks correspondientes

Bucle FOR

Un bucle o ciclo, en programación, es una sentencia que se realiza repetidas veces a un trozo aislado de
código hasta que la condición asignada a dicho bucle deje de cumplirse. El bucle FOR se utiliza para repetir
más instrucciones, un determinado número de veces.

i
9

401
Operadores y Sentencias de control de flujo

De entre todos los bucles, FOR se suele utilizar cuando sabemos seguro el número de veces que queremos
que se ejecute la sentencia.

La sintaxis del bucle FOR se muestra a continuación.

for (inicialización ; condición ; incremento) {


sentencia1;
sentencia2;
...
sentencian;
}

Ejemplo

Inicialización de las posiciones de un array a 0.

for (int i=0; i<10; i++) {


array[i]=0;
System.out.println("Posicion: " + i + " icializada a 0");
}

La variable i que sirve para llevar la cuenta del número de repeticiones del bucle, se puede declarar dentro
o fuera del propio bucle. En el ejemplo, la hemos declarado dentro.

Bucle While

El bucle while se utiliza en la repetición condicional, un número de veces no determinado a priori. El bloque
de sentencias puede no ejecutarse ninguna vez.

i
10

402
Operadores y Sentencias de control de flujo

La sintaxis del bucle while se muestra a continuación.

while (condicion) {
sentencia1;
sentencia2;
...
sentencian;
}

Ejemplo

x=1;
while(x<5)
{
x=x+1;
System.out.println(x); }

Se imprimirá por pantalla: 2, 3, 4. Cuando x valga 5 se romperá el bucle y el flujo del


programa saldrá de éste pasando a la siguiente instrucción al bucle while

Bucles Do/While

El bucle do/while se utiliza en la repetición condicional un número de veces no determinado a priori. El


bloque de sentencias se ejecuta al menos una vez.

i
11

403
Operadores y Sentencias de control de flujo

La sintaxis del bucle do/while se muestra a continuación.

do {
sentencia1;
sentencia2;
...
sentencian;
} while (condicion);

Ejemplo

x=1;
do{
System.out.println(x);
x=x+1;
} while(x<5)

Se imprimirá por pantalla: 1, 2, 3, 4. Cuando x valga 5 se romperá el bucle y el flujo del


programa saldrá de éste pasando a la siguiente instrucción al bucle while

Rotura de bucles

Consiste en usar la palabra reservada break para salirse de los bucles for/while/do por cumplirse cierta
condición de break.

Simplemente colocaríamos la palabra en aquel sitio donde debe terminar el bucle en caso de llegar allí. Esta
técnica no es muy recomendada en programación. Lo normal es usarlo solamente en el Swicth.

i
12

404
Operadores y Sentencias de control de flujo

Además se puede utilizar el comando continue del mismo modo que el comando break sólo que en este caso
se termina esta iteración y no el bucle completo.

Ejemplo

for(int i =0;i<10;i++)
{
if (i==3)
continue;
System.out.println(i);
}
}
Imprimiría por pantalla : 0,1,2,4,5,6,7,8,9
Se saltaría la iteración correspondiente a i=3

i
13

405
Operadores y Sentencias de control de flujo

Bucles etiquetados

Los bucles etiquetados son útiles para poner una etiqueta al bloque que queremos que se salte al utilizar
break o continue.

La forma de etiquetar consiste en poner un nombre de etiqueta terminado con ":" exactamente antes del
comienzo del bucle que queremos y añadiendo a la palabra clave break o continue el nombre de la etiqueta.

Ejemplo

salir:
for (int i=0; i<10; i++) {
while (x<50) {
if (i*x == 400)
break salir;
sentencia2;
...
sentencian;
}
sentencia2;
...
sentencian;
}

i
14

406
Operadores y Sentencias de control de flujo

3. Resumen

Has llegado al final de este recurso formativo que denominamos “Operadores y sentencias de control de
flujo”

En esta lección hemos estudiado los siguientes contenidos:

i
15

407
CLASES Y
OBJETOS.
LAS CLASES
JAVABEANS

408
ÍNDICE
CLASES Y OBJETOS. LAS CLASES JAVABEANS

1. Definición formal de clase y objeto. Creación de objetos a partir de clases. . . . . . . . . . . . . . .3


2. Implementación de métodos y atributos de una clase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7
3. Modificadores de acceso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13
4. Clases de Tipo JavaBeans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16
5. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .20

409
Clases y objetos. Las clases JavaBeans

1. Definición formal de clase y objeto.


Creación de objetos a partir de clases.
Definición de clase

Una clase la podríamos definir como una plantilla que contiene aquellas
propiedades y métodos comunes a todos los objetos que pertenezcan a dicha clase.

En el caso de que quisiéramos implementar la clase Coche, pensaríamos mediante


este proceso de abstracción en propiedades comunes a todos los coches, por
ejemplo, color, número de puertas, tipo de motor, etc. y también en aquellos
métodos comunes a todos los coches, tales como, acelerar, frenar, etc.

Al crear un objeto, dicho objeto heredará las propiedades y métodos de la clase a la cual pertenece y es aquí,
en dicho objeto, donde las propiedades tomarán valor.

Ejemplo

class Coche {
String color;
int numeroRuedas;
String tipoMotor;
public void acelerar(){}
public void frenar()
}

i
3

410
Clases y objetos. Las clases JavaBeans

Extend

En Java no existe la herencia múltiple, esto significa que una clase sólo se puede heredar de una sola clase.
Sin embargo, varias clases sí podrían heredar todas ellas de la misma clase.

Para indicar que una clase hereda de otra lo indicaremos con la palabra reservada extends.

En el ejemplo la codificación sería:

class B extends A
{

i
4

411
Clases y objetos. Las clases JavaBeans

Operador New

Deducimos que en Java solamente puede haber un extends.

Si queremos crear un nuevo objeto de cualquier clase, hemos de hacer uso de el operador new.

La forma de utilizarlo es la siguiente:

NombreClase NombreNuevoObjeto = new NombreClase();

Ejemplos

String str = new String();


Random r = new Random();
Date fecha = new Date(27,4,2003);

Dentro de los paréntesis del constructor de la clase pueden ir parámetros de inicialización de las variables
de la clase, o pueden ir en blanco. Esto va a depender de cada clase en concreto. Así una misma clase puede
tener varios constructores y a cada uno de ellos se le pasarían unos parámetros determinados.

Constructor

Constructor es un método propio de cada clase que nos permite crear un nuevo objeto de esa clase. Este
método se llama exactamente igual que la clase, no retorna ningún valor.

i
5

412
Clases y objetos. Las clases JavaBeans

El constructor reserva memoria para un nuevo objeto e inicializa sus variables. Realmente el operador new
es el que reserva dicho espacio de memoria y posteriormente llama al constructor de la clase:

Sobrecarga de métodos

El tener varios métodos con el mismo nombre (identificativo), pero conteniendo diferentes tipos de
parámetros, que realizan diferentes funciones según estos parámetros de entrada, se denomina sobrecarga
de métodos (es lo que definíamos como polimorfismo).

Al contrario de lo que ocurría en C++, en Java no esta permitida la sobrecarga de los operadores (+,-,*,/,...).

Ejemplo

class Numeros {
int x;
Numeros(){
x=2;
}
}
En este ejemplo la clase Numeros tiene un constructor que se llama igual que la
clase y lo que hace es inicializa la variable de instancia x a 2.

La liberación de memoria, cuando hemos terminado con un objeto, la hace Java dinámica y
automáticamente. Es lo que se denomina garbage collection (recolección de basura). Es un proceso que va
eliminando de memoria todos aquellos objetos que ya no se utilizan por parte del programa.

i
6

413
Clases y objetos. Las clases JavaBeans

2. Implementación de métodos y atributos de una clase


Acceso a las variables

A las variables se accede mediante la dot notation (notación punto).

Nos referiremos a una variable de un objeto, indicando el nombre del objeto, luego ".", y finalmente el
nombre de la variable.

Objeto.variable;

Al utilizar esta expresión se devolverá el valor de la variable.

Para acceder a las variables y métodos de una clase hay que hacerlo a través de un objeto de
esa clase.

El objeto siempre será necesario para poder acceder a las variables y métodos del objeto, esto es una regla
en Java, que tendrá una excepción que también veremos.

Ejemplo

class Ejemplo{
int numero;
public static void main(String args[])
{
ejemplo e = new Ejemplo();
e.numero=7;
}
}

i
7

414
Clases y objetos. Las clases JavaBeans

Para poder acceder a la variable número, hay que hacerlo a través de un objeto. En el ejemplo es “e” el
objeto, y usando la notación “punto” accedemos a la variable numero.

Tipos de variables

Variables de instancia

Son aquellas que van dentro de la clase y también se denominan propiedades o atributos. No hace falta
inicializarlas. Se necesita un objeto para acceder a ellas.

Variables de clase

Son aquellas que van dentro de la clase, no hace falta inicializarlas, se necesita un objeto para acceder a
ellas. Ésta es la excepción a la regla que señalamos antes. Además llevan la palabra reservada static delante
al declararlas. Si modificamos su valor en un objeto, automáticamente se modificará en todos los que tengan
esa variable.

static int colores;

Variables locales

Son las que van dentro de los métodos. Es obligatorio inicializarlas antes de usarlas.

void pintar()
{
String color=”Rojo”;
System.out.println(color);
}

i
8

415
Clases y objetos. Las clases JavaBeans

Acceso a los métodos

Se accede también haciendo uso de la dot (notación “punto”) notation.

Objeto.metodo();

- Todos los métodos llevan los paréntesis asociados, con o sin parámetros.

- Igualmente como ocurría con las variables, también hay métodos de instancia y métodos de clase,
con propiedades similares.

- Es decir, si un método lleva delante el modificador static significa que no es necesario tener un
objeto para poder acceder a él.

Ejemplo

class Ejemplo{
static void pintar()
{
System.out.println(“Java”);
}
public static void main(String ags[])
{
pintar(); //No hace falta crear un objeto para acceder al método pintar
}
}

i
9

416
Clases y objetos. Las clases JavaBeans

Hay que recordar esta regla ya que es muy importante. Siempre que una variable o un método lleven el
modificador static delante no tendremos la necesidad de tener que crear un objeto.

Declaración completa de un método

La declaración completa de un método sería:

[Modificador] tipo_devuelto Nombre_método ( [parámetros formales ])


{
[return valor;]
}

Todo lo que va entre corchetes es opcional.

[Modificador]:
aplicable a métodos, se verán más adelante los posibles modificadores.`

tipo_devuelto:
palabra reservada. Sirve para declarar el tipo de dato que devuelve el método: Si se pone void significa que
el método no devuelve ningún valor.

Nombre_método:
es el nombre que le damos al método .

[parámetros formales]:
son los parámetros que recibe el método. Hay que declarar también su tipo.

[return valor;]:
si el método no es void, debe de devolver un valor .

i
10

417
Clases y objetos. Las clases JavaBeans

Llamar a un método dentro del código del programa

Para llamar a un método dentro del código del programa ponemos su nombre asociado a un objeto (si es static
no hace falta) y se le pasan los parámetros si fuese necesario.

Ejemplo

1.

int suma(int x, int y)


{
return (x+y);
}
...

2. Después en cualquier punto del programa hacemos la llamada al método.

3.

objeto.suma(2,3);
y nos devolvería un 5.

4.

En el API de Java son muchísimos los métodos que llevan este modificador. Para llamarlos basta con anteponer
el nombre de la clase a la que pertenece el método , y en muchos otros casos ni siquiera haría falta.

El método static más conocido es el main , que es llamado por la JVM en el momento de ejecutar una clase
principal.

i
11

418
Clases y objetos. Las clases JavaBeans

Asignar el valor de un objeto a otro

Cuando asignamos el valor de un objeto a otro, lo que estamos haciendo es referenciar el segundo objeto al
primero, de modo que si cambiamos alguna variable del primer objeto, ésta también cambiará en el segundo.

Ejemplo

Punto pt1, pt2;


pt1 = new Punto(100,100); // el constructorrecibe dos valores
//enteros para inicializar las
// variables x e y de instancia a 100
pt2 = pt1;
pt1.x = 200; //modificamos valor de x

Ahora pt1.x vale 200, pero pt2.x también vale 200.

i
12

419
Clases y objetos. Las clases JavaBeans

3. Modificadores de acceso
En las clases: Public

Las clases declaradas como public son accesibles desde otras clases, bien sea directamente o bien mediante
herencia, desde clases declaradas fuera del paquete que contiene a esas clases públicas debido a que, por
defecto, las clases solamente son accesibles por otras clases declaradas dentro del mismo paquete en el que
se han creado.

Para acceder desde otros paquetes, primero tienen que ser importadas. La sintaxis sería:

public class nombreClase extends nombreClase { }

En las clases: Abstract, Final, Synchronizable

Ahora revisaremos las clases Abstract, Final, Synchronizable

Abstract:
Una clase abstract tiene al menos un método abstracto. Una clase abstracta no se instancia (esto significa
que no pueden crearse objetos de dichas clases), sino que se utiliza como clase base para la herencia. Es el
equivalente al prototipo de una función en C++. Un método abstracto es un método que no se puede redefinir.

Final:
Clase final es aquella que ya no puede tener clases derivadas por debajo de ella, es decir, no podría tener
clases hijas, es lo contrario a una clase abstracta. Nadie puede heredar de una clase final. Aunque sería
posible declarar clases con varias combinaciones de public, abstract y final, la declaración de una clase
abstracta y a la vez final no tiene sentido, y el compilador no permitirá que se declare una clase con esos
dos modificadores juntos.

i
13

420
Clases y objetos. Las clases JavaBeans

Synchronizable:

Este modificador indica que todos los métodos definidos en la clase están sincronizados, es decir, que no se
puede acceder al mismo tiempo a ellos desde distintos threads; el sistema se encarga de colocar los avisos
o warnings necesarios para evitarlo. Este mecanismo hace que desde hilos diferentes se puedan modificar
las mismas variables sin que haya problemas de que se sobrescriban.

En los atributos: propiedades de la clase y métodos

Los modificadores de acceso son palabras reservadas del lenguaje que nos permiten restringir la visibilidad
y acceso a los elementos de nuestra solución de software. Existen 4 tipos de modificadores:

Cualquier elemento declarado, sin asignarle un modificador de acceso especifico, toma el nivel de acceso
por defecto, este nivel es llamado el nivel amistoso o con visibilidad de paquete porque estos elementos se
comportan como elementos públicos (cualquiera los puede ver) para la clase y todas las clases definidas
dentro del paquete; pero se comportan como privados (nadie los puede ver) por fuera del paquete.

default: Texto es el que aparece en pantalla. En este cuadro además hay un roll over en la palabra paquete
(al final del texto en negrita), abre roll over:

Un paquete o package es una subcarpeta que creamos para guardar clases y de esa forma poder organizarla
en librerías.

i
14

421
Clases y objetos. Las clases JavaBeans

public: Los elementos de tipo públicos son visibles desde cualquier parte, es decir se pueden leer o modificar
desde cualquier clase que conforme la solución de software.

protected: Los elementos protegidos serán visibles para la misma clase y las clases que heredan de ésta.

private: Los elementos privados sólo son visibles dentro de la clase que fueron declarados.

Estos cuatro elementos son aplicables a los atributos y métodos de nuestras clases y los dos primeros a
nuestras clases en sí.

i
15

422
Clases y objetos. Las clases JavaBeans

4. Clases de Tipo JavaBeans


Diferencia entre un objeto y un componente

En Java un objeto y un componente aparentemente son lo mismo. Sin embargo, la diferencia radica en que
un componente es reutilizable mientras que el periodo de vida de un objeto es desde que empieza el
programa hasta que éste termina.

- Se puede crear un interfaz de usuario en un IDE Java usando componentes: paneles, botones,
etiquetas, caja de listas, barras de desplazamiento, diálogos, menús, etc.

- Si has programado en cualquier lenguaje orientado a objetos, ya estarás familiarizado con la idea de
componente, aunque el lenguaje de programación sea diferente. Existen componentes que van desde
los más simples como un botón hasta otros mucho más complejos como un calendario, una barra de
estado, etc.

Ventaja de los JavaBeans

La especificación de JavaBeans de Sun Microsystems los define como "componentes de software reutilizables
que se puedan manipular visualmente en una herramienta de construcción".

La primeros componentes que tuvieron gran éxito fueron los VBX (Visual Basic Extension), seguidos a
continuación por los componentes OCX (OLE Custom Controls).

La principal ventaja de los JavaBeans es que son independientes de la


plataforma, definición típica del lenguaje Java.

i
16

423
Clases y objetos. Las clases JavaBeans

Algunos componentes son visibles cuando se ejecuta una aplicación, pero no tienen por qué serlo, solamente
tienen que ser visibles en el momento de su diseño, para que puedan ser manipulados por un Entorno de
Desarrollo de Aplicaciones (IDE) al estilo del NetBeans, por poner un ejemplo.

Entorno de desarrollo de aplicaciones (IDE)

Podemos crear una aplicación en un IDE seleccionando los componentes visibles e invisibles en una paleta
de herramientas para situarlas sobre un panel o una ventana, arrastrándolos con el ratón.

Con el ratón unimos los sucesos (events) que generan un objeto (fuente), con los objetos (listeners)
interesados en responder a las acciones sobre dicho objeto.

Ejemplo

- Un botón que cuando pulsaramos sobre él automáticamente nos estableciera la conexión con una base
de datos.

- Tendríamos un componente que sería un botón, programado, por decirlo de alguna forma, para que
realice esa acción.

- Posteriormente dicho componente se podría agregar a una plataforma IDE para que otros
desarrolladores los incorporasen a sus desarrollos Java.

Hay compañías que se dedican a la comercialización de componentes Java beans, como por
ejemplo The Theary Center que diseña componentes para otras empresas.

i
17

424
Clases y objetos. Las clases JavaBeans

Características de los Componentes JavaBeans

A pesar de haber muchas semejanzas, los JavaBeans no deben confundirse con los Enterprise JavaBeans
(EJB), una tecnología de componentes del lado servidor que es parte de Java EE a la que ya hicimos referencia
en apartados anteriores.

Características de los componentes JavaBeans

Introspección: permite analizar a la herramienta de programación o IDE como trabaja el Bean.

Customización: el programador puede alterar la apariencia y la conducta del Bean.

Events: informa al IDE de los sucesos que puede generar en respuesta a las acciones del usuario o del sistema,
y también los sucesos que puede manejar.

Properties: permite cambiar los valores de las propiedades del Bean para personalizarlo (customization).

Persistencia: se puede guardar el estado de los Beans que han sido personalizados por el programador,
cambiando los valores de sus propiedades.

Reglas para la programaciòn de un Bean

Y en cuanto a la programación pura y dura de un Bean tenemos una clase que obedece a ciertas reglas:

- Un Bean tiene que tener un constructor por defecto (sin argumentos).

- Un Bean tiene que tener persistencia, es decir, implementar el interface


Serializable.

- Un Bean tiene que tener introspección (instrospection). Los IDE reconocen


ciertas pautas de diseño, nombres de las funciones miembros o métodos y
definiciones de las clases, que permiten a la herramienta de programación
observar dentro del Bean y conocer sus propiedades y su conducta.

i
18

425
Clases y objetos. Las clases JavaBeans

Propiedades de un Bean

Las propiedades de un Bean pueden examinarse y modificarse mediante métodos que acceden a dicha
propiedad, y pueden ser de dos tipos (patrón getter and setter) .

getter: lee el valor de la propiedad.

setter: cambia el valor de la propiedad

Ejemplo

private String nombre;


//métodos set y get de la propiedad denominada nombre
public void setNombre(String nuevoNombre){
nombre=nuevoNombre;
}
public String getNombre(){
return nombre;
}

i
19

426
Clases y objetos. Las clases JavaBeans

5. Resumen

Has llegado al final de este recurso formativo que denominamos “Clases y objetos. Las clases JavaBeans ”
En esta lección hemos estudiado los siguientes contenidos:

i
20

427
ARRAYS, LA CLASE
OBJECT Y TIPOS
GENÉRICOS

428
ÍNDICE
OPERADORES Y SENTENCIAS DE CONTROL DE FLUJO

1. Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3
2. La clase Object y las conversiones de tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8
3. Definición de tipos genéricos. Ventajas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13
4. Comodines y restricciones de tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16
5. Métodos genéricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19
6. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21

429
Arrays, la clase Object y tipos genéricos

1. Arrays
Declaración del Array

Los Arrays son una lista de elementos de cualquier tipo o clase que ocupan
posiciones contiguas en la memoria y además se pueden referenciar a través de un
índice. Todos los elementos han de ser del mismo tipo.

Declaración del Array

Existen dos formas:

1. Tipo_Array NombreArray [ ];
2. Tipo Array [ ] NombreArray;

En la definición de un Array observamos que nunca se indica el número de elementos de que consta.

Ejemplo

String Palabras[ ];
int numeros[ ];
String[ ] Palabras;
int[ ] numeros;

i
3

430
Arrays, la clase Object y tipos genéricos

Creación de un Array

Hay dos formas de crear un Array:

1. Tipo_Array[ ] NombreArray = new Tipo_Arra[tamaño];

Donde tamaño es el número de elementos del Array.


Aquí en la creación del Array es obligatorio indicar el número de elementos de que consta el Array.

Ejemplo

int numeros=new int [10]; // Array de enteros que va desde la //posición 0 a la 9

2. La segunda forma de crear un Array es creándolo y dándole valores iniciales:

Tipo_Array[ ] NombreArray = {valor1,valor2, ...};

Los valores entre llaves deben ser del mismo tipo; del tipo Tipo_Array.

Ejemplo

char letras []={‘a’,’b’,’c’}; // Array de carácteres de 3 posiciones

i
4

431
Arrays, la clase Object y tipos genéricos

Acceso al Array. Arrays multidimensionales

El acceso para asignarle un valor a un objeto se hace de la siguiente manera:

NombreArray [posición] = valor;

La posición del Array comienza desde la posición 0.

Ejemplo

int numeros[]=new int[3];


numeros [0]=1;
numeros [1]=3
numeros [2]=6

Arrays multidimensionales

Java no soporta Arrays mutidimensionales, pero sí podemos declarar un Array de Arrays consiguiendo el mismo
efecto:

Int coordenadas[ ] [ ] = new int [2][2];


coordenadas [0][0] = 1;
coordenadas [0][1] = 2;
coordenadas [1][0] = 3;
coordenadas [1][1] = 4

Si la dimensión es 2 al Array se le denomina matriz.

i
5

432
Arrays, la clase Object y tipos genéricos

Obtener la longitud del Array

Todos los objetos Array tienen una variable de instancia llamada length.

Esta variable contiene el número de elementos presentes en el mismo, de este modo, podríamos recorrer en
un bucle FOR, el contenido del Array desde la posición 0 hasta la última de la siguiente manera:

int numeros []=new int[10];


for(int i=0;i<numeros.length;i++)
{ ...
...
}

En este caso se hace uso de la variable length para obtener el número de elementos del Array,
lo cual es siempre más seguro.

Comprobación de los límites del Array

A diferencia de C++ en Java, los accesos no permitidos al Array se comprueban por el sistema en tiempo de
ejecución y cualquier intento de emplear un índice fuera del rango permitido provocaría una excepción.

Una excepción es un error en tiempo de ejecución que puede ser controlada desde el propio código. Cada
excepción o error en tiempo de ejecución es representada por una clase Java siendo el error un objeto de
dicha clase.

En caso de tratar de acceder a una posición que excede el límite del Array, la clase que representa este
error se llama ArrayIndexOutOfBoundException, estamos por ejemplo accediendo a la posición 7 de un Array
que solo tiene 5 posiciones.

i
6

433
Arrays, la clase Object y tipos genéricos

Dentro de la definición del método main

public static void main (String args[ ] ){}


String args[ ] corresponde a la definición de un Array denominado args, que es de tipo String, o sea, almacena
datos en formato cadena y es el Array donde se almacenan los datos que se le pasan al programa por línea
de comandos.

A la hora de ejecutar el programa

C:>Java Prueba 6
El 6 en este caso se almacenaría automáticamente en la posición 0 del Array args. Pero se almacenaría como
la cadena “6” ya que el Array es de tipo cadena de caracteres. Para poder operar con él en caso de querer
realizar una operación aritmética habría que convertirlo a número entero con la función:
Integer.parseInt(args [0]); // args [0] hace referencia a la primera posición del Array args.

Si queremos pasar más de un parámetro al programa desde la línea de comandos, se pondría uno a
continuación del otro seguido por espacios en blanco.

Por ejemplo:

C:>Java Prueba 4 hola 56 luis


Array args

El Array args es el único Array en Java cuya dimensión es indefinida.

i
7

434
Arrays, la clase Object y tipos genéricos

2. La clase Object y las conversiones de tipos


La clase Object

La clase Object es la clase raíz de la cual derivan todas las clases. Esta derivación es implícita, todas las clases
Java, si no indicamos nada, derivan de Object.

La clase Object, es por decirlo de alguna manera, la madre de todas las clases, la superclase de la cual
derivan todas las demás en Java.

Comparación de objetos

Al comparar objetos sólo podemos saber si son o no iguales.

i
8

435
Arrays, la clase Object y tipos genéricos

Solo serán iguales si son el mismo objeto, ya que lo que realmente contiene un objeto es una dirección de
memoria. En esta dirección de memoria guarda el contenido del objeto, de tal modo, que aunque 2 objetos
distintos tengan el mismo contenido, al compararlos con el operador == serán diferentes ya que lo que
realmente estamos comparando son 2 direcciones de memoria distintas.

Para comparar dos objetos String utilizaremos el método equals() perteneciente a la clase Object, en lugar
del operador '==' por el mismo motivo que hemos citado antes ya que los Strings en Java son objetos.

Ejemplo

String nombre1=”Juan”;
String nombre2=”Luis”;
if(nombre1.equals(nombre2)) // para comparar si son iguales ambas cadenas
{
}
...

Determinando la clase de un objeto

Para saber de qué clase es un objeto determinado, haremos uso de funciones predefinidas que pertenecen
a la clase madre de todas, la clase Object.

Dado el objeto obj haríamos:

String nombre = obj.getClass().getName();

i
9

436
Arrays, la clase Object y tipos genéricos

También podríamos hacer uso del operador instanceof para saber si un objeto pertenece a una clase de la
siguiente forma:

Objeto instanceof NombreClase;

Devuelve true si el objeto es de esa clase.

Ejemplo

if(a instanceof Applet) // preguntamos si el objeto a pertenece a la clase Applet


{
...
}

La clase Object define una serie de funciones miembro que heredan todas las clases.

public class Object {


public boolean equals(Object obj) {
return (this == obj);
}
protected native Object clone() throws CloneNotSupportedException;
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
protected void finalize() throws Throwable { }
//otras funciones
}

i
10

437
Arrays, la clase Object y tipos genéricos

Casting: conversión de tipos

Casting consiste en convertir un valor de un tipo dado, en otro valor de otro tipo, que sea compatible con el
primero y sin perder el valor original.

El Casting se puede realizar de 3 formas:

Casting entre tipo primitivos:


es el más utilizado, no se puede aplicar a valores booleanos. Si convertimos de un tipo a otro que utiliza más
bits para almacenar el valor, mantenemos la precisión.

La conversión de tipo aplicado a variables se hace:

VariableNueva = (NombreTipo) valor;

Ejemplo: cociente = (int) (x / y);

Casting entre tipos de objetos:


para realizar la conversión de objetos de una clase a otra, ambas clases deben estar relacionadas mediante
la herencia. De este modo, si convertimos de una clase a una subclase de ésta, como ésta hereda toda la
información, no perdemos información.

La conversión de una clase a otra se hace:

ObjetoNuevo = (NombreClase) objeto;

11

438
Arrays, la clase Object y tipos genéricos

Conversión de tipos de tipos primitivos a objetos:


la conversión de tipos primitivos a objetos no se puede hacer directamente pues son dos estructuras distintas,
pero Java define clases asociadas a los tipos primitivos básicas y así se soluciona el problema:

clase Integer para los int


clase Float para los float
clase Boolean para los boolean
...
etc.

Para crear de esta forma un objeto equivalente haríamos uso de la función new ya conocida:

ClaseBasica NombreObjeto = new ClaseBasica();

Ejemplo: Integer num = new Integer(2);

i
12

439
Arrays, la clase Object y tipos genéricos

3. Definición de tipos genéricos. Ventajas


Características de los tipos genéricos

Los tipos genéricos se utilizan principalmente para implementar tipos abstractos de datos como son las pilas,
las colas y otros que permiten almacenar distintos tipos de elementos según sean instanciados en tiempo de
compilación.

Los tipos genéricos han sido añadidos a Java a partir de la versión 1.5 del jdk

- Con los tipos genéricos, los tipos que contienen datos, como por ejemplo las listas, no están definidas
para operar sobre tipos de datos específicos.

* Operan sobre un conjunto homogéneo en el que el tipo de conjunto es definido en la


declaración.

- Sin los tipos genéricos, es mucho más complicado trabajar con los tipos de datos que contienen a su
vez otros tipos.

* Para realizar esto es necesario declarar una lista que acepte objetos de tipo Object.

- Puesto que en Java todas las clases heredan de Object, la clase Lista (List) puede almacenar cualquier
tipo de elementos mediante polimorfismo (Definición de métodos con el mismo nombre, pero que
reciben distinto tipo o número de parámetros.) Luego, al recuperar estos elementos de la lista, es
necesario añadir los Castings pertinentes dependiendo del tipo de dato que haya sido introducido en
ella.

- Si en una lista metemos objetos de las clases coche, animal y casa, se guardarán como Object pero
al extraerlos de la lista habrá que hacer un Casting al tipo de objeto que proceda según se haya
guardado.

i
13

440
Arrays, la clase Object y tipos genéricos

Ejemplo

Vamos a declarar una lista de objetos de tipo Object en la que introducimos


un número de enteros obteniendo lo que ha sido introducido posteriormente:

List listaenteros = new LinkedList();


listaenteros.add( new Integer(5));
listaenteros.add( new Integer(9));
Iterator listIterator = listaenteros.iterator();
while(listIterator.hasNext())
{
Integer elemento = (Integer) listIterator.next();
}

Problemática v/s Ventaja de los tipos genéricos

Revisa el siguiente cuadro comparativo con las problemáticas y ventajas de los tipos genéricos.

i
14

441
Arrays, la clase Object y tipos genéricos

Para el compilador los elementos de todas las listas son de tipo Object, por lo que no se pueden comprobar
los tipos en tiempo de compilación.

El compilador sabe que los tipos de listas son diferentes porque contienen distintos elementos. Los errores
al ser detectados en tiempo de compilación son mucho más fáciles de detectar y corregir que los errores en
tiempo de ejecución.

La ausencia de soporte para el uso de tipos genéricos fue uno de los principales handicaps que tuvo el
lenguaje Java en sus primeras versiones. Esta característica estaba pensada originalmente para formar parte
de la especificación del lenguaje, pero debido a la falta de tiempo y a la complejidad de la propuesta de su
creador James Gosling, autor de la especificación del lenguaje, la inclusión de tipos genéricos no se pudo
realizar.

i
15

442
Arrays, la clase Object y tipos genéricos

4. Comodines y restricciones de tipos.


Comodines

Si necesitamos que un método cualquiera aunque no sea genérico, admita cualquier objeto de un tipo
genérico como parámetro, es posible usar el comodín de tipo o tipo desconocido.

Se representa con el carácter ?, en vez de un tipo concreto. Un ejemplo es el método reverse de la clase
Java.util.Collections:

Ejemplo:

static void reverse(List<?> lista)

Con el comodín de tipo se logra que el método invierta el orden en las listas parametrizadas con cualquier
tipo. Cuando definimos dichos métodos, el uso del comodín de tipo tiene dos connotaciones importantes
que debemos observar, debidas al desconocimiento del tipo:

1. Los métodos del tipo genérico (List<Tipo_uno>) que están declarados para devolver un valor del mismo tipo
que el parámetro de tipo (Tipo_uno), en la situación de desconocer el tipo devuelven un Object.

Ejemplo:

Tipo_uno get(int index) devolverá Object en vez de Tipo_uno

i
16

443
Arrays, la clase Object y tipos genéricos

2. Los métodos del tipo genérico (List< Tipo_uno >) que están declarados para aceptar argumentos cuyo tipo
es el parámetro de tipo (Tipo_uno), ), en la situación de desconocer el tipo no pueden ser llamados. El
compilador no lo permite porque no garantizaría la seguridad de tipos.

Ejemplo:

boolean add(Tipo_uno obj) no podrá ser llamado

Comodín de tipo limitado

El concepto de comodín de tipo lo vamos a usar pero limitándolo a determinadas clases, aquellas que derivan
o son superclases de una clase dada.

Vamos a crear un método que sume una lista de números de cualquier tipo:

- La clase Number es superclase de todas las que representan los números.

- Hasta ahora no podíamos utilizar como parámetro Java.util.List<Number> ya que nos limitaría
demasiado. No sería posible sumar listas de tipos derivados de Number, por ejemplo,
Java.util.List<Integer>.

- La otra opción sería usar List<?>, pero en este caso los elementos serían tratados como Object por
lo que no se podrían operar matemáticamente.

i
17

444
Arrays, la clase Object y tipos genéricos

El comodín de tipo limitado nos va a proporcionar una solución más factible:

public static double sumaLaLista(List<? extends Number>


listaDeNumeros){
double total = 0.0;
for (int i= 0; i < listaDeNumeros.size(); i++){
total += listaDeNumeros.get(i).doubleValue();
}
return total;
}

De este modo sólo se permiten listas de parámetros con clases derivadas de Number incluida la propia
Number.

En este ejemplo hay una limitación superior (<? extends Superclase>) pero también es posible limitar
inferiormente (<? super Subclase>), en este caso las clases posibles serán superclases de la dada.
En cuanto a los dos efectos derivados del uso de comodín de tipo, serían:

1. Se devuelve el tipo Object.

2. Es seguro llamar a los métodos pasando como argumento el tipo especificado como subclase

i
18

445
Arrays, la clase Object y tipos genéricos

5. Métodos genéricos

Los métodos genéricos son aquellos que tienen declaradas sus propias variables de tipo.

Un ejemplo son los métodos estáticos, que por su propia definición, no pueden acceder a las variables de
tipo declaradas en su propia clase, pero sí que podrían tener sus propias variables de tipo.

En los método genéricos las variables se declaran como hasta ahora, entre los
símbolos < >( menor-mayor) y separadas por comas.

Se sitúan entre los modificadores del método y el tipo de retorno.

Esta sería su declaración:

Modificador_Metodo <A,B,..> Tipo_Retorno nombre_Metodo(arg1,arg2,..)

Características de los métodos genéricos I

Los métodos genéricos se podrían utilizar para limitar los tipos pasados por parámetro del tipo genérico.

Este concepto se puede aplicar a una estructura de pila. Se podría añadir a la clase Pila, un método estático
que devolviera la suma de los elementos de la pila, con lo que hay que limitar como argumentos pilas con
parámetros de tipos derivados de Number:

public static <N extends Number> double sumaPila(Pila<N> p){


double total= 0;
for (int i = 0; i < p.pila.size(); i++)
total+= p.pila.get(i).doubleValue();
return total;
}

i
19

446
Arrays, la clase Object y tipos genéricos

Observa que se utiliza la variable de tipo N, para limitar las instancias de Pila. Esto se podría conseguir de
modo más eficiente, usando comodines de tipo que vimos anteriormente:

public static double sumaPila(Pila<? extends Number> p){


double total= 0;
for (int i = 0; i < p.pila.size(); i++)
total+= p.pila.get(i).doubleValue();
return total;
}

Características de los métodos genéricos II

Una mejor utilidad de estos métodos, es establecer relaciones entre los tipos de los parámetros o entre tipos
de parámetros y el tipo de retorno en un método.

Siguiendo con el mismo ejemplo de la pila de la pantalla anterior, podríamos pensar en un método que nos
devolviera la pila la suma más alta de sus elementos:

public static <N extends Number> Pila<N> sumaAlta(Pila<N> p1,


Pila<N> p2) {
Pila<N> resultado= null;
if (sumatorio(p1) > sumatorio(p2)) pilaResultado= p1;
else if (sumatorio(p1) < sumatorio(p2)) pilaResultado= p2;
return resultado;
}

En el método anterior además de limitar el tipo por parámetro a derivado de Number, relaciona los tipos de
los dos argumentos y del retorno. La relación en este caso es de igualdad.

De este modo este método sólo permitirá comparar pilas de enteros pero no una pila de enteros
parametrizada con tipo Double, aunque sea derivada de Number. Y claro está, el resultado sería una pila de
enteros.

20

447
Arrays, la clase Object y tipos genéricos

6. Resumen

Has llegado al final de este recurso formativo que denominamos “Arrays, la clase Object y tipos genéricos”
En esta lección hemos estudiado los siguientes contenidos:

i
21

448
SINTAXIS DEL LENGUAJE – Caso práctico

Módulo: SINTAXIS DEL LENGUAJE – Caso práctico


Haz un programa Java en modo MS-DOS, para calcular si el número 3456 es primo o no.

En el caso de que sea primo se imprimirá un mensaje por pantalla diciendo que el número es primo. En
el caso de que no sea primo tendrás que imprimir pon pantalla también la cantidad de divisores que
tiene dicho número. La clase se llamará Primo.java

Utiliza las estructuras for e if.

449
SINTAXIS DEL LENGUAJE – Caso práctico

Módulo: SINTAXIS DEL LENGUAJE – Caso práctico


Realiza un programa JAVA llamado Factorial.java en modo MS-DOS que muestre por pantalla el
factorial del número que se introduzca por línea de comandos. Dicho número ha de estar comprendido
entre 1 y 10, en caso de que no sea así se mostrará por pantalla el mensaje “Fuera de Rango” y
directamente nos sacará del programa ( return).

En caso de que el número de parámetros pasados al programa desde la línea de comandos sea distinto
de 1 sacaremos un mensaje diciendo “Número de parámetros incorrectos”.

Utiliza las estructuras for e if.

450
 

Módulo 4:
Utilización de las librerías
básicas de java

   

451
IMPORTAR CLASES:
EL PAQUETE
JAVA.LANG

452
ÍNDICE
IMPORTAR CLASES: EL PAQUETE JAVA.LANG

1. Importar clases y paquetes externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3


2. Manipulación de cadenas con la clase String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8
3. Operaciones matemáticas con la clase Math . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14
4. Clases de envoltorio y Clases runtime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19
5. Autoboxing y Autounboxing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .22
6. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .24

453
Importar clases: el paquete java.lang

1. Importar clases y paquetes externos


Paquetes Java

Un paquete o package es un conjunto de clases agrupadas bajo un mismo


ámbito, o sea, se agrupan todas las clases para evitar posibles errores en las
llamadas a las mismas.

Las vamos a ir agrupando en carpetas Windows en base a la funcionalidad


que desempeñen dichas clases.

En Java, los paquetes se realizan de forma jerárquica. Esta jerarquía de paquetes debe ser igual a una
jerarquía en directorios donde introduciremos los ficheros ejecutables de Java con extensión .class

package <nombre_paquete>;

Ejemplo

package ajedrez;
class Alfil {
// Cuerpo de la clase.
}

i
3

454
Importar clases: el paquete java.lang

Características de los paquetes

La palabra reservada package, permite agrupar clases e interfaces (más adelante veremos el concepto de
interface Java).

Los nombres de los paquetes son palabras separadas por puntos y se almacenan en directorios que coinciden
con esos nombres.
Los siguientes archivos: Applet.java, AppletContext.java, AppletStub.java, AudioClip.java, que son clases ya
creadas en Java con sus propios métodos y variables, contienen al inicio de su código la siguiente línea:

package java.applet;

Las clases que se obtienen al compilar dichos ficheros, se encuentran con el nombre:

nombre_de_clase.class, en el directoriojava/applet

Import

Para utilizar una clase desde fuera de un paquete vamos a usar la sentencia import:

El carácter * importa todas las librerías de ese paquete, es como si fuese un comodín.

i
4

455
Importar clases: el paquete java.lang

Los paquetes de clases se cargan con la palabra reservada import, especificando el nombre del paquete como
ruta y nombre de clase, de la misma forma que el #include de C y C++.

Si un fichero fuente Java no contiene ningún package, se coloca en el paquete por defecto sin nombre que
sería en este caso el mismo directorio en el que se encuentre el fichero fuente.

Tipos de paquetes Java

El lenguaje Java proporciona una serie de paquetes que incluyen interfaces gráficas de usuario con todos sus
componentes, ventanas, botones, utilidades, un sistema de entrada/salida con ficheros, streams,
comunicaciones, etc.

Los paquetes Java que se incluyen son:

java.applet
Este paquete contiene las clases específicas para usar applets. Hay una clase Applet y tres interfaces:
AppletContext, AppletStub y AudioClip. Las interfaces, como veremos más adelante, son muy similares a las
clases.

java.awt
El paquete Abstract Windowing Toolkit (awt) contiene clases para generar componentes GUI (Interfaz Gráfico
de Usuario). Incluye las clases Button, Checkbox, Choice, Component, Graphics, Menu, Panel, TextArea y
TextField, Frame, Dialog ,etc. Es uno de los paquetes más extensos del lenguaje Java.

java.io
El paquete de entrada/salida contiene las clases de acceso a ficheros, directorios, dispositivos de E/S,
mediante clases como FileInputStream, FileOutputStream, BufferedReader, etc.
Es muy utilizada en comunicaciones mediante sockets.

i
5

456
Importar clases: el paquete java.lang

java.lang
Este paquete incluye las clases del lenguaje Java propiamente dicho: Object, Thread, Exception, System,
Integer, Float, Math, String, etc.

Ademas, es el único paquete que se importa automáticamente sin necesidad de tener que recurrir a la
sentencia import de Java.

java.net
Este paquete da soporte a las comunicaciones del protocolo TCP/IP, entre ellos, el http tan importante en
Java como ya vimos. Incluye las clases Socket, URL y URLConnection , etc.

java.util
Este paquete contiene muchas utilidades Java, útiles para muchas cosas en programación. Se incluyen, entre
otras, Date (fecha), Dictionary (diccionario), Random (números aleatorios), Stack, Enumeration (es una
colección de objetos muy usado en Java), etc.

Sub-paquetes Java

Muchos de los paquetes Java contienen, a su vez, sub-paquetes. El hecho de que hagamos un import del
paquete entero no implica que estemos importando las clases de los sub-paquetes, sino solamente, las clases
del paquete.

i
6

457
Importar clases: el paquete java.lang

Ejemplo

El paquete java.awt, además de contener clases, contiene un sub-paquete denominado event que a su vez
contendrá más clases (observa además que los nombres de los paquetes siempre se escriben en minúsculas).

Si se escribe import java.awt.* se importan las clases que están únicamente dentro de la carpeta awt, pero
en ningún caso las que estuviesen dentro de la subcarpeta event.

Para poder trabajar con dichas clases se debe escribir:

import java.awt.event.*;

Fíjate que por cada nivel de carpetas escribimos su nombre separado con un punto.

i
7

458
Importar clases: el paquete java.lang

2. Manipulación de cadenas con la clase String

Podemos crear una cadena de forma sencilla de la siguiente manera:

String nombre = “Pedro”;

También, se pueden crear cadenas, a partir de la definición de un array de caracteres:

char [] b= {‘P’, ‘e’, ‘d’, ‘r’, ‘o’};


String nombre = new String(b);

Se permite concatenar String con el operador + (no existe sobrecarga de operadores excepto para este caso):

String apellidos = “Lopez”;


String nombre_completo = nombre + “ “ + apellidos;

Siempre se puede preguntar por la longitud del String:

int <String>.length()
int longitud = nombre_completo.length();
System.out.println (“Hola”.length());
System.out.println (new String = {‘H’, ’o’, ’l’, ’a’}.length();
Imprimiría 4

i
8

459
Importar clases: el paquete java.lang

Clase Stringbuffer

Para modificar el contenido de un String se utilizará la clase Stringbuffer:

String cad = “Pedro”;


cad = “Juan”;

Como se ha señalado anteriormente, en Java no se puede apuntar a cada posición de una cadena con un
objeto de la clase String, se modificaría la referencia pero no el contenido del objeto. Por esto usamos la
clase StringBuffer, que sí nos permite manipular el contenido de cada posición.

void <StringBuffer>.insert (int index, char c); > insertar.


void <StringBuffer>.append (char c); > añadir.
void <StringBuffer>.append (int i); > añadir.
void <StringBuffer>.append (String s); > añadir.
void <StringBuffer>.append (Object o); > añadir.

i
9

460
Importar clases: el paquete java.lang

Ejemplo de uso de StringBuffer

StringBuffer str = new StringBuffer(“Altura ”);


Str.append(25);
String mensaje = str.toString(); // mensaje = “Altura 25”
String str = “El tiene”+ edad +”años” ;
String str = new StringBuffer(“El tiene”) ;
str.append(edad);
str.append(“años”);
System.out.println( str.toString) ;

Métodos importantes de la clase String

Veamos los métodos más importantes de la clase String. Revísalos detenidamente.

char [] <String> toCharArray ():


Retorna un array de caracteres. (2 bytes/carácter).

byte [] <String>.getBytes ():


Retorna un array de bytes. (1 byte/carácter).

boolean <String>.equals(String):
Comparar 2 cadenas.

Ejemplo:
if (str1.equals(str2))
{
// se cumple
}

i
10

461
Importar clases: el paquete java.lang

boolean <String>.equalsIgnoreCase(String2):
Compara 2 cadenas sin tener en cuenta mayúsculas ni minúsculas.

boolean <String>.startsWith(String s):


Si la cadena empieza por s.

boolean <String>.endsWith(String a):


Si la cadena termina por a.

Ejemplo:

if (Fichero.endsWith(“.txt”))
{
// se cumple
}

int <String>.indexOf (char c):


Retorna el índice en que se encuentra la primera ocurrencia del carácter especificado.

int <String>.indexOf (String str):


Retorna el índice en que se encuentra la primera ocurrencia de la cadena especificada.

int <String>.indexOf (int index, char c):


Retorna el índice en que se encuentra la primera ocurrencia del carácter especificado desde el índice
especificado.

int <String>.indexOf (int index, String str):


Retorna el índice en que se encuentra la primera ocurrencia de la cadena especificado desde el índice
especificado. Si retorna –1 quiere decir que no ha encontrado la cadena o el carácter.

i
11

462
Importar clases: el paquete java.lang

String <String>.toLowerCase():
La cadena se pasa a minúsculas.

String <String>.toUpperCase():
La cadena se pasa a mayúsculas.

char <String>.charAt(int index):


Sirve para recoger un carácter en la posición indicada (en index).

Ejemplo de Métodos de la clase String

Vamos a ver estos últimos métodos con un ejemplo. Para ello vamos a crear la clase cadenas.java que va a
evaluar la siguiente cadena “En Un lUgar de lA mAncha" , la cual nos indicará, cuántas letras ‘A’ mayúscula
y ‘a’ minúscula tiene la cadena así como cuántas vocales en total.

Para esto usaremos el método charAt para ir extrayendo los caracteres de la cadena y poder discriminar si
es vocal, mayúscula o minúscula.

Iremos paso a paso revisando el programa.

Ejemplo

public class cadenas {

public static void main(String args[]){

String cadena="En Un lUgar de lA mAncha"; //Declaramos la variable


//cadena como String
int mayusculas=0,minusculas=0,cont=0; // Declaramos las variables

i
12

463
Importar clases: el paquete java.lang

// recorremos la cadena extrayendo el carácter de la posición i y preguntamos si //coincide


con ‘A’ o ‘a’ e incrementaremos sus respectivos contadores
for (int i=0; i<cadena.length(); i++){
if (cadena.charAt(i)=='A')
mayusculas++;
else
if (cadena.charAt(i)=='a')
minusculas++;
}
// Pasamos toda la cadena a minúsculas

cadena=cadena.toLowerCase();
// Recorremos nuevamente la cadena preguntando si el carácter que se extrae es vocal
// a,e,i,o,u
// como ya hemos pasado toda lacadena aminúscula no habrá que preguntar por las //mismas
vocales en mayúsculas
for (int i=0; i<cadena.length(); i++){
if
(cadena.charAt(i)=='a'||cadena.charAt(i)=='e'||cadena.charAt(i)=='i'||cadena.charAt(i)=='o'||ca
dena.charAt(i)=='u')
cont++;
}
// Imprimiremos todos los contadores

System.out.println("Las a's son: "+minusculas);


System.out.println("Las A's son: "+mayusculas);
System.out.println("Las vocales son: "+cont);
}
}
La salida sería:
Las a's son: 2
Las A's son: 2
Las vocales son: 8

i
13

464
Importar clases: el paquete java.lang

3. Operaciones matemáticas con la clase Math

Constantes de la clase Math

La clase Math contiene dos constantes definidas, el número PI y el número E:

public final class Math {


public static final double E = 2.7182818284590452354;
public static final double PI = 3.14159265358979323846;
//...
}

El modificador final implica que los valores que almacenan no se pueden cambiar, son valores constantes.

Para acceder a estas constantes de la clase Math, lo hacemos de la siguiente manera:

System.out.println("Pi vale " + Math.PI);


System.out.println("e vale " + Math.E);

Al tratarse de constantes estáticas se puede acceder, como ya dijimos, a través del nombre de la clase sin
necesidad de un objeto.

Métodos de la clase Math

La clase Math tiene muchos métodos y versiones diferentes de cada uno de ellos. Por ejemplo, para hallar
el valor absoluto de un número define el siguiente método: se llama a un método u otro, en función del tipo
de dato que se le pasa en su único argumento (sobreescritura de métodos o polimorfismo).

i
14

465
Importar clases: el paquete java.lang

public final class Math {


public static int abs(int a) {return (a < 0) ? -a : a; }
public static long abs(long a) {return (a < 0) ? -a : a; }
public static float abs(float a) {return (a < 0) ? -a : a; }
public static double abs(double a) {return (a < 0) ? -a : a; }
//...
}

Para hallar el valor absoluto de los siguientes números

int y = -13;
double z = 0.4145;
System.out.println("|" + y + "| es " + Math.abs(y));
System.out.println("|" + z + "| es " + Math.abs(z));

Math.abs(y), llama a la primera versión, y Math.abs(z) llama a la última versión.

Métodos trigonométricos

En las funciones trigonométricas los argumentos se expresan en radianes. Si tuviésemos un ángulo de 90º, se
pasaría a radianes y luego se calcularía el seno, el coseno y la tangente:

double angulo = 90.0 * Math.PI/180.0;


System.out.println("cos(" + angulo + ") es " + Math.cos(angulo));
System.out.println("sin(" + angulo + ") es " + Math.sin(angulo));
System.out.println("tan(" + angulo + ") es " + Math.tan(angulo));

i
15

466
Importar clases: el paquete java.lang

Para pasar de coordenadas rectangulares a polares usaríamos el método atan2, que admite dos argumentos,
la ordenada y la abscisa del punto. Nos devuelve el ángulo en radianes.

double y=-6.2; //ordenada


double x=1.2; //abscisa
System.out.println("atan2(" + y+" , "+x + ") es " + Math.atan2(y, x));

Métodos exponenciales, logarítmicos, potencia y raíz cuadrada

El método exponencial exp devuelve el número e elevado a una potencia:

System.out.println("exp(2.0) es " + Math.exp(2.0));


System.out.println("exp(10.0) es " + Math.exp(10.0));

El método log calcula el logaritmo natural (de base e) de un número

System.out.println("log(2.0) es " + Math.log(2.0));


System.out.println("log(Math.E) es " + Math.log(Math.E));

El método potencia eleva un número x a la potencia y, se emplea pow(x, y):

System.out.println("pow(5.0, 3) es " + Math.pow(5.0,3));

Para hallar la raíz cuadrada de un número, se emplea la función sqrt:

System.out.println("La raíz cuadrada de " + x + " es " + Math.sqrt(99));

i
16

467
Importar clases: el paquete java.lang

Aproximación de un número decimal

Si queremos definir un número real con un número determinado de números decimales, empleamos el método
round. Por ejemplo, para definir los números x e y, con dos cifras decimales cada uno, lo haremos de la
siguiente forma:

double x = 52.2144;
double y = .04394;
System.out.println(x + " es aprox. " + (double)Math.round(x*100)/100);
System.out.println(y + " es aprox. " + (double)Math.round(y*100)/100);

Salida
52.2144 es aprox. 52.21
0.04994 es aprox. 0.05

La función round devuelve un número entero int que es necesario convertir a double para efectuar la división
entre 100. Si utilizamos el método floor en vez de round :

System.out.println(x + " es aprox. " + Math.floor(x*100)/100);


System.out.println(y + " es aprox. " + Math.floor(y*100)/100);

Salida
52.2144 es aprox. 52.21
0.04994 es aprox. 0.04

La aproximación del primero es correcta, ya que la tercera cifra decimal es 4 inferior a 5. La aproximación
del segundo es incorrecta ya que la tercera cifra decimal es 9 mayor que 5.

i
17

468
Importar clases: el paquete java.lang

El mayor y el menor entre dos números

Para hallar el mayor y el menor de dos números se emplean los métodos min y max que comparan números
del mismo tipo.

int i = 8;
int j = -7;
double x = 92.3543;
double y = 0.2497;

// para hallar el menor de dos números

System.out.println("min(" + i + "," + j + ") es " + Math.min(i,j));


System.out.println("min(" + x + "," + y + ") es " + Math.min(x,y));

// para hallar el mayor de dos números

System.out.println("max(" + i + "," + j + ") es " + Math.max(i,j));


System.out.println("max(" + x + "," + y + ") es " + Math.max(x,y));

Números aleatorios

La clase Math define el método random, que devuelve un número aleatorio comprendido en el intervalo
[0.0, 1.0).

System.out.println("Número aleatorio: " + Math.random());

Salida: 0.25991750935573255

Por ejemplo, si quisiéramos calcular un número aleatorio entre 0 y 1000, lo haríamos de la siguiente forma:

System.out.println("Número aleatorio: " + (int)(Math.random()*1000));

Salida: Número aleatorio: 122

18

469
Importar clases: el paquete java.lang

4. Clases de envoltorio y Clases runtime

Clases Envoltorio o Clases Wrapper

Clases envoltorios o Clases Wrapper son las clases que sirven para representar los tipos fundamentales de Java
como objetos. Están organizados de forma jerárquica:

Todas estas clases tienen un constructor a partir de un tipo de dato fundamental.


Double (double d)
Float (float f)
...
Char (char c)

Para realizar la creación del objeto:


double d = 3.14;
Double D = new Double(d);
Float F = new Float (3.1f)

Para sacar el contenido de una Clase Wrapper se realizará con el siguiente método:
double <Double>.doubleValue();
float <Float>.floatValue();
int <Integer>.intValue();

i
19

470
Importar clases: el paquete java.lang

Utilidad de objetos

La utilidad que tienen estos objetos, es pasar los tipos de datos fundamentales por referencia y poder
modificar su valor:

Los siguientes métodos permiten convertir un String en un tipo de dato fundamental:

static byte <Byte>.parseByte(String Text)


static int <Integer>.parseInt(String Text)

Ejemplo

public class Suma {


public static void main (String [] args) {
try { //para capturar posibles errores en tiempo de ejecución, se verá en otro capítulo
int acumulador = 0;
for (int i = 0; i < args.length(); i++)
acumulador += Integer.pasrseInt(args[i]);
System.out.println (“Total de valor: “+acumulador),
}
catch(NumberFormatException ex)) { //para capturar posibles errores en tiempo de
//ejecución, se verá en otro capítulo
System.out.println(“Valor no valido”);
}
} // fin de main.
} // fin de clase.

i
20

471
Importar clases: el paquete java.lang

Clases Runtime (procesos)

Las Clases Runtime encapsulan un proceso del intérprete de la JVM, representa sólo procesos que están
ejecutándose dentro de la JVM. Las clases Runtime no se pueden instanciar (crear objetos).

Sí se pueden obtener referencias al Runtime que se está ejecutando en el momento:

Static Runtime <Runtime>.getRuntime()

El Runtime representa un panel de control que va a permitir realizar las siguientes funciones sobre el proceso
en ejecución:

Funciones

long <Runtime>.totalMemory()
Memoria adquirida en el proceso en ejecución.

long <Runtime>.freeMemory()
Memoria libre del proceso en ejecución.

void <Runtime>gc()
Recogida de basura (Garbage Collector).

Desde Java se puede llamar a otros programas con lenguajes de programación diferentes con los siguientes
métodos:

Ver métodos

Process <Runtime>.exec (String command)


Process <Runtime>.exec (String command, String [] emulador)
Donde String [] emulador se utiliza para almacenar las variables de entorno.
Process representa un proceso externo a Java.

21

472
Importar clases: el paquete java.lang

5. Autoboxing y Unboxing
Definición Autoboxing y Unboxing

Ejemplo

Integer num = new Integer(2); // declaramos un objeto de la clase Integer, equivalente a decir
//int num=2;
Map map = new HashMap(); // creamos una colección Map
map.put("resultado", num +1);

En el ejemplo, vemos que el tipo Integer es convertido a int para la suma, y después se vuelve
a convertir a Integer cuando se introduce al Map.

Uso de Autoboxing y Unboxing

Cuando hay una incompatibilidad entre los tipos de referencia y los tipos de datos primitivos es cuando
debemos usar el autoboxing, a pesar de que esto no es conveniente para cálculos científicos. Un Integer no
es un sustituto para un int. El autoboxing y unboxing simplemente ocultan las diferencias entre los wrappers
y los datos primitivos.

i
22

473
Importar clases: el paquete java.lang

Gracias al autoboxing podemos de manera fácil asignar un tipo primitivo a su Wrapper class, y al revés. Es
decir, podemos, por ejemplo, asignar un boolean a una clase Boolean.

Sin autoboxing

//Sin autoboxing
boolean v=false;Boolean verdad=new Boolean(v);//boxing
boolean v2=verdad.booleanValue();//unboxing

Con autoboxing

A partir de la versión de jdk 1.5:

//Con autoboxingboolean v=false;


Boolean verdad=v;//autoboxing
boolean v2=verdad;//autounboxing

Está claro, aún así, que esto puede tener un efecto rebote en el rendimiento de la aplicación, si mezclamos
tipos primitivos y objetos Wrapper en expresiones aritméticas. De hecho Sun Microsystem nos advierte de este
detalle en su documentación. Tendremos que tener un cierto cuidado a la hora de usar estas técnicas.

i
23

474
Importar clases: el paquete java.lang

6. Resumen

Has llegado al final de este recurso formativo que denominamos “Importar clases: el paquete java.lang”
En esta lección hemos estudiado los siguientes contenidos:

i
24

475
UTILIZACIÓN DE
LAS LIBRERÍAS
BÁSICAS DE JAVA

476
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

Paquetes e interfaces. APIS String y Math

Paquetes

Es un conjunto de clases agrupadas bajo un mismo espacio de nombre, es decir, se agrupan todas las clases
para evitar posibles errores en la llamada a la clase.

En Java los paquetes se realizan de forma jerárquica. Esta jerarquía de paquetes debe ser igual a una
jerarquía en directorios donde introduciremos los ficheros .class (bytecode).

Para empaquetar una clase:

package <nombre_paquete>;

package ajedrez;

class Torre {

// Cuerpo de la clase.
}

i
2

477
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

Interfaces

Un interface es una especificación de las operaciones que tienen los objetos de un determinado tipo de
forma. Los interfaces los define un fabricante y otros cumplen con ese interface definido.

interface Television {
[abstract] void encender();
void apagar();
void subirVolumen (int cuanto);
void bajarVolumen ( int cuanto);
void cambiarCanal (int canal);
int getCanalActual();
}

class Sanyo implements Television {


int volumen, canal;
static final int MIN_VOLUMEN = 0;
static final int MAX_VOLUMEN = 20;
static final int MIN_CANAL = 1;
static final int MAX_CANAL = 99;

void apagar () {
System.out.println (“Televisor apagado. Adiós.”);
}

void encender () {
System.out.println (“Televisión Sony BT13, hola.”);
}

i
3

478
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

void subirVolumen (int cuanto) {


if (volumen + cuanto > MAX_VOLUMEN)
volumen = MAX_VOLUMEN;
else volumen += cuanto;
}
void bajarVolumen (int cuanto) {
if (volumen – cuanto > MIN_VOLUMEN)
volumen = MIN_VOLUMEN;
else volumen -= cuanto;
}
void cambiarCanal (int canal) {
if (canal < MIN_CANAL || canal > MAX_CANAl)
return;

this.canal = canal;
}

void getCanalActual() {
return canal;
}
} // Fin de clase Sanyo

Los interfaces sólo pueden tener métodos abstractos (abstract) y atributos o variables finales de clase. Los
métodos son por defecto abstract en el interface.

Un interface puede estar implementado por varias clases y también una clase puede implementar varios
interfaces.

i
4

479
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

Una clase que implementa un interface, tiene que implementar todos sus métodos o bien declararse como
abstracta.

Al haber sólo herencia simple en Java tenemos:

class <nombre_clase> [extends <clase base>]


[implements <lista_interfaces>]
{. . .}

Existe conversión implícita de referencia a una clase que implementa a un interface al interface que
implementa la clase:

Sanyo s = new Sanyo();


Television tv = s; // Conversión implícita.
Television t = new Television(); // Error no se puede crear
// objeto a partir del
// interface Television.

Hay conversión explícita (casting) desde un interface hasta una clase que implemente ese interface;

s = (Sanyo) tv; // Correcto, conversión explícita.

Con un interface sólo se pueden crear referencias:

Television tv;

i
5

480
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

Se pueden realizar funciones que reciben como parámetros interfaces y trabajar con ellos:

static void usa (Television tv) {


tv.encender();
tv.subirVolumen();
tv.apagar();
}

...

Sanyo s = new Sanyo()


usa (s); // Se convierte en un objeto Television.

Herencia múltiple

Una clase derivada solamente puede tener una clase base y puede implementar muchos interfaces para
derivar de otras clases ya que los interfaces sólo tienen métodos abstractos entonces no se producen
ambigüedades.

Clase Base Rombo Interface


perimetro() p perimetro()

IS-A IS-A Rectángulo

Clase Derivada
Cuadrado
perimetro()

Siempre se llama el perímetro del rombo.

i
6

481
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

Java mantiene la jerarquía múltiple respecto a la jerarquía y no respecto a la reutilización.

El método toString()

Es una utilidad que se utiliza en clases de Java para que nos dé una descripción textual del objeto.

class Punto {
int x, y;

public String toString() {


return “[“+x+” , “+y”]”; // No se usa el objeto this.
}

El especificador super

Se puede usar para dos funcionalidades:

- Indicar qué constructor de la clase base se quiere ejecutar cuando se crea un objeto de la clase
derivada.
- Indicar que se quiere ejecutar un método de la clase base que existe también en la clase derivada.

class Punto {
int x, y;

Punto (int x, int y) {


this.x = x; this.y = y;
}

i
7

482
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

Public toString() {
return “[“+x+” , “+y+”]”;
}

} // Cierre de la clase Punto

class Pixel {
int color;

Pixel (int color) {


this.color = color;
super (x, y); // Llamada a constructor de la
//clase Punto.
}

Public String toString() {


return super.toString() + “color: “ + color;
// Llamada a la función toString de la clase Punto.
}
}

A continuación vamos a poner un extracto del API oficial de la página de SUN Microsystems para que tengas
a mano un resumen con los métodos más usados en lo que se refiere a la clase String y la clase Math.

i
8

483
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

Constructores

Clase String:

Constructores

String()
Initializes a newly created String object so that it represents an empty character sequence.

String(byte[] bytes)
Constructs a new String by decoding the specified array of bytes using the platform’s default charset.

String(byte[] ascii, int hibyte)


Deprecated. This method does not properly convert bytes into characters. As of JDK 1.1, the
preferred way to do this is via the String constructors that take a charset name or that use the
platform’s default charset.

String(byte[] bytes, int offset, int length)


Constructs a new String by decoding the specified subarray of bytes using the platform’s default
charset.

String(byte[] ascii, int hibyte, int offset, int count)


Deprecated. This method does not properly convert bytes into characters. As of JDK 1.1, the
preferred way to do this is via the String constructors that take a charset name or that use the
platform’s default charset.

String(byte[] bytes, int offset, int length, String charsetName)


Constructs a new String by decoding the specified subarray of bytes using the specified charset.

i
9

484
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

String(byte[] bytes, String charsetName)


Constructs a new String by decoding the specified array of bytes using the specified charset.

String(char[] value)
Allocates a new String so that it represents the sequence of characters currently contained in the
character array argument.

String(char[] value, int offset, int count)


Allocates a new String that contains characters from a subarray of the character array argument.

String(int[] codePoints, int offset, int count)


Allocates a new String that contains characters from a subarray of the Unicode code point array
argument.

String(String original)
Initializes a newly created String object so that it represents the same sequence of characters as the
argument; in other words, the newly created string is a copy of the argument string.

String(StringBuffer buffer)
Allocates a new string that contains the sequence of characters currently contained in the string
buffer argument.

String(StringBuilder builder)
Allocates a new string that contains the sequence of characters currently contained in the string
builder argument.

i
10

485
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

Métodos

char charAt(int index)


Returns the char value at the specified index.

int codePointAt(int index)


Returns the character (Unicode code point) at the specified index.

int codePointBefore(int index)


Returns the character (Unicode code point) before the specified index.

int codePointCount(int beginIndex, int endIndex)


Returns the number of Unicode code points in the specified text range of this String.

int compareTo(String anotherString)


Compares two strings lexicographically.

int compareToIgnoreCase(String str)


Compares two strings lexicographically, ignoring case differences.

String concat(String str)


Concatenates the specified string to the end of this string.

boolean contains(CharSequence s)
Returns true if and only if this string contains the specified sequence of char values.

boolean contentEquals(CharSequence cs)


Returns true if and only if this String represents the same sequence of char values as the specified
sequence.

i
11

486
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

boolean contentEquals(StringBuffer sb)


Returns true if and only if this String represents the same sequence of characters as the specified
StringBuffer.

static String copyValueOf(char[] data)


Returns a String that represents the character sequence in the array specified.

static String copyValueOf(char[] data, int offset, int count)


Returns a String that represents the character sequence in the array specified.

boolean endsWith(String suffix)


Tests if this string ends with the specified suffix.

boolean equals(Object anObject)


Compares this string to the specified object.

boolean equalsIgnoreCase(String anotherString)


Compares this String to another String, ignoring case considerations.

static String format(Locale l, String format, Object... args)


Returns a formatted string using the specified locale, format string, and arguments.

static String format(String format, Object... args)


Returns a formatted string using the specified format string and arguments.

Byte[] getBytes()
Encodes this String into a sequence of bytes using the platform’s default charset, storing the result
into a new byte array.

i
12

487
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

void getBytes(int srcBegin, int srcEnd, byte[] dst, int dstBegin)


Deprecated. This method does not properly convert characters into bytes. As of JDK 1.1, the
preferred way to do this is via the getBytes() method, which uses the platform’s default charset.

byte[] getBytes(String charsetName)


Encodes this String into a sequence of bytes using the named charset, storing the result into a new
byte array.

void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)


Copies characters from this string into the destination character array.

int hashCode()
Returns a hash code for this string.

int indexOf(int ch)


Returns the index within this string of the first occurrence of the specified character.

int indexOf(int ch, int fromIndex)


Returns the index within this string of the first occurrence of the specified character, starting the
search at the specified index.

int indexOf(String str)


Returns the index within this string of the first occurrence of the specified substring.

int indexOf(String str, int fromIndex)


Returns the index within this string of the first occurrence of the specified substring, starting at the
specified index.

i
13

488
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

String intern()
Returns a canonical representation for the string object.

int lastIndexOf(int ch)


Returns the index within this string of the last occurrence of the specified character.

int lastIndexOf(int ch, int fromIndex)


Returns the index within this string of the last occurrence of the specified character, searching
backward starting at the specified index.

int lastIndexOf(String str)


Returns the index within this string of the rightmost occurrence of the specified substring.

int lastIndexOf(String str, int fromIndex)


Returns the index within this string of the last occurrence of the specified substring, searching
backward starting at the specified index.

int length()
Returns the length of this string.

boolean matches(String regex)


Tells whether or not this string matches the given regular expression

int offsetByCodePoints(int index, int codePointOffset)


Returns the index within this String that is offset from the given index by codePointOffset code
points.

boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)
Tests if two string regions are equal.

i
14

489
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

boolean regionMatches(int toffset, String other, int ooffset, int len)


Tests if two string regions are equal.

String replace(char oldChar, char newChar)


Returns a new string resulting from replacing all occurrences of oldChar in this string with newChar.

String replace(CharSequence target, CharSequencereplacement)


Replaces each substring of this string that matches the literal target sequence with the specified
literal replacement sequence.

String replaceAll(String regex, String replacement)


Replaces each substring of this string that matches the given regular expression with the given
replacement.

String replaceFirst(String regex, String replacement)


Replaces the first substring of this string that matches the given regular expression with the given
replacement.

String[] split(String regex)


Splits this string around matches of the given regular expression.

String[] split(String regex, int limit)


Splits this string around matches of the given regular expression

boolean startsWith(String prefix)


Tests if this string starts with the specified prefix.

boolean startsWith(String prefix, int toffset)


Tests if this string starts with the specified prefix beginning a specified index.

i
15

490
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

CharSequence subSequence(int beginIndex, int endIndex)


Returns a new character sequence that is a subsequence of this sequence.

String substring(int beginIndex)


Returns a new string that is a substring of this string.

String substring(int beginIndex, int endIndex)


Returns a new string that is a substring of this string.

char[] toCharArray()
Converts this string to a new character array.

String toLowerCase()
Converts all of the characters in this String to lower case using the rules of the default locale.

String toLowerCase(Locale locale)


Converts all of the characters in this String to lower case using the rules of the given Locale.

String ToString()
This object (which is already a string!) is itself returned.

String toUpperCase()
Converts all of the characters in this String to upper case using the rules of the default locale.

String toUpperCase(Locale locale)


Converts all of the characters in this String to upper case using the rules of the given Locale.

String trim()
Returns a copy of the string, with leading and trailing whitespace omitted.

i
16

491
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

static String valueOf(boolean b)


Returns the string representation of the boolean argument.

static String valueOf(char c)


Returns the string representation of the char argument.

static String valueOf(char[] data)


Returns the string representation of the char array argument.

static String valueOf(char[] data, int offset, int count)


Returns the string representation of a specific subarray of the char array argument.

static String valueOf(double d)


Returns the string representation of the double argument.

static String valueOf(float f)


Returns the string representation of the float argument.

static String valueOf(int i)


Returns the string representation of the int argument.

static String valueOf(long l)


Returns the string representation of the long argument.

static String valueOf(Object obj)


Returns the string representation of the Object argument.

i
17

492
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

Clase Math:

Métodos

static double abs(double a)


Returns the absolute value of a double value.

static float abs(float a)


Returns the absolute value of a float value.

static int abs(int a)


Returns the absolute value of an int value.

static long abs(long a)


Returns the absolute value of a long value.

static double acos(double a)


Returns the arc cosine of an angle, in the range of 0.0 through pi.

static double asin(double a)


Returns the arc sine of an angle, in the range of -pi/2 through pi/2.

static double atan(double a)


Returns the arc tangent of an angle, in the range of -pi/2 through pi/2.

static double atan2(double y, double x)


Converts rectangular coordinates (x, y) to polar (r, theta).

i
18

493
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

static double cbrt(double a)


Returns the cube root of a double value.

static double ceil(double a)


Returns the smallest (closest to negative infinity) double value that is greater than or equal to the
argument and is equal to a mathematical integer.

static double cos(double a)


Returns the trigonometric cosine of an angle.

static double cosh(double x)


Returns the hyperbolic cosine of a double value.

static double exp(double a)


Returns Euler’s number e raised to the power of a double value.

static double expm1(double x)


Returns ex -1.

static double floor(double a)


Returns the largest (closest to positive infinity) double value that is less than or equal to the argument
and is equal to a mathematical integer.

static double hypot(double x, double y)


Returns sqrt(x2 +y2) without intermediate overflow or underflow.

static double IEEEremainder(double f1, double f2)


Computes the remainder operation on two arguments as prescribed by the IEEE 754 standard.

i
19

494
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

static double log(double a)


Returns the natural logarithm (base e) of a double value.

static double log10(double a)


Returns the base 10 logarithm of a double value.

static double log1p(double x)


Returns the natural logarithm of the sum of the argument and 1.

static double max(double a, double b)


Returns the greater of two double values.

static float max(float a, float b)


Returns the greater of two float values.

static int max(int a, int b)


Returns the greater of two int values.

static long max(long a, long b)


Returns the greater of two long values.

static double min(double a, double b)


Returns the smaller of two double values.

static float min(float a, float b)


Returns the smaller of two float values.

static int min(int a, int b)


Returns the smaller of two int values.

i
20

495
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

static long min(long a, long b)


Returns the smaller of two long values.

static double pow(double a, double b)


Returns the value of the first argument raised to the power of the second argument.

static double random()


Returns a double value with a positive sign, greater than or equal to 0.0 and less than 1.0.

static double rint(double a)


Returns the double value that is closest in value to the argument and is equal to a mathematical
integer.

static long round(double a)


Returns the closest long to the argument.

static int round(float a)


Returns the closest int to the argument.

static double signum(double d)


Returns the signum function of the argument; zero if the argument is zero, 1.0 if the argument is
greater than zero, -1.0 if the argument is less than zero.

static float signum(float f)


Returns the signum function of the argument; zero if the argument is zero, 1.0f if the argument is
greater than zero, -1.0f if the argument is less than zero.

static double sin(double a)


Returns the trigonometric sine of an angle.

i
21

496
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

static double sinh(double x)


Returns the hyperbolic sine of a double value.

static double sqrt(double a)


Returns the correctly rounded positive square root of a double value.

static double tan(double a)


Returns the trigonometric tangent of an angle.

static double tanh(double x)


Returns the hyperbolic tangent of a double value.

static double toDegrees(double angrad)


Converts an angle measured in radians to an approximately equivalent angle measured in degrees.

static double toRadians(double angdeg)


Converts an angle measured in degrees to an approximately equivalent angle measured in radians.

static double ulp(double d)


Returns the size of an ulp of the argument.

static float ulp(float f)


Returns the size of an ulp of the argument.

i
22

497
MANIPULACIÓN Y
FORMATO DE
FECHAS

498
ÍNDICE
MANIPULACIÓN Y FORMATO DE FECHAS

1. La clase Calendar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3
2. La clase DateFormat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9
3. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12

499
Manipulación y formato de fechas

1. La clase Calendar

La clase Calendar es una clase abstracta que se utiliza para conversiones


entre un objeto de tipo Date y un conjunto de campos enteros del tipo YEAR
(año), MONTH (mes), DAY (día), HOUR (hora), etc.

Un objeto de Calendar representa una fecha de acuerdo a las reglas de un


calendario determinado. El API de java proporciona una subclase específica
de Calendar: GregorianCalendar. Cualquier subclase de Calendar podrían
representar varios tipos de calendarios lunares utilizados en cualquier lugar
del mundo.

Cuando obtenemos un objeto de la clase Calendar obtenemos un instante de tiempo específico con gran
precisión muy parecido a lo que obtenemos con la clase Date. Si bien es cierto, podemos decir que aquí los
milisegundos desempeñan un papel primordial, la importancia de la clase Calendar radica, no en obtener un
instante de tiempo, sino en extraerle los datos

Utilización de la clase Calendar

La clase java.util.Date tiene métodos que permiten obtener el año, mes y día, sin embargo, estos métodos
están obsoletos precisamente porque para eso existe Calendar y de hecho cuando usamos el método getYear()
de la clase java.util.Date, ésta recurre a las funcionalidades que posee la clase Calendar.

i
3

500
Manipulación y formato de fechas

Obtener un espacio de tiempo específico y diferente del actual es bastante sencillo con esta clase, indicando
simplemente el día, mes y año con que deseamos trabajar o se puede acotar aún más dando hora, minuto y
segundo que queremos.

El método getInstance() de la clase nos devuelve una subclase de Calendar con el tiempo ajustado a la hora
actual, y utilizaremos el método set (argumentos) para ajustar la fecha deseada.

Calendar cal = Calendar.getInstance(); // Devuelve una instancia de GregorianCalendar con //la fecha
y hora actual
System.out.println(cal.getClass());
cal.set(2008,9,10); // el método set ajusta la fecha al "10 de Octubre de 2008“
System.out.println(cal.getTime()); // el método getTime() retorna un objeto de tipo
//java.util.Date que se muestra en consola
cal.set(2008,1,5,5,0,0);// ajustamos la misma fecha pero esta vez ajustando también la hora,
//minutos y seg qundos, comoueda: "5 de la madrugada del 5 de Febrero de 2008".
System.out.println(call.getTime());

Salida:
class java.util.GregorianCalendar
Fri Oct 10 13:05:52 CEST 2008
Tue Feb 05 05:00:00 CET 2008

i
4

501
Manipulación y formato de fechas

Método get

La clase Calendar tiene solamente un método get para obtener todos sus datos, pero se apoya en una serie
de constantes que permiten obtener o ajustar una propiedad determinada de la fecha.

La clase Calendar tiene solamente un método get para obtener todos sus datos, pero se apoya en una serie
de constantes que permiten obtener o ajustar una propiedad determinada de la fecha.

Las principales son:

- YEAR: año.
- MONTH: mes.
- DATE, DAY_OF_MONTH: día del mes.
- DAY_OF_WEEK: día de la semana entre 1 (MONDAY) y 7 (SATURDAY).
- HOUR: hora antes o después del medio día (en intervalos de 12 horas).
- HOUR_OF_DAY: la hora absoluta del día (en intervalos de 24 horas).
- MINUTE: el minuto dentro de la hora.
- SECOND: el segundo dentro del minuto.

Existen también las propiedades que representan los meses, como: JANUARY, MARCH, JUNE, DECEMBER, etc.
que van desde 0 (JANUARY) hasta 11 (DECEMBER), y las propiedades que representan los días: SUNDAY,
TUESDAY, SATURDAY, etc. Estos empiezan con 1 (SUNDAY) y van hasta 7 (SATURDAY).

i
5

502
Manipulación y formato de fechas

Ejemplo de uso del método get

Para obtener el valor de alguna de las propiedades que acabamos de ver, se usa el método get. Para esto,
pasaríamos como parámetro alguna de las constantes anteriores y el método devuelve un dato de tipo int.

Ejemplo

Para obtener el año, mes, día y hora, usaríamos el siguiente código:

System.out.println(cal.getTime());
System.out.println("AÑO: "+cal.get(Calendar.YEAR));
System.out.println("MES: "+cal.get(Calendar.MONTH));
System.out.println("DIA: "+cal.get(Calendar.DATE));
System.out.println("HORA:"+cal.get(Calendar.HOUR));
If(cal.get(Calendar.MONTH)==Calendar.OCTOBER){ System.out.println("ES OCTUBRE");
}else{
System.out.println("NO ES OCTUBRE");
}

AÑO: 2008
MES: 10
DIA: 1
HORA: 3
NO ES OCTUBRE

i
6

503
Manipulación y formato de fechas

Método set

Modificar una propiedad de Calendar no es complicado, sólo es necesario usar el método set (int atributo,
int valor). Siendo atributo una de las constante vistas anteriormente y valor la cantidad que se le quiere
asignar.

Ejemplo

cal.set(Calendar.MONTH,Calendar.JUNE)
cal.set(Calendar.YEAR, 1999)

Pondría la fecha almacenada en el objeto “cal” a junio o al año 1999 sin modificar ninguna de las otras
propiedades.

Clase GregorianCalendar

Las operaciones como sumar o restar días no se hacen directamente con la clase Calendar sino con alguna
clase que herede de ella y que represente algún calendario concreto, ya que no todos los calendarios tienen
12 meses ni años de 365 días como en occidente.

GregorianCalendar es una clase que deriva de Calendar y es la definición del


calendario gregoriano, ésta es la única implementación de un calendario en
jdk1.4.

A través de esta clase podemos sumar 2 ó 3 días a una fecha sin preocuparnos
por pasarnos de rango tanto en días, meses o años ya que lo hace
automáticamente.

Del mismo modo podemos obtener información como el día de la semana o


la semana del año que fue una fecha determinada.

i
7

504
Manipulación y formato de fechas

Este calendario usado en occidente, llamado gregoriano fue adoptado por primera vez en 1582 para sustituir
al calendario juliano utilizado desde que Julio César lo instaurase en el año 46 a.c.

El calendario gregoriano consta de años que son definidos por cada vuelta de la tierra alrededor del sol.
Cada año tiene doce meses de los cuales 7 tienen 31 días, 4 tienen 30 días y 1 tiene 28 días excepto en años
bisiestos que tiene 29.

Estos años bisiestos se implantaron para corregir el desfase que existe cada cuatro años (un año real dura
365 días y 6 horas aproximadamente). La regla completa para los años bisiestos según en calendario
gregoriano es:

"Un año es bisiesto si es divisible por 4, excluyendo los que son divisibles por 100 pero no los que son divisibles
por 400 que sí son bisiestos".

El método add()

El método add (CONSTATE, valor) suma algebraicamente valor a una fecha.

El valor a sumar toma el valor dado por CONSTANTE, que es una de las definidas para la clase y que vimos
anteriormente (MONTH, YEAR, SECOND, etc).

Por ejemplo para sumar 3 días y 2 meses a la fecha actual.

Calendar hoy =
Calendar.getInstance();hoy.add(Calendar.DATE,
3);hoy.add(Calendar.MONTH,
2);System.out.println(hoy.getTime());

Para el mismo ejemplo de fecha anterior (15:30 p.m. del 1 de noviembre de 2008 tendríamos la siguiente
salida:

Sun Jan 04 15:37:34 CET 2009

i
8

505
Manipulación y formato de fechas

2. La clase DateFormat

Dateformat se define como una clase abstracta (no se puede instanciar) para trabajar con el formato
fecha/hora en alguna de las subclases suya. Proporciona los formatos y las fechas o el tiempo en un idioma
de manera independiente.

El formato fecha/hora en alguna subclase, como por ejemplo SimpleDateFormat, permite dar formato (es
decir, la fecha -> texto), análisis sintáctico ( texto -> fecha), y la normalización. La fecha se representa
como un objeto Date o como el número de milisegundos desde el 1 de enero de 1970, 00:00:00 GMT (como
en javascript).

Importar la clase DateFormat

Dateformat ofrece algunos métodos para obtener la fecha y la hora formateada por defecto o formateada a
un determinado valor local y ofrece también un número de estilos de formato.

Para poder utilizar esta clase debemos de importarla de la siguiente manera:

import java.text.SimpleDateFormat;

i
9

506
Manipulación y formato de fechas

Ejemplo

Formatear la fecha actual:

SimpleDateFormat fecha = new SimpleDateFormat(“dd/MM/yyyy”);

Podemos también aplicar algunas máscaras según se define en el API de esta clase. Se puede especificar una
máscara de formato personalizado para fechas y horas con una lista de símbolos.

i
10

507
Manipulación y formato de fechas

DateFormat: Formato de estilos

Dateformat analiza el formato y fechas para cualquier localización. Su código es absolutamente


independiente de la localización de los convenios de meses, días de la semana, o incluso el formato de
calendario, solar o lunar.

El formato de los estilos debe incluir todos los detalles, largo, mediano y corto.

Ejemplo

String hora = DateFormat.getDateInstance().format(miFecha);

Para uformatear na fecha con una localización diferente, hay que indicarlo con el método getDateInstance().

i
11

508
Manipulación y formato de fechas

3. Resumen

Has llegado al final de este recurso formativo que denominamos “Manipulación y formato de fechas”
En esta lección hemos estudiado los siguientes contenidos:

i
12

509
OPERACIONES DE
ENTRADA-SALIDA

510
ÍNDICE
OPERACIONES DE ENTRADA-SALIDA

1. La clase PrintStream para salida de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3


2. Lectura de caracteres con InputStream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5
3. Lectura de cadenas con BufferedReader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10
4. Lectura de datos con la clase Scanner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13
5. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15

511
Operaciones de entrada-salida

1. La clase PrintStream para salida de datos


Clase PrintStream

La clase PrintStream tiene métodos para la representación textual de todos


los datos primitivos de Java: write y println().

Ejemplo:

System.out.println (“Hola desde Java”);

int x=3;
System.out.println (x);

Debido a que básicamente esta clase solamente contiene 2 métodos sobrecargados (redefinidos) para poder
imprimir cualquier tipo primitivo de dato, te mostraremos un extracto de resumen de dichos métodos sacado
de la página oficial de SUN Microsystems.

i
3

512
Operaciones de entrada-salida

513
Operaciones de entrada-salida

2. Lectura de caracteres con InputStream


Streams

Un "Stream" es un nombre genérico otorgado a un flujo de caracteres. Puede estar compuesto por los valores
residentes en un archivo de texto, datos introducidos interactivamente por un usuario o datos que deseen
ser colocados en un determinado archivo.

Stream es una secuencia de bytes que viajan desde un origen (source) hasta un destino (target). El concepto
de Stream se aplica a multitud de dispositivos de entrada/salida.

Para encapsular los Streams de Java se tienen dos clases:

1. InputStream (entran en la memoria).

2. OutputStream (salen de memoria a otro dispositivo).

Por convenio para las operaciones de entrada/salida se toma como punto inicial la memoria RAM del sistema,
todo lo que llega a la RAM es in.

InputStream

Las clases InputStream y OutputStream, tienen lo común de toda la jerarquía existente para Streams.
InputStream es una clase abstracta (no se instancia).

i
5

514
Operaciones de entrada-salida

Sus métodos son los siguientes. Pulsa sobre cada uno de ellos:

abstract int <InputStream>.read() throws IOException:


Lee un solo byte del Stream, retorna un entero con valor comprendido entre 0…255 ó –1 para el final del
Stream. El método es abstracto ya que no se sabe a priori cual es la entrada. Las derivadas de InputStream
redefinirán el método para utilizarlo.
Es un método síncrono o bloqueante, es decir, es un método que cuando el hilo lo ejecuta se queda ahí hasta
que vuelve con el dato.

int <InputStream>.read(byte[]b)
int <InputStream>.read(byte []b, int offset, int length):
Ambos métodos realizan la lectura de una serie de bytes. En el primer prototipo se realiza la lectura del array
de bytes y en el segundo se realiza la lectura de un array desde la posición indicada en offset y el número
de bytes indicado en length.
Ambos métodos no son abstractos ya que llaman al primer prototipo tantas veces como sea necesario. Las
clases derivadas podrán redefinir el método para optimizar los rendimientos.

int <InputStream>.available
Devuelve el número de bytes que se puede leer del Stream sin quedar bloqueado. Dependiendo del Stream
de donde se esté leyendo, en el caso de ficheros representa el número de bytes que queda por leer.

void <InputStream>.close()
Cierra el Stream. Dicho método está vacío para que cada clase derivada lo pueda redefinir ya que no todos
los dispositivos deben cerrarse.

boolean <InputStream>.markSupported()
Devuelve true si el Stream soporta marcas. Por defecto, devuelve false. La derivada que utiliza el método
lo redefine para que de valor true.

i
6

515
Operaciones de entrada-salida

void <InputStream>.mark (int readlimit)


Pone una marca en el Stream para poder situarse en este punto tras haberse movido hacia adelante. El
parámetro readlimit indica el número máximo de bytes que la marca es válida, esto se debe al consumo de
memoria que hay que reservar.

void <InputStream>.reset()
Vuelve a la marca.

long <InputStream>.skip (long n) throws IOException


Avanza hacia delante el número de bytes que se le indique en n. Como retorno devuelve el número de bytes
que se ha avanzado.

OutputStream

OutputStream es una clase también abstracta que representa los Streams de salida.

Sus métodos son los siguientes. Pulsa sobre cada uno de ellos:

abstract void <OutputStream> write (int b):


Escribe un solo byte representado por b. Es abstracta para que las redefina las derivadas, también es
bloqueante.

void <OutputStream> write (byte []b)


void <OutputStream> write (byte []b, int offset, int length):
Reciben un array para escribir varios bytes y no sólo uno.

void <OutputStream>.flush()
Se utilizan en los Streams con buffer (trozo de memoria de la RAM) para sacar lo almacenado en el buffer.

i
7

516
Operaciones de entrada-salida

void <OutputStream>.close()
Se cierra el Stream.

FileInputStream

La clase FileInputStream sirve para acceder al contenido de los ficheros. Se crea a partir del nombre del
fichero que se va a tratar. Realiza la lectura del fichero.

Los constructores son los siguientes:

FileInputStream (String Filename)


FileInputStream (File Filename)

int <InputStream>.read()
Realiza la lectura del fichero.

Protected <FileInputStream>.finalize()
Redefine este método que procede la clase Object. Este método realiza una llamada a close() antes de hacer
la recogida de basura. De todas formas es mejor utilizar close() cuando se ha terminando de trabajar con el
fichero.

FileOutputStream

La clase FileOutputStream también sirve para acceder al contenido de los ficheros. Realiza la escritura de
los datos del fichero.

i
8

517
Operaciones de entrada-salida

Los constructores son los siguientes:

FileOutputStream (String Filename) throws IOException


Con este constructor se empieza desde el principio en el fichero, aunque el fichero tenga datos.

FileOutputStream(String Filename, boolean append)


Con este constructor se añadirá información en el fichero. Para ello se pondrá a true la variable append. Si
se pone false funcionará como el anterior constructor.

import java.io.*;
public class AccesoFichero {
public static void main (String [] args) throws IOException {
// se crea el fichero de salida.
FileOutputStream fos = new FileOutputStream("c:\\vem\\text.txt");
// Cadena a escribir en el fichero.
String str = "Texto de prueba";
//Proceso de escritura.
for (int i = 0; i < str.length(); i ++)
fos.write(str.charAt((i)));
fos.close(); // Se cierra el fichero de salida.
// se crea el fichero de entrada.
FileInputStream fis = new FileInputStream("c:\\vem\\text.txt");
int tamano = fis.available();/Longitud del fichero.
System.out.println("Hay un tamaño de "+tamano+"bytes disponibles");
byte [] B = new byte [tamano];
fis.read(B); // Lectura del fichero.
System.out.println ("Se leyó el texto: "+new String(B));
fis.close(); // Se cierra el fichero de entrada.
} // fin de main.
} // fin de clase.

i
9

518
Operaciones de entrada-salida

3. Lectura de cadenas con BufferedReader


InputStreamReader

La clase InputStreamReader permite la conversión de código ASCII a UNICODE, actuando como filtro para la
traducción.

El problema surge en cómo traducir de ASCII a UNICODE, los caracteres nacionales (0..127 Mundiales /
128..255 Nacionales). Este problema se resuelve con el siguiente constructor:

InputStreamReader (InputStream is, String encode)

El segundo parámetro representa el código ISO que se quiere utilizar. En el caso de España es “8859-1”.

La InputStreamReader lee caracteres desde teclado, pero procesa carácter a carácter, no sirve para leer de
golpe una línea.

Esto es poco óptimo y si sólo tuviésemos la clase ImputStreamReader sería un trozo de código que tendríamos
que repetir por muchos sitios. Para el caso concreto de leer de teclado, sería ideal si hubiese una clase en
Java que nos lea de una vez todo lo que ha escrito el usuario de nuestro programa y nos lo diera de esta
forma.

i
10

519
Operaciones de entrada-salida

System.in.read

Para leer caracteres desde teclado, también usamos la clase System.in.read(); Esta función nos devuelve el
ASCII del carácter pulsado desde el teclado, y lo hace como tipo int.

Esta instrucción al igual que otras en Java, el propio compilador obliga a capturar un posible error en tiempo
de ejecución de E/S, con lo que aunque no hayamos visto aún ese capítulo, lo encerraremos en un bloque
try {} que es lo que nos sirve para prever errores.

Si además lo que queremos es asignar la lectura a un tipo char, haremos un casting a este tipo. Todo quedaría
de la siguiente forma:

char letra=’a’;
System.out.println (“ Introduce una letra “);
try{
letra=(char) System.in.read();
}catch (Exception ex){ } // Tratamiento del posible error, de momento lo dejamos en //blanco
System.out.println (“ La letra pulsada es : “ + letra) ;

BufferedReader

La clases BufferedReader nos sirven para leer por teclado, sin procesar carácter a carácter.

La manera de crear un objeto de BufferedReader a partir de otro Reader cualquiera, como por ejemplo,
InputStreamReader, es el siguiente:

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

i
11

520
Operaciones de entrada-salida

El funcionamiento de esta clase es igual que el InputStreamReader, solamente que nos va a devolver la
cadena leída completa hasta que pulsamos > ( intro)

Para obtener el String leido 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 <INTRO> >

String cadena = br.readLine();

Lee desde el teclado un String completo y lo guarda en la variable "cadena".

i
12

521
Operaciones de entrada-salida

4. Lectura de datos con la clase Scanner


Clase Scanner

La lectura de datos con la clase Scanner, es la nueva forma que nos proporciona Java para poder leer desde
el teclado, ahorrándonos un poco de código.

Ejemplo

import java.io.*;
import java.util.Scanner;
public class Leer{
public static void main ( String args[ ]) throws IOException
{
Scanner leer=new Scanner(System.in); //Creamos el objeto de Scanner
String cadena=leer.next(); // Leemos el texto con su método next()
System.out.println (“Texto leido :” + cadena ); //Lo imprimimos
}
}

Configurar clase Scanner

Se puede configurar la clase Scanner para que utilice cualquier otro tipo de separador de tokens.

i
13

522
Operaciones de entrada-salida

Además tiene una serie de métodos que tras leer un token lo intentan interpretar como algún tipo primitivo
de Java:

Cuando analizamos valores numéricos se emplean los convenios locales de puntuación. Scanner se usa a
menudo para la entrada de datos por consola:

Scanner scanner = new Scanner(System.in);


System.out.print("Escribe dos números: ");
double x = scanner.nextDouble();
double y = scanner.nextDouble();
System.out.println("producto: " + (x * y));

i
14

523
Operaciones de entrada-salida

5. Resumen

Has llegado al final de este recurso formativo que denominamos “Operaciones de entrada-salida”
En esta lección hemos estudiado los siguientes contenidos:

i
15

524
UTILIZACIÓN DE
LAS LIBRERÍAS
BÁSICAS DE JAVA

525
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

Trabajando con streams Java. Flujos y Ficheros

Flujos de memoria

Está representado por dos clases:

- ByteArrayInputStream, sirve para trabajar con array de bytes de forma interna. Permite leer los datos de
un array como si fuera un Stream.

Tiene el siguiente constructor:

ByteArrayInputStream (byte [] b)

String str = “Mensaje a impresora.”


ByteArrayInputStream in = new ByteArrayInputStream(str.getBytes());
imprime (in);

void imprime (InputStream in) { . . . }

- ByteArrayOutputStream, permite actuar como un buffer en memoria que se usa antes de enviarlo al
dispositivo.

El constructor es el siguiente:

ByteArrayOutputStream()

byte [] <ByteArrayOutputStream>.toByteArray()

Devuelve los datos introducidos en la estructura de memoria generada.

i
2

526
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

String <ByteArrayOutputStream>.toString()

Devuelve los datos de dentro de la estructura y los introduce dentro de un String.

Void <ByteArrayOutputStream>.writeTo(OutputStream os)

Envía los datos del buffer al dispositivo que se le indique. Al ser parámetro clase base se le puede enviar a
cualquier derivada.

Manejo de Ficheros

- File

La clase que define los ficheros es File. File representa un fichero o directorio dentro del sistema de ficheros.
Los constructores de File son los siguientes:

File (String filename)


File (String dir, String filename)
File (File dir, String filename)

File f1 = new File (“c:\\windows\\win.exe”);


File dir = new File (“c:\\windows”);
File f2 = new File (dir,”win.exe”);

Tiene las siguientes constantes a nivel de clase y contiene respectivamente los símbolos que se utilizan para
separar los paths dependiendo de la plataforma que se utilice.

i
3

527
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

static final String <File>.pathSeparator > (;)


static final String <File>.separator > (\)
File f2 = new File (“c:\\windows\\win.exe”); // path absoluto
File f3 = new File (“.\\datos\\bd.dat”); // path relativo

String <File>.getPath()

Devuelve el texto del path que anteriormente se le ha pasado al constructor de File.

String <File>.getAbsolutePath()

Devuelve el path completo

File f1 = new File (“.\\windows\\win.exe”);


System.out.println(f1.getAbsolutePath());
// c:\java\..\windows\win.exe

String <File>.GetCanonicalPath() throws IOException

Devuelve el path normalizado. Lanza excepciones ya que comprueba la existencia del fichero o directorio
dentro de los sistemas de ficheros.

boolean <File>.isFile() Devuelve true si es fichero.

boolean <File>.isDirectory() Devuelve true si es directorio.

boolean <File>.exists() Devuelve true si existe el fichero o directorio.

boolean <File>.canRead() Si permite la lectura del fichero.

i
4

528
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

boolean <File>.canWrite() Si permite la escritura del fichero.

long <File>.length() Tamaño del fichero en bytes.

boolean <File>.mkDir()

Intenta crear un directorio con el nombre que se le pasa en el constructor. Si lo crea correctamente devuelve
true.

boolean <File>.renameTo (String name) Renombra el fichero o directorio.

boolean <File>.delete() Elimina el fichero o directorio.

- FileInputStream y FileOutputStream

Ambas clases sirven para acceder al contenido de los ficheros.

FileInputStream, se crea a partir del nombre del fichero que se va a tratar. Realiza la lectura del fichero.
Los constructores son los siguientes:

FileInputStream (String Filename) throws FileNotFoundException


FileInputStream (File Filename) throws FileNotFoundException

int <InputStream>.read() throws IOException

Realiza la lectura del fichero.

Protected <FileInputStream>.finalize() throws IOException

i
5

529
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

Redefine este método que procede de la clase Object. Este método realiza una llamada a close() antes de
hacer la recogida de basura. De todas formas es mejor utilizar close() cuando se ha terminando de trabajar
con el fichero.

FileOutputStream, realiza la escritura de los datos del fichero. Tiene el siguiente constructor:

FileOutputStream (String Filename) throws IOException

Con este constructor se empieza desde el principio en el fichero, aunque el fichero tenga datos.

FileOutputStream(String Filename, boolean append)


throws IOException

Con este constructor se añadirá información en el fichero. Para ello se pondrá a true la variable append. Si
se pone false funcionará como el anterior constructor.

import java.io.*;

public class AccesoFichero {


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

// se crea el fichero de salida.


FileOutputStream fos = new FileOutputStream(“c:\\vem\\text.txt”);

// Cadena a escribir en el fichero.


String str = “Texto de prueba”;

//Proceso de escritura.
for (int i = 0; i < str.length(); i ++)
fos.write(str.charAt((i)));
fos.close(); // Se cierra el fichero de salida.

i
6

530
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

// se crea el fichero de entrada.


FileInputStream fis = new FileInputStream(“c:\\vem\\text.txt”);
int tamano = fis.available();/Longitud del fichero.
System.out.println(“Hay un tamaño de “+tamano+”bytes disponibles”);
byte [] B = new byte [tamano];
fis.read(B); // Lectura del fichero.
System.out.println (“Se leyó el texto: “+new String(B));
fis.close(); // Se cierra el fichero de entrada.
} // fin de main.
} // fin de clase.

- SequenceInputStream

Esta clase permite concatenar varios Streams en uno solo, de forma que cuando recorremos el Stream
resultante se leerá consecutivamente uno detrás de otro. Para concatenar tienen dos constructores:

SequenceInputStream (InputStream s1, InputStream s2)

Concatena dos cadenas.

SequenceInputStream (Enumeration)

Concatena a partir de una lista de objetos InputStream.

Interface Enumeration {
public boolean hasMoreElements(); //Controla si hay mas elementos

public Object nextElement();


}

i
7

531
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

Filtro de Streams

Los filtros van a permitir modificar los datos que están dentro del Stream. Para construir filtros se tienen las
siguientes clases:

Estas clases no trabajan con dispositivos finales sino que trabajan sobre Streams ya creados. En el constructor
de cada una de las clases se recibe un Stream de la clase base (InputStream / OutputStream).

i
8

532
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

Para realizar el acceso de estas clases se utilizan los siguientes atributos que apuntan al Stream ya creado:

protected InputStream <FileInputStream> in;

protected OutputStream <FileOutputStream> out;

Los atributos son protected para que sólo puedan acceder las clases FilterOutputStream y FilterInputStream
y sus derivadas.

- BufferedInputStream y BufferedOutputStream

Estas clases sirven para poner un buffer (memoria RAM) tanto para los Streams de entrada como para los de
salida antes de pasarlo al dispositivo final.

En el constructor de estas clases se le pasa el Stream y al Stream se le añade un buffer:

protected byte [] <BufferedOutputStream> buf;

Array de datos a cargar en el buffer.

protected int <BufferedOutputStream> count;

Indica hasta dónde está cargado el buffer.

i
9

533
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

Cuando el buffer está lleno se envían automáticamente los datos cargados al fichero.

Para forzar que se vacíe de información el buffer se tiene el método flush() de la clase base.

protected [] byte <BufferedInputStream> buf;

Array de datos del buffer.

protected int <BufferedInputStream> count;

Indica hasta dónde está cargado el buffer.

protected int <BufferedInputStream> pos;

Indica la siguiente posición a liberar del buffer.

i
10

534
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

Utilizar un buffer implica una optimización en el tiempo de acceso al fichero.

FileInputStream f1 = new FileInputStream (“datos.txt”);


BufferedInputStream bf1 = new BufferedInputStream (f1);

// Primeramente se crea el Stream y luego el buffer asociado.

En teoría está bien aplicarlo, pero en la práctica los Sistema Operativos ya tienen buffers implementados,
entonces el rendimiento casi es el mismo.

De todas formas habrá casos en que utilizar buffers sea interesante.

- DataInputStream y DataOutputStream

Son filtros que permiten solucionar el problema de escribir y leer datos que no sean del tipo fundamental
byte.

i
11

535
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

Interface DataInput {
boolean readBoolean() throws IOException;
int readInt() throws IOException;
...
}
Interface DataOutput {
boolean writeBoolean() throws IOException;
int writeInt() throws IOException;
...
}

Ambas clases implementan los interfaces DataInput y DataOutput respectivamente.

Ambos interfaces tienen implementados todos los métodos para los tipos de datos fundamentales.

Pipes de Streams

Son una forma de comunicar hilos. Para la comunicación con pipes existen 2 tipos de hilos:

- Hilo productor, que envía datos al pipe.


- Hilo consumidor recibe datos del pipe.

i
12

536
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

Constructores:

PipedOutputStream (PipedInputStream sink)


PipedOutputStream ()
PipedInputStream (PipedOutputStream src)
PipedInputStream ()

Con estos constructores se puede enlazar de la siguiente forma:

PipedInputStream pis = new PipedInputStream();


PipedOutputStream pos = new PipedOutputStream(pis);
// Quedan enlazados y se puede enviar y recibir datos.

Existe otra forma de realizar el enlace de dos Stream. Primeramente se crearán con el constructor por
defecto para posteriormente conectarlos con los siguientes métodos:

void <PipedOutputStream> connect (PipedInputStream sink)


void <PipedInputStream> connect (PipedOutputStream src)

public class Conexion {


static PipedOutputStream sumidero = new PipedOutputStream();
static PipedInputStream fuente = new PipedInputStream();
static { // Inicio de Bloque Estático.
try {
fuente.connect(sumidero);
}
catch (IOException ex) {
System.out.println (“No se pueden conectar los pipes”);
}
} // fin de Bloque Estático.
} // fin de clase.

i
13

537
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

Esta clase conecta dos pipes con el segundo método explicado.

Bloque estático: conjunto de instrucciones que queremos que la máquina virtual ejecute en el
momento que se carga la clase, es decir la primera vez que se referencia o se nombra la clase en el
programa.

La clase Conexion no se instanciará pero en el momento que aparezca en el programa


Conexion.sumidero o Conexion.fuente se ejecutará el bloque estático.

Serialización de Objetos

En un flujo se pueden escribir datos fundamentales como se ha visto anteriormente, a partir de ahora también
se van a poder enviar y recoger objetos de un Stream. Para hacer esto, habrá que serializar el objeto, es decir,
convertir el objeto en una serie de bytes. Posteriormente se podrá introducir en el Stream. Se tienen dos
clases de persistencias:

- Persistencia temporal, consiste en hacer que la vida de un objeto supere el tiempo de ejecución de
un programa. Para realizarlo antes de cerrar el programa se guardará el objeto en un fichero y la
próxima vez que se ejecute el programa se podrá recuperar el objeto guardado.

- Persistencia espacial, consiste en que un objeto pase a vivir a una zona de memoria distinta a la zona
de memoria donde fue creado. Un objeto que se crea en una máquina se irá a otra máquina (Sistemas
Distribuidos).

En ambos casos se necesita serializar el objeto.

i
14

538
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

interface ObjectInput extends DataInput {


Object ReadObject();
}

interface ObjectOutput extends DataOutput {


void writeObject(Object ob);
}

No se permite por defecto serializar los objetos ya que cualquiera puede hacerlo. Para que un objeto se
pueda serializar tiene que implementar el interface Serializable. Si el objeto no es serializable y se intenta
serializar en ejecución, se lanza la siguiente excepción:

NotSerializableException.

Interface Serializable {}

Actúa únicamente como un flag para comprobar si un objeto se quiere o no serializar.

Class Punto implements Serializable { // Objeto Serializable.


...
}

En este momento ya se pueden crear objetos Punto y serializarlos, la forma de hacerlo sería la siguiente:

ObjectOutputStream oos = new ObjectOutputStream


(new FileOutputStream (“datos.dat”));
Punto p = new Punto (2,3);
oos.writeObject(p);
// El objeto Punto se serializa dentro del fichero datos.dat.

i
15

539
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

ObjectInputStream ois = new ObjectInputStream


(new FileInputStream (“datos.dat”));
Punto p = (Punto) in.readObject();
// El objeto Punto serializado se saca del fichero datos.dat.

Se puede comprobar que se utiliza el operador cast con el método readObject ya que este método devuelve
un objeto tipo Object.

Si una clase contenedora está Serializable y tiene objetos contenidos, los objetos contenidos deben
implementar también Serializable (Composición). Si no se hace así se lanza la excepción:

NotSerializableException

Cuando se serializa un objeto, sus atributos se serializan pero no sus métodos. Los atributos estáticos (static)
no se serializan ya que pertenecen a la clase y no al objeto. Los atributos con el modificador transient
tampoco se serializan.

Las razones para serializar un atributo son dos básicamente:

- Por seguridad.

- Para mantener la consistencia. Por ejemplo, FileInputStream no es igual en dos máquinas ya que
el sistema de ficheros en cada una de ellas es diferente).

También con los siguientes métodos se pueden serializar los objetos con encriptación:

private void writeObject(ObjectOutputStream oos)throws IOException

private void readObject(ObjectInputStream ois) throws IOException

i
16

540
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

class numero implements Serializable {


int numero;

private void writeObject (ObjectOutputStream oos)


throws IOException {
oos.writeInt(numero);
}

private void readObject(ObjectInputStream ois)


throws IOException {
numero = ois.readInt();
}
}

Existen también dos métodos para serializar y deserializar de forma estándar, recogen los atributos de la clase
y operan con ellas.

void <ObjectOutputStream>.defaultWriteObject() throws IOException

void <ObjectInputStream>.defaultReadObject() throws IOException

class Cuenta implements Serializable {


String nombre, direccion, telefono;
int codpostal;
transient int pin;

i
17

541
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

private void writeObject(ObjectOutputStream oos)


throws IOException {
oos.defaultWriteObject();
int numero = pin ^ pin; //Operación XOR.
oos.writeInt(numero);
}

private void readObject(ObjectInputStream ois)


throws IOException {
ois.defaultReadObject();
pin ^= ois.readInt(pin);
}
} // fin de clase

Cuando hay una clase base que implementa Serializable todas las derivadas implementarán Serializable
(Agregación). Si la derivada implementa Serializable la base puede implementarla o no.

Cuando se serializa un objeto de clase derivada, primero se serializan los atributos de la base y
posteriormente los atributos de la derivada.

Cuando se deserializa un objeto de clase derivada, primero se hace con los atributos de la base y
seguidamente los atributos de la derivada.

- Gestión de versiones

En Java por defecto si la clase de serialización y la clase de deserialización no coinciden no se puede recoger
el objeto. La excepción que se lanza cuando se produce este error es la siguiente:

i
18

542
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

InvalidCastException

class Prueba implements Serializable {


int numero = 0;
...
}
. . . se modifica la clase . . .

class Prueba implements Serializable {


int numero = 0;
void NoHaceNada () {};
}

A pesar de que el número de atributos no ha cambiado las clases se consideran incompatibles.

Para comprobar las versiones de las clases en Java, Java dispone del número SUID (Serial Unique ID) que es
diferente para cada una de las clases que se crean.

Este número SUID lo genera a partir de los bytecode de la clase utilizando la función hash(). Si se modifica
algo en una clase ya generada la función hash() genera un nuevo número SUID para la clase modificada.

C:\> serialver <Clase> Devuelve el número SUID de una clase

Para mantener la compatibilidad entre las distintas versiones de una clase, habrá que declarar la siguiente
constante dentro de la clase:

static final long serialVersionUID = 6290341731103L; // serialver

El valor de serialVersionUID se corresponderá con la primera versión de la clase.

Normalmente el número SUID se pone desde la primera clase generada.

i
19

543
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

Las clases Reader y Writer

Estas clases sirven para trabajar con Streams de UNICODE. Normalmente se utilizan para Streams de texto.
Todos lo anteriores sirven para flujo binario.

Reader y Writer son clases abstractas.

Reader se corresponde con InputStream, tiene todos los métodos descritos anteriormente en InputStream.
Además tiene el siguiente método:

boolean <Reader>.ready()

Devuelve true en caso de que la próxima lectura de un solo byte se queda bloqueada.

Writer se corresponde a OutputStream.

Clases para trabajar con array de caracteres y objetos String

- CharArrayReader y CharArrayWriter

CharArrayReader equivale a ByteArrayInputStream.


CharArrayWriter equivale a ByteArrayOutputStream.

Sirven para trabajar con array de caracteres.

char[] letras = new char[10];


CharArrayReader ch = new CharArrayReader(letras);

// Busca el carácter ‘c’ en un array.


int c = ch.read();

while (c ¡= -1 && c ¡= ‘c’)


c=ch.read(); //Lee hasta al final del array o encuentre ‘c’.

i 20

544
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

- StringReader y StringWriter

Son igual que las anteriores sólo que trabajan con objetos String.

String letras = “Federico”;


StringReader sr = new StringReader (letras);

int pos = 0;
int c = sr.read();

while (c ¡= -1 && c ¡= ‘c’) {


pos++;
c = sr.read();
}

StringWriter introduce los datos en un objeto de tipo StringBuffer mediante las operaciones writer y no sobre
el objeto String que como se sabe es constante. StringWriter tiene dos constructores:

StringWriter()
El objeto StringBuffer se crea con un tamaño de 32 bytes y se redimensiona si se necesita más
espacio.

StringWriter(int size)
Se le indica el tamaño, con esto se hace que la operación sea más rápida.

StringBuffer <StringWriter>.getBuffer()
Se saca lo que se ha escrito.

String <StringWriter>.toString()
Lo que está contenido se guarda en un String.

i
21

545
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

InputStreamReader y OutputStreamReader

Conversión de código UNICODE a ASCII y viceversa. Actúan como filtro para la traducción.

InputStreamReader

InputStreamReader (InputStream is) De ASCII a UNICODE

El problema surge en cómo traducir de ASCII a UNICODE los caracteres nacionales (0..127 Mundiales / 128..255
Nacionales). Este problema se resuelve con el siguiente constructor.

InputStreamReader (InputStream is, String encode)

El segundo parámetro representa el código ISO que se quiere utilizar. En el caso de España es “8859-1”.

En el primer constructor como se recibe el encode se utiliza la propiedad fileencoding.

System.out.println (System.getProperty(“fileencoding”);

i
22

546
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

- OutputStreamReader

Realiza la conversión de UNICODE a ASCII.

OutputStreamWriter (OutputStream os)

OutputStreamWriter (OutputStream os, String encode)

Igual que lo definido en InputStreamReader.

FileInputStream f_binario = new FileInputStream (“prueba.dat”);

InputStreamReader f_tex = new InputStreamReader


(f_binario,”8859-1”);

Las clases FileReader y FileWriter

i
23

547
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

Como se puede comprobar son derivadas de las anteriores que sólo valen para ficheros.

FileReader (String filename)


FileReader (File f)

FileWriter (String filename)


FileWriter (File f)
FileWriter (String Filename, boolean append)

A continuación puedes ver un extracto del API oficial de la página de SUN Microsystems para que tengas a
mano un resumen con los métodos más usados en lo que se refiere a streams y ficheros java.

Empezaremos con la clase InputStream:

MÉTODOS

int available()
Returns the number of bytes that can be read (or skipped over) from this input stream without
blocking by the next caller of a method for this input stream.

void close()
Closes this input stream and releases any system resources associated with the stream.

void mark(int readlimit)


Marks the current position in this input stream.

boolean markSupported()
Tests if this input stream supports the mark and reset methods.

i
24

548
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

abstract int read()


Reads the next byte of data from the input stream.

int read(byte[] b)
Reads some number of bytes from the input stream and stores them into the buffer array b.

int read(byte[] b, int off, int len)


Reads up to len bytes of data from the input stream into an array of bytes.

void reset()
Repositions this stream to the position at the time the mark method was last called on this input
stream.

long skip(long n)
Skips over and discards n bytes of data from this input stream.

Clase OutputStream:

MÉTODOS

void close()
Closes this output stream and releases any system resources associated with this stream.

void flush()
Flushes this output stream and forces any buffered output bytes to be written out.

void write(byte[] b)
Writes b.length bytes from the specified byte array to this output stream.

i
25

549
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

void write(byte[] b, int off, int len)


Writes len bytes from the specified byte array starting at offset off to this output stream.

abstract void write(int b)


Writes the specified byte to this output stream.

La clase File:

MÉTODOS

boolean canRead()
Tests whether the application can read the file denoted by this abstract pathname.

boolean canWrite()
Tests whether the application can modify to the file denoted by this abstract pathname.

int compareTo(File pathname)


Compares two abstract pathnames lexicographically.

int compareTo(Object o)
Compares this abstract pathname to another object.

boolean createNewFile()
Atomically creates a new, empty file named by this abstract pathname if and only if a file with this
name does not yet exist.

static File createTempFile(String prefix, String suffix)


Creates an empty file in the default temporary-file directory, using the given prefix and suffix to
generate its name.

i
26

550
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

static File createTempFile (String prefix, String suffix, File directory)


Creates a new empty file in the specified directory, using the given prefix and suffix strings to
generate its name.

boolean delete()
Deletes the file or directory denoted by this abstract pathname.

void deleteOnExit()
Requests that the file or directory denoted by this abstract pathname be deleted when the virtual
machine terminates.

boolean equals(Object obj)


Tests this abstract pathname for equality with the given object.

boolean exists()
Tests whether the file denoted by this abstract pathname exists.

File getAbsoluteFile()
Returns the absolute form of this abstract pathname.

String getAbsolutePath()
Returns the absolute pathname string of this abstract pathname.

File getCanonicalFile()
Returns the canonical form of this abstract pathname.

String getCanonicalPath()
Returns the canonical pathname string of this abstract pathname.

i
27

551
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

String getName()
Returns the name of the file or directory denoted by this abstract pathname.

String getParent()
Returns the pathname string of this abstract pathname’s parent, or null if this pathname does not
name a parent directory.

File getParentFile()
Returns the abstract pathname of this abstract pathname’s parent, or null if this pathname does not
name a parent directory.

String getPath()
Converts this abstract pathname into a pathname string.

int hashCode()
Computes a hash code for this abstract pathname.

boolean isAbsolute()
Tests whether this abstract pathname is absolute.

boolean isDirectory()
Tests whether the file denoted by this abstract pathname is a directory.

boolean isFile()
Tests whether the file denoted by this abstract pathname is a normal file.

boolean isHidden()
Tests whether the file named by this abstract pathname is a hidden file.

i
28

552
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

long lastModified()
Returns the time that the file denoted by this abstract pathname was last modified.

long length()
Returns the length of the file denoted by this abstract pathname.

String[] list()
Returns an array of strings naming the files and directories in the directory denoted by this abstract
pathname.

String[] list(FilenameFilter filter)


Returns an array of strings naming the files and directories in the directory denoted by this abstract
pathname that satisfy the specified filter.

File [] listFiles()
Returns an array of abstract pathnames denoting the files in the directory denoted by this abstract
pathname.

File [] ListFiles (FileFilter filter)


Returns an array of abstract pathnames denoting the files and directories in the directory denoted
by this abstract pathname that satisfy the specified filter.

File[] ListFiles (FilenameFilter filter)


Returns an array of abstract pathnames denoting the files and directories in the directory denoted
by this abstract pathname that satisfy the specified filter.

static File[] listRoots()


List the available filesystem roots.

i
29

553
UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA

boolean mkdir()
Creates the directory named by this abstract pathname.

boolean mkdirs()
Creates the directory named by this abstract pathname, including any necessary but nonexistent
parent directories.

boolean renameTo(File dest)


Renames the file denoted by this abstract pathname.

boolean setLastModified(long time)


Sets the last-modified time of the file or directory named by this abstract pathname.

boolean setReadOnly()
Marks the file or directory named by this abstract pathname so that only read operations are allow

String toString()
Returns the pathname string of this abstract pathname.

URL toURL()
Converts this abstract pathname into a file: URL.

i
30

554
GESTIÓN DE
COLECCIONES

555
ÍNDICE
GESTIÓN DE COLECCIONES

1. Las clases de colección java.util.ArrayList y java.util.Hashtable . . . . . . . . . . . . . . . . . . . . . . .3


2. Enumeraciones e iteraciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8
3. Colecciones de tipos genéricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10
4. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13

556
Gestión de colecciones

1. Las clases de colección java.util.ArrayList y java.util.Hashtable


Interface List (Listas)

La Interface List añade nuevos métodos para trabajar con listas. Las listas
también tienen dos posibles implementaciones:

ArrayList, da un mayor tiempo de acceso a los elementos individuales.


LinkedList, permite añadir al final elementos

Métodos Interface List

Veamos a continuación los métodos que podemos utilizar. Pulsa sobre cada uno de ellos:

Object <List>.get (int index):


saca un elemento de la lista en la posición indicada por index.

Object <List>.set (int index, Object element):


inserta en la posición indicada por index sobreescribiendo el elemento que hubiese en dicha posición.
Devuelve el elemento que había antes en dicha posición.

i
3

557
Gestión de colecciones

void <List>.add (int index, Object element):


añade un elemento en la posición indicada por index desplazando hacia la derecha el resto de los elementos
existentes en el contenedor.

int <List>.indexOf (Object element) o en int <List>.lastIndexOf (Object element):


ambos métodos realizan la búsqueda de un elemento dentro de la lista devolviendo en qué posición se
encuentra.

Métodos Interface ListL istcIterator <List> listIterator()

Permite recorrer la lista utilizando un interface Iterator especial que permite el recorrido hacia adelante y
hacia atrás:

1. ListIterator
2. Iterator
3. public interface ListIterator extends Iterator {
boolean hasNext();
Object next();
Boolean hasPrevious();
Object previous();
}

Otros Métodos Interface List

Otros métodos de la Interface list serian los siguientes. Pulsa sobre cada uno de ellos:

boolean addAll( Collection ):


añade todos los elementos que se pasan en el argumento. Devuelve true si es capaz de añadir a la colección
cualquiera de los elementos del argumento.

i
4

558
Gestión de colecciones

void clear():
elimina todos los elementos que componen la colección.

boolean contains( Object ):


true si la colección contiene el argumento que se le pasa como parámetro.

boolean isEmpty():
true si la colección está vacía, no contiene ningún elemento.

Iterator iterator():
devuelve un Iterator que se puede utilizar para el desplazamientos a través de los elementos que componen
la colección.

boolean remove( Object ):


si el argumento está en la colección, se elimina una instancia de ese elemento y se devuelve true si se ha
conseguido.

boolean removeAll( Collection ):


elimina todos los elementos que están contenidos en el argumento. Devuelve true si consigue eliminar
cualquiera de ellos.

boolean retainAll( Collection ):


mantiene sólo los elementos que están contenidos en el argumento, es lo que sería una intersección en la
teoría de conjuntos. Devuelve verdadero en caso de que se produzca algún cambio.

int size():
devuelve el número de elementos que componen la colección.

Object[] toArray() :
devuelve un array conteniendo todos los elementos que forman parte de la colección.

i
5

559
Gestión de colecciones

Hashtable

Hashtable, es un objeto que implementa la correspondencia entre claves y valores a partir de Dictionary.
La función hash() hace corresponder a un ítem de mayor tamaño un código único.

Clase Object que devuelve un código hash

Método de la clase Object que devuelve un código hash, que se corresponde con la posición de memoria
donde está situado el objeto.

Conceptualmente es similar a un vector, pero en lugar de acceder a los objetos a través de un número, en
realidad se utiliza otro objeto. Esto nos lleva a usar claves y al tratamiento de las claves dentro del
programa.

i
6

560
Gestión de colecciones

Constructores:

Hashtable(int initial_capacity):
recibe el tamaño inicial de la tabla hash.

Hashtable(int initial_capacity, double loadfactor):


recibe el tamaño inicial y además permite personalizar qué porcentaje de la tabla que tiene que estar llena
para que la tabla se redimensione. No se espera que la tabla esté al 100%. El factor de carga va de 0 a 1 y
por defecto su valor es 0.75.

Métodos

boolean <Hashtable>.containsKey (Object Key):


devuelve true si existe la clave.

boolean <Hashtable>.containsValue (Object Value):


devuelve true si existe el valor.

Enumeration <Hashtable>.keys ():


devuelve las claves contenidas en Hastable

Enumeration <Hashtable>.elements ():


devuelve las valores contenidos en Hash

i
7

561
Gestión de colecciones

2. Enumeraciones e iteraciones
Colección

Para cualquier tipo de colección, debe existir una forma de poder introducir elementos y de extraer los
mismos, al fin y al cabo el objetivo de una colección es almacenar cosas.

En un vector:

Método addElement()
es la manera en que se colocan objetos dentro de la colección.

Método elementAt():
es cómo se sacan.

Enumerador, o iterador

El concepto de enumerador, o iterador, puede usarse para alcanzar el nivel de abstracción que se necesita
en este caso. Es un objeto cuyo propósito consiste en desplazarse a través de un conjunto de objetos y
seleccionar aquellos objetos adecuados sin que el programador que los usa tenga que conocer la estructura
de la secuencia.

562
Gestión de colecciones

Métodos de Enumerador, o iterador

Veamos algunos métodos de enumerador o iterador y un ejemplo de programación:

Métodos:

- El método elements()
nos suele devolver un objeto de tipo Enumeration y después ya operaremos con él.

- El método nextElement()
nos devolverá el primer elemento en la lista, cuando lo aplicamos por primera vez. Para obtener siguiente
elemento en la secuencia también o haremos a través del método nextElement().

- El método hasMoreElements()
para ver si hay más elementos en la secuencia
Hot pot en el botón ejemplo:
for (int i=0; i <coches.size (); i++)
{
((Coche)coches.elementAt(i)).print();
}

Pese a su simplicidad esta clase es bastante potente y se emplea mucho en la programación Java.

Ejemplo

for (int i=0; i <coches.size (); i++)


{
((Coche)coches.elementAt(i)).print();
}
// Recorremos un vector de objetos Coche , y extraemos cada elemento para asignárselo a
//un objeto de tipo coche
while( e.hasMoreElements() )
((Coche)e.nextElement()).print();
// Recorremos un Enumeration y extraemos cada elemento para asignárselo a un objeto //
de tipo coche

En Enumeration no hay que preocuparse del número de elementos que contenga la colección, ya que del
control sobre ellos se encargan los métodos hasMoreElements() y nextElement().

563
Gestión de colecciones

3. Colecciones de tipos genéricos


Collection y Map

La nueva librería de colecciones parte de la premisa de almacenar objetos, y diferencia dos conceptos en
base a ello:

Collection

Un grupo de elementos individuales, siempre con alguna condición que se les puede aplicar. Un List
almacenará objetos en una secuencia determinada y un Set no permitirá elementos duplicados.

Map

Un grupo de parejas de objetos clave-valor, como la Hastable ya vista.

Representa un conjunto de pares claves-valor.

Métodos Collection y Map

Métodos:

- Object <Map>.put (Object key, Object value)

- Object <Map>.get (Object key)

- Object <Map>.remove (Object key

- boolean <Map>.containsKey (Object key

- boolean <Map>.containsValue (Object value)

i
10

564
Gestión de colecciones

Map tiene dos implementaciones

HashMap: tiene mejor rendimiento


TreeMap: almacena los elementos en un árbol balanceado y cuando se necesitan sacar lo hace de forma
ordenada.

Los elementos del Map deben implementar hashCode() y equals().

Los tipos genéricos

Utilizando los genéricos se evitan las excepciones en tiempo de ejecución debido a la inserción de objetos
de distinto tipo en las colecciones.

Los tipos genéricos

Solamente son evaluados en tiempo de compilación, en ejecución no existen aunque nos aseguramos que si
el código compila correctamente, no nos encontraremos con problemas de casting entre objetos en la
ejecución del código.

Ejemplo

Si por ejemplo declaramos la siguiente lista: List<Integer> miLista = new ArrayList<Integer>() el


compilador no dejará que se inserte un objeto que no sea de tipo Integer.

Los tipos genéricos 2

Nuestro compilador sí aceptará clases derivadas, por ejemplo, si se declara una List<Map> se podrá insertar
un tipo HashMap, TreeMap, etc. Es decir, admite la sobrecarga de métodos ( polimorfismo).

i
11

565
Gestión de colecciones

Esto sería incorrecto: ArrayList<Map> list = new ArrayList<HashMap>().

Justo en el momento que hacemos la declaración (tipo Map) e instanciación (tipo HashMap) del
objeto colección no se admite el polimorfismo.

Clase Padre de todos los genéricos

Es <?>, indica que cualquier genérico puede ser insertado en la colección. También se puede indicar el
polimorfismo en los genéricos mediante <? extends Map>.

Donde se pueden utilizar los genéricos

Todo lo que extienda de Map se puede insertar en la colección:

Los genéricos también se pueden utilizar en la declaración de clases (class MiColecion <T> { ...
} ), atributos de la clase (T instancia), constructores ( MiColeccion (T ref)), métodos y tipos de
retorno (public T bar (T ref) {}).

El compilador sustituirá el tipo por el que se cree cuando se instancie un objeto de la clase MiColeccion

i
12

566
Gestión de colecciones

4. Resumen

Has llegado al final de este recurso formativo que denominamos “Gestión de colecciones ”
En esta lección hemos estudiado los siguientes contenidos:

i
13

567
UTILIZACIÓN DE LAS LIBRERÍAS
BÁSICAS DE JAVA – Caso práctico
Módulo: UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA – Caso práctico

Haz un programa Java en modo MS-DOS, la clase Leer.java, que nos sirva de modo estándar para poder
leer cualquier frase que un usuario introduzca por teclado.

Dentro tendrás que programar el método porTeclado() que será el que nos devuelva la cadena que se
ha leído en formato tipo String.

568
UTILIZACIÓN DE LAS LIBRERÍAS
BÁSICAS DE JAVA – Caso práctico
Módulo: UTILIZACIÓN DE LAS LIBRERÍAS BÁSICAS DE JAVA – Caso práctico
Realiza un programa JAVA llamado GestorCoche.java en modo MS-DOS que muestre por pantalla un
menú con las siguientes opciones:

1. Crear Objetos Coche y guardarlos


2. Salir

La opción 1 se encarga de ir creando objetos de tipo Coche (será una de las clases del ejercicio) con
los atributos marca y modelo de tipo String y año de tipo entero:

String marca=null;
String modelo=null;
int anio=0;

Para ello leeremos por teclado el valor de los 3 atributos.

Una vez creado el objeto de tipo Coche, lo insertaremos en un Vector que guardará todos los coches
que vayamos creando. Como estructuras se proponen el do...while y el switch. Para leer por teclado
se utilizará la clase realizada en el caso 1.

En la clase Coche se utilizará el método toString () por si se necesitara imprimir las propiedades de un
coche:

public String toString(){


String cadena=”Marca:” + marca + “Modelo:” + modelo + “Año:”+ anio;
return cadena;
}

569
 

Módulo 5:
Programación orientada a
objetos con java

   

570
LA PROGRAMACIÓN
ORIENTADA A
OBJETOS.
CONSTRUCTORES Y
SOBRECARGA
DE MÉTODOS

571
LA PROGRAMACIÓN ORIENTADA A OBJETOS.
CONSTRUCTORES Y SOBRECARGA DE MÉTODOS
Características de los Objetos

La programación orientada a objetos intenta llevar al mundo del software, los objetos del mundo real.

Al igual que en el mundo real los objetos están constituidos por propiedades o atributos y métodos, como
por ejemplo, un ordenador que tiene como propiedades la cantidad de memoria RAM, la capacidad de disco
duro, etc. y como métodos, encenderse(), resetearse(), etc., de la misma manera en el diseño orientado a
objetos, cada objeto consta de propiedades o atributos y de métodos.

Los objetos están organizados en clases, que representan las características comunes a todos los objetos
que pertenecen a ellas. Las clases funcionan como una especie de plantilla que contiene las propiedades y
métodos comunes a todos los objetos que pertenecen a una determinada clase.

Ejemplos de los Objetos

Revisemos lo anterior, a través de un ejemplo.

i
2

572
LA PROGRAMACIÓN ORIENTADA A OBJETOS.
CONSTRUCTORES Y SOBRECARGA DE MÉTODOS
La clase coche tiene las propiedades color y motor y los métodos arrancar() y frenar(). Por lo tanto, todos
los objetos que pertenezcan a la clase coche, llevarán implícitas estas propiedades así como el acceso a sus
métodos.

Dentro de la clase coche, las propiedades color y motor no contienen ningún valor, simplemente se declaran,
sin embargo, cuando creamos un objeto de esa clase es cuando los valores de las propiedades toman un
valor acorde con el tipo que tienen asignado.

Podríamos crear un objeto llamado Fiat, que perteneciese a la clase Coche y dar valor a sus propiedades:

Como vemos el objeto Fiat que se crea a partir de la clase Coche, tiene las propiedades de la clase a la que
pertenece y además dichas propiedades toman un valor. También el objeto Fiat tiene acceso a los métodos
de la clase a la que pertenece (arrancar() y frenar()).

i
3

573
LA PROGRAMACIÓN ORIENTADA A OBJETOS.
CONSTRUCTORES Y SOBRECARGA DE MÉTODOS
Características de la POO

Las características que hacen que un lenguaje sea o se considere orientado a objetos son:

Herencia

Polimorfismo

i
4

574
LA PROGRAMACIÓN ORIENTADA A OBJETOS.
CONSTRUCTORES Y SOBRECARGA DE MÉTODOS
Encapsulación

Objetos y clases

Los objetos son modelos de programación que comprenden una serie de propiedades por medio de variables,
y una funcionalidad por medio de métodos.

Propiedades Variables

Funcionalidad Métodos

Las clases son la generalización de los objetos, de forma que un conjunto de objetos con las mismas
características y funcionalidad formarán una clase.

i
5

575
LA PROGRAMACIÓN ORIENTADA A OBJETOS.
CONSTRUCTORES Y SOBRECARGA DE MÉTODOS

Surge ahora el término de instancia. Una instancia de una clase no es más que un objeto particular de esa
clase. Cuando creamos un objeto de una determinada clase, diremos que ese objeto se ha instanciado de la
clase a la cual pertenece:

Clases Primitivas

Java tiene un conjunto de clases predefinidas llamadas clases primitivas. Para incluir en nuestros programas
paquetes con otras clases definidas por nosotros, teclearemos el comando import seguido del nombre del
paquete que nos interese cargar y el nombre de la clase perteneciente a ese paquete.

Ejemplo:

i
6

576
LA PROGRAMACIÓN ORIENTADA A OBJETOS.
CONSTRUCTORES Y SOBRECARGA DE MÉTODOS
Si nos interesara incluir todas las clases del paquete Java.awt, teclearemos el comando import seguido del
nombre del paquete que nos interese cargar y después el símbolo * (asterisco) para hacer referencia a todas
las clases incluidas en ese paquete.

Ejemplo:

Parámetros de una clase

Revisemos ahora todos los parámetros que pueden aparecer a la hora de definir una clase:

Definición de una clase:

[Modificador]: aplicable a clases, se verán más adelante los posibles modificadores

class: palabra reservada. Sirve para declarar una clase. Todos los atributos y métodos de la clase se definirán
dentro de las llaves de abajo.

Nombre de Clase: es el nombre que le damos a la clase.

i
7

577
LA PROGRAMACIÓN ORIENTADA A OBJETOS.
CONSTRUCTORES Y SOBRECARGA DE MÉTODOS
[extends Nombre_clase]: indica que la clase hereda de otra clase. También se indica el nombre de la clase
de la que se hereda.

[implements Nombre_interface]: indica que se implementa un interface Java. Posteriormente se definirá


más a fondo el concepto de interface Java.

Constructores

El Constructor es un método especial que se ejecuta justo después de haber creado el objeto y que sirve para
inicializarlo. No reserva memoria para el objeto, sólo lo inicializa. Quien reserva memoria para el objeto es
el operador new.

El constructor se caracteriza porque tiene el mismo nombre que la clase y no tiene retorno, ni siquiera se le
pone el modificador void.

Class punto {
int x, y;
punto (int x, int y) {
this.x = x;
this.y = y;
}
}
punto p1 = new punto (3,1);
punto p2 = new punto (5,4);

i
8

578
LA PROGRAMACIÓN ORIENTADA A OBJETOS.
CONSTRUCTORES Y SOBRECARGA DE MÉTODOS
Ejemplo

Tipos de Constructores

Constructor por defecto, es aquel que no recibe parámetros. Los constructores generales son los que reciben
uno o más parámetros.

i
9

579
LA PROGRAMACIÓN ORIENTADA A OBJETOS.
CONSTRUCTORES Y SOBRECARGA DE MÉTODOS
Si una clase no tiene constructores, el compilador le pone un constructor anónimo por defecto.

class punto {
int x, y;
punto (int x, int y) {
this.x = x;
this.y = y;
}
punto (int xy) {
this (xy, xy); // Llama al constructor anterior.
}
}

Métodos

El método es una función asociada a un objeto, de manera que siempre que se va a ejecutar un método, se
tiene que decir sobre qué datos del objeto.

El método no tiene el modificador static delante del nombre:

class fecha {
int dia, mes, anno;
void imprimir () {
System.out.println (this.dia+”/”+this.mes+”/”+
this.anno);
}
}

i
10

580
LA PROGRAMACIÓN ORIENTADA A OBJETOS.
CONSTRUCTORES Y SOBRECARGA DE MÉTODOS
Mientras las funciones no necesitan un objeto para ejecutarlas, los métodos necesitan que se haya creado
el objeto para ejecutar el método:

fecha f1 = new fecha();


fecha f2 = new fecha();
f1.dia = 20; f1.mes = 9; f1.anno = 2000;
f2.dia = 6; f2.mes = 11; f2.anno = 1999;
f1.imprimir(); // Llamada al método > 20/9/2000
f2.imprimir(); // Llamada al método > 6/11/2000

Las operaciones que se pueden realizar sobre objetos se van realizar por medio de métodos.

Sobrecarga de funciones

En Java es posible crear varias funciones con el mismo nombre, de manera que se distingan por sus
parámetros.

La diferencia de los parámetros se puede establecer respecto al número de parámetros o respecto al tipo
de parámetros. Cuando se llame a la función, el compilador decidirá a cuál de las funciones sobrecargadas
llamar en función a los parámetros:

Parámetros:

11

581
LA PROGRAMACIÓN ORIENTADA A OBJETOS.
CONSTRUCTORES Y SOBRECARGA DE MÉTODOS
Función

int a = 3, b = 5, c = 8;
float f = 3.7f;
double d = 8.2, e = 1.7;
suma (a,b); // Llama 1.
suma (a, b, c); // Llama 2.
suma (d, e); // Llama 3.
suma (a, d); // Llama 3.
suma (a, b, f); // Error no se puede estrechar.
Suma (a, b, (int) f); // Llama 2.

Resumen

Has llegado al final de este recurso formativo que denominamos “La programación orientada a objetos.
Constructores y sobrecarga de métodos”

En esta lección hemos estudiado los siguientes contenidos:

i
12

582
PROGRAMACION
ORIENTADA A
OBJETOS
CON JAVA

583
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Diseño estructurado

La falta de estandarización de ciertos conceptos y sobre todo de sus traducciones al castellano hacen que
dependiendo de la fuente documental el nombre de los conceptos varíe.

- “Métrica 3” y “Métricas del software” se refieren a elementos totalmente diferentes

- Muchas veces se emplea la palabra “Análisis” para referirse al “Diseño” o el término “Análisis
Orgánico” para referirse al “Diseño”.

Existen diversas metodologías estándar, pero muchas empresas las aplican parcialmente usando criterios
propios, con lo que se pierden ciertas virtudes de la estandarización.

En UML 1.0 se habla de diagramas de colaboración, mientras que en UML 2.0 este mismo diagrama se
denomina de comunicación mientras que el termino ‘colaboración’ se emplea con un significado diferente.

CONCEPTOS PREVIOS

Especificación

Definición de un problema que se debe resolver o de unos objetivos que se quieren alcanzar.

Implementación

Una combinación de elementos de software que cumplen una especificación y por lo tanto resuelven el
problema o cumplen el contrato que la especificación plantea.

i
2

584
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Sistema Informático

Programa informático y soporte de software y de hardware que permite su funcionamiento. Se abrevia con
las siglas (S.I.).

Lógica de negocio

Elementos de un S.I. que están vinculados con la actividad específica desarrollada por un determinado
organismo, empresa o entidad.

Métodos de negocio

Operativas que implementan la lógica del negocio.

Reingeniería / Refactorización

Proceso por el que se vuelve a realizar un cierto trabajo vinculado con el desarrollo del S.I. con el fin de
mejorar sus propiedades.

Modelar

Consiste en generar documentos que permiten desarrollar un S.I. desde sus requisitos hasta su puesta en
producción.

CARACTERÍSTICAS DE UN S.I.

Modularidad

Capacidad que tiene una parte de un S.I. para poderse planificar, diseñar, desarrollar y verificar
independientemente de otros módulos.

i
3

585
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Cohesión

Integración de las funcionalidades implementadas en un determinado módulo de código.

Acoplamiento

Mide la capacidad de los módulos de funcionar juntos sin tener que conocer la implementación interna de
dicho módulo.

Acoplamiento alto: los módulos interactúan pero las dependencias entre ambos módulos son elevadas

Acoplamiento bajo: los módulos interactúan a través de un interfaz bien definido y acotado.

Reutilización

Capacidad que tiene un módulo de software para poder emplearse en diferentes situaciones.

Usabilidad

Facilidad que presenta un determinado S.I. o módulo de software para su empleo por parte de usuarios con
capacidades técnicas medias.

Accesibilidad

Facilidad que presenta un determinado S.I. o módulo de software para su empleo por parte de usuarios con
algún tipo de limitación física o psíquica.

i
4

586
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Legibilidad

Facilidad que presenta un código, documentación o módulo de un S.I. para su compresión por desarrolladores
ajenos al programador original.

Trazabilidad

Capacidad que presenta un determinado proceso o producto para poder analizar el ciclo de vida de ese
producto desde su concepción hasta la fase actual.

EJEMPLOS DE CONCEPTOS

Término Ejemplo

Especificación Hacer una aplicación de venta online

Implementación La aplicación Web que cumple la especificación aportada.

Sistema Informático Aplicación Web + Servidor de Aplicaciones + Servidor de Hardware + Entregables.

Lógica del negocio La lógica de negocio de un banco es la gestión de las cuentas, de los recibos,
préstamos, clientes…

Reingeniería /
Refactorización La reingeniería de un S.I. con muchas carencias puede dar como resultado un
nuevo S.I. más fiable y estable.

Un proceso de reingeniería aplicado en un antiguo sistema en Visual Basic puede


resultar en un nuevo sistema en Java.

i
5

587
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Término Ejemplo

Modelar Se modelan diagramas en el análisis de un sistema para pasar de los requisitos


del mismo a su diseño.

Modularidad Un S.I. de una tienda on-line puede tener un módulo de ventas y un módulo de
stock (entre otros módulos).

Cohesión Un módulo de “operativa común” donde se gestionen las ventas, el stock y el


cobro de pagos, no está bien cohesionado.

Una clase llamada CuentaBanco que tenga un método conectarBBDD() o un


atributo llamado edadTitular no está bien cohesionada.

Acoplamiento Supongamos que un módulo A depende de otro módulo B para poder funcionar.
Si B no puede intercambiarse con otro módulo C sin precisar de grandes cambios
en A, entonces el acoplamiento entre A y B es elevado.

Reutilización Un módulo de acceso a BBDD que se puede usar tanto en un S.I. de venta online
como de gestión de RRHH. Es reutilizable.

Usabilidad Una aplicación cuyo interfaz gráfico es intuitivo y facilita el trabajo del usuario
es usable.

Accesibilidad Una aplicación que respeta estándares para su uso por parte de discapacitados
es accesible.

Legibilidad El uso de variables con nombre crípticos dificulta la legibilidad de un código.


La falta de documentación actualizada dificulta la comprensión (legibilidad) de
un proyecto.

Trazabilidad Un determinado módulo de un S.I. es trazable si podemos identificar claramente


los entregables de las fases de análisis y diseño que dieron lugar a su creación.

i
6

588
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

ENTREGABLES

Diagramas de flujo de datos (DFD):

Permite modelar el procesamiento que experimentan los datos en un determinado proceso de software
mediante notaciones gráficas.

Las notaciones gráficas básicas son:

- Función: representada por un círculo.

- Fichero/BBDD: representada por dos líneas paralelas

- Entrada/Salida: representada por un rectángulo

- Flujo: flecha que relaciona a los elementos anteriormente mencionados.

Imagen de la wikipedia con los símbolos básicos de


un diagrama DFD

i
7

589
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Modelado del alta y baja de empleados en un almacen del S.I.

Al modelar S.I. primero se suele realizar un DFD de contexto que permite ubicar todos los módulos principales
del sistema (en un DFD se les llama funciones principales).

A continuación se expande ese DFD de contexto en diagramas más detallados que cubran la funcionalidad
requerida en el sistema.

Diagramas entidad-relación (DER):

Permite modelar el almacenamiento persistente de información de una BBDD.

Se emplean los siguientes elementos básicos:

- Entidades: las entidades serán habitualmente tablas de nuestra BBDD. Están visualmente
representadas por rectángulos.

- Relaciones: representadas por flechas que opcionalmente pueden presentar rombos.

- Atributos: indican propiedades de las tablas. Se representan con elipses.

i
8

590
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Entidades Pedido y Artículos que representan la estructura típica de una tienda

Existen diversas notaciones que modifican la forma en que se representan los diagramas, estas diferencias
afectan sobre todo a las relaciones. Las notaciones más extendidas son:

Barrer

Ejemplo de notación Barrer de http://www.essentialstrategies.com/

591
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Chen

Ejemplo de http://cs1.mcm.edu

Bachman

Ejemplo de http://elearning.tvm.tcs.co.in/re/re/3_3_ERD.htm

10

592
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Diccionario de proyecto:

Proporciona una definición para todos los conceptos propios de lógica de negocio de una aplicación. En
proyectos internacionales se suele indicar el concepto en castellano y el concepto en inglés para evitar
confusiones debidas a la traducción.

Ejemplo de diccionario de proyecto para un proyecto de agencia de viajes:

- Asistente de vuelo (flight atendant): persona encargada de garantizar la seguridad y confort de los
pasajeros del vuelo.

- Operador de base fija (fixed base operador): proporcionan servicios como combustible, aceite y
aparcamiento para aviones en los aeropuertos.

- Codeshare: convenio entre dos empresas para compartir un avión en un vuelo.

Prototipos:

Versiones intermedias de una aplicación que proporcionan un avance del resultado final de la aplicación que
se pretende obtener. Un prototipo puede ser de dos tipos:

- Maqueta: permite evaluar la apariencia visual del sistema pero no dispone de funcionalidad real.

- Prototipo: permite evaluar la apariencia visual y parte de la funcionalidad que se pretende


implementar.

i
11

593
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

METODOLOGÍAS BÁSICAS PARA EL DESARROLLO DE PROYECTOS

Secuencial o en cascada:

Formada por todas o parte de las siguientes etapas:

- Captura de requisitos (casos de uso)

- Análisis

- Diseño

- Implementación

- Pruebas unitarias

- Pruebas de conjunto

- Paso a producción

- Mantenimiento

Representación típica de una metodología secuencial o en cascada

12

594
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Iterativa:

Consiste en repetir la metodología secuencial un determinado numero de veces, reevaluando el resultado


obtenido al final de cada iteración.

Imagen de la wikipedia que refleja un proceso iterativo.


http://en.wikipedia.org/wiki/Iterative_and_incremental_development

Basada en prototipos:

Es similar a la metodología iterativa pero en cada iteración se obtiene un prototipo de la aplicación final.

Este tipo de metodología es especialmente útil en proyectos donde el cliente quiera evaluar la evolución del
proyecto para realimentar los requisitos del mismo.

i
13

595
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

METODOLOGÍAS ESPECÍFICAS

Métrica 3:

- Metodología impulsada por el Ministerio de Administraciones Publicas.

- Cubre aspectos no sólo del análisis y el diseño sino también de planificación, seguridad y estimación.

- Los puntos básicos que la definen son:

* Planificación de Sistemas de Información (Proceso PSI)

* Estudio de Viabilidad del Sistema (Proceso EVS)

* Análisis del Sistema de Información (Proceso ASI)

* Diseño del Sistema de Información (Proceso DSI)

* Construcción del Sistema de Información (Proceso CSI)

* Implantación y Aceptación del Sistema (Proceso IAS)

* Mantenimiento del Sistema de Información (Proceso MSI)

- En sus versiones más recientes presenta la posibilidad de emplear técnicas propias del Análisis y
Diseño orientado a Objetos (Diagrama de casos de uso, de secuencia,…)

i
14

596
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

MÉTRICAS DEL SOFTWARE

- Las métricas del software pretenden evaluar con parámetros objetivos y universalmente aplicables
diferentes parámetros de proyectos y sistemas informáticos desarrollados.

- Las métricas del software suelen recibir fuertes críticas y su aplicación práctica está muy discutida
en ciertos entornos.

- No debemos confundir las métricas del software con la metodología “Metrica 3”, su única semejanza
es el nombre.

Numero de líneas de código.

Cuenta el número de líneas de código de una determinada aplicación.

Cada vez tiene menos sentido, al depender el software en librerías externas que aportan la funcionalidad
básica.

En esta imagen de la wikipedia se ve que el número de líneas de código no determina la complejidad


o funcionalidad obtenidas.

15

597
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Complejidad ciclomática.

- Evalúa el numero de rutas posibles de ejecución que un programa puede tener, a mayor numero de
rutas, mayor complejidad.

Análisis punto de función.

- Evalúa la lógica de negocio que un S.I. aporta al usuario desde el punto de vista del propio usuario.

- Es un procedimiento ideado por IBM en los 80 que cuenta con un procedimiento de aplicación muy
extenso y parametrizable a cualquier tipo de S.I.

- Básicamente consiste en ponderar la complejidad de los diferentes elementos que forman un sistema
y acumular dicha complejidad para obtener una medición de todo el sistema.

Errores por línea de código.

Evalúa el número de errores que se presentan en los sistemas con respecto al código total del mismo.

Su aplicación es compleja debido a que no todos los errores son del mismo tipo y complejidad. Existen
diferentes variantes de esta métrica.

Métricas menores

Otras muchas métricas se usan en determinados ámbitos del desarrollo de S.I. para evaluar la calidad del
proyecto, del producto o del mantenimiento del mismo.

- Número de errores introducidos por desarrollador / hora de trabajo


- Número de actualizaciones necesarias desde el lanzamiento para obtener un producto estable.
- Número de fallos detectados por el usuario final.

i
16

598
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Ventajas de las métricas

- Las métricas permiten evaluar la evolución de los proyectos en un equipo de proyecto o empresa y
así mejorar futuros desarrollos.

Desventajas de las métricas

- La complejidad inherente al desarrollo de aplicaciones hace que las métricas muchas veces no
plasmen numéricamente la realidad de los proyectos.

i
17

599
HERENCIA

600
ÍNDICE
HERENCIA

1. Concepto de herencia. Características de la herencia en Java . . . . . . . . . . . . . . . . . . . . . . . .3


2. Ejecución de constructores en la herencia. Uso de super y this. . . . . . . . . . . . . . . . . . . . . . .11
3. Sobreescritura de métodos. Uso de modificadores final, protected y private . . . . . . . . . . . . .14
4. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17

601
Herencia

1. Concepto de herencia. Características de la herencia en Java


Herencia

La herencia, nos permite crear una clase a partir de otra clase que ya esté creada.
A la clase de la que se hereda se le denomina clase base, y a la clase que hereda
de la clase base se le denomina clase derivada.

De esta forma las clases quedan organizadas de forma jerárquica.

class MiVentana extends Window {


// Cuerpo de la clase.
}

Agregación y Composición

Agregación y Composición son otro tipo de relaciones entre objetos.

La Agregación consiste en la creación de un objeto desde una clase que se


denomina objeto contenedor, el cual tiene referencias a objetos de otra clase
a los que llamamos objetos contenidos. La vida de los objetos contenidos no
está limitada a la vida del contenedor, ambos son independientes.

La Composición consiste en que hay un objeto que llamamos contenedor el


cual está formado por objetos de otra clase a los que llamamos contenidos.
De forma que la vida de los contenidos está limitada a la del contenedor.

602
Herencia

Ejemplo

Conversión implícita y explícita con referencias a Objetos

Si las clases están vinculadas mediante relaciones de herencia, se pueden hacer conversiones.

Java permite convertir una referencia a clase derivada en una referencia a clase base implícitamente, y
permite convertir una referencia clase base en una referencia clase derivada utilizando casting.

i
4

603
Herencia

Conversiones entre clases hermanas

Entre clases hermanas no se pueden realizar conversiones ni con el operador casting.

Deriv1 d1 = new Deriv1();


Deriv2 d2 = new Deriv2();
d1 = d2; // Error.
d1 = (Deriv1) d2; // Error.

i
5

604
Herencia

Es lógico que no se pueda hacer la conversión ya que existirán atributos y métodos en una clase y en otra
no.
En Java no se permiten las conversiones entre las referencias y los tipos fundamentales de datos ni con
casting.

int a = 3;
Punto p = (Punto) a; // Error.

Enlace Estático y Enlace Dinámico

El Enlace Estático consiste en decidir qué método ejecutar en función del tipo de referencia con la que se
está apuntando al objeto (se ejecuta Metodo1 de la clase Base). Enlace Dinámico, consiste en decidir qué
método se debe ejecutar en función del tipo de objeto que se está apuntando desde la referencia (se ejecuta
Metodo1 de la clase Derivada).

La ventaja del Enlace Estático es que es más rápido que el Enlace Dinámico porque en tiempo de compilación
ya se sabe qué método ejecutar. Tiene el inconveniente de que normalmente se va a querer ejecutar el
método del objeto apuntado y no el de la referencia que se usa para apuntar.

El Enlace Dinámico es más lento porque hasta que no llega el momento de ejecutar el método no sabe a qué
objeto estará apuntando la referencia. Java utiliza por defecto el Enlace Dinámico y si se quiere que utilice
el Enlace Estático se tiene que poner el modificador final al método.

class Base {
final void Metodo1() {
System.out.println (“Método de la clase Base”);
}
}class Derivada extends Base {
void Metodo1() {
System.out.println (“Método de la clase Derivada”);
}
}
Base b = new Derivada(); // Correcto;
b.Metodo1(); // ¿Cuál se ejecuta?

i 6

605
Herencia

El operador instanceof

El operador instanceof sirve para preguntar si un objeto al que se está apuntando con una referencia es de
una determinada clase.
El formato es el siguiente:

<Referencia> instanceof <clase>

Ejemplo

Pixel px = new Pixel();


if (px instanceof Pixel) {
// px es Pixel. Se cumple.
}
if (px instanceof Fecha) {
// px no es Fecha. No entra.
}
if (px instanceof Punto) {
// px no es Punto, pero Pixel deriva de Punto. Se cumple.
}
if (px instanceof Object) {
// px al derivar de Punto, Punto deriva de Object.
// Se cumple.
}

i
7

606
Herencia

El método finalize()

El método finalize(), es un método que se ejecuta justo antes de que el sistema de recogida de basura de
Java libere la memoria del objeto. El método finalize() se puede redefinir para poner las operaciones que
se quieran hacer antes de destruir el objeto:

class Punto p = new Punto (2,3);


p.finalize() // Ejecutaría las operaciones de desinicialización
// pero no libera memoria.
class Punto {
int x, y;
protected void finalize() throws Throwable {
//Operaciones de desinicialización.

- El método finalize() sólo es ejecutado por JVM.


- El método finalize() se encuentra en la clase Object, vacío. En las clases derivadas es donde se
redefine.

super.finalize();

Ejemplo

class Pixel {
int x, y, color;
protected void finalize() throws Throwable {
super.finalize(); // Punto  Object.
}
}

i
8

607
Herencia

Nexos Dinámicos (array de objetos)

Nexos Dinámicos (Array de Objetos), es un conjunto de referencias a objetos que comparten una serie de
características comunes.

Los nexos dinámicos pueden tener otras características específicas que no formen parte del nexo.

class Figura {
int color, vertices;
Figura (int color, int vertices) {
this.color = color;
this.vertices = vertices;
}
int getVertices () {
return vertices;
}
public String toString() {
return “Color: “+color+” Vertices: “+ vertices;
}

i
9

608
Herencia

class Punto extends Figura {


int x, y, color;
Punto (int x, int y, int color) {
this.x = x;
this.y = y;
super (color, 1)
}
public String toString() {
return “[“+x+” , “+y+”]”+color
}
}
class Segmento extends Figura {
Punto desde, hasta;
Segmento (int x1, int y1, int x2, int y2) {
super (color, 2);
desde = new Punto (x1, y1, color);
hasta = new Punto (x2, y2, color);
}
public String toString() {
return “Segmento: “+x1+”,”+y1+” / “+x2,” , “+y2;
}
}
Figura [] figuras = new Figura[4];
Figuras[0] = new Punto (2, 3, 8);
Figuras[1] = new Segmento (4, 1, 3, 8, 5);
Figuras[2] = new Punto (2, 1, 5);
Figuras[3] = new Rectangulo(8, 4, 1, 3, 0, 1, 2, 8, 7);

for (int i=0; i < figuras.length; i++)


System.out.println (figuras[i].toString()+” tiene “+
figuras[i].getVertices()+” vertices “);

Con una referencia a clase base sólo se puede acceder a los métodos y atributos de clase base a
pesar de que se esté apuntando a un objeto de tipo clase derivada:

figuras[1].x1 = 3; // Error (Atributo de la derivada).


figuras[1].color = 3; // Correcto (Atributo de la base).
Figuras[1].getVertices(); // Correcto (Método de la base).

10

609
Herencia

2. Ejecución de constructores en la herencia. Uso de super y this


Orden de Ejecución de los constructores en la herencia

La clase derivada hereda todos los métodos y atributos excepto el constructor de la clase base (ni constructor
por defecto ni los constructores generales).

Cuando se crea un objeto de la clase derivada, primero se ejecuta el constructor por defecto de la clase base
y posteriormente el constructor de la clase derivada.

i 11

610
Herencia

El operador super

1. Indica qué constructor de la clase base se quiere ejecutar cuando se crea un objeto de la clase
derivada.

2.Indica que se quiere ejecutar un método de la clase base que existe también en la clase derivada.

Ejemplo

class Punto {
int x, y;
Punto (int x, int y) {
this.x = x; this.y = y;
}
Public toString() {
return “[“+x+” , “+y+”]”;
}
} // Cierre de la clase Punto
class Pixel {
int color;
Pixel (int color) {
this.color = color;
super (x, y); // Llamada a constructor de la
//clase Punto.
}
Public String toString() {
return super.toString() + “color: “ + color;
// Llamada a la función toString de la clase Punto.
}
}

i
12

611
Herencia

El operador this

El operador this, es una referencia sobre el objeto que se está ejecutando en el momento actual.
Casi siempre se hace referencia al objeto actual y en algunos casos hace referencia a la clase actual. Como
el significado de este parámetro depende en gran medida del contexto en el que lo estemos utilizando,
haremos más hincapié en el this, cada vez que vaya surgiendo a lo largo de este curso, explicando en cada
momento a quién hace referencia.

Ejemplo

Dentro de un constructor se pueden referenciar a las variables de la clase por medio de


este operador, como puede verse en la clase siguiente:
class Fecha{
int dia ;
int mes;
Fecha(int d){
this.dia=d; // this.dia hace referencia a la variable dia de la clase Fecha
}
Fecha(int d,int m){
this.dia=d; // this.dia hace referencia a la variable dia de la clase Fecha
this.mes=m; // this.mes hace referencia a la variable mes de la clase Fecha
}
}

i
13

612
Herencia

3. Sobreescritura de métodos. Uso de modificadores final,


protected y private
Polimorfismo

El polimorfismo permite que objetos distintos puedan tener métodos con el mismo nombre o incluso un
mismo objeto puede tener nombres de métodos idénticos pero con distintos parámetros (concepto de
sobrecarga de métodos).

Tiene varios métodos polimórficos, es decir, varias versiones


del mismo método que las usaremos según nos convenga en
un programa, la única condición es que no reciban igual
número o igual tipo de parámetros.

Ejemplo

class Prueba{
public void pintar( int x , int y){
System.outr.println( x+y);
}
public void pintar( String a , String b){
System.outr.println( a+b);
}
public void pintar( int x , int y,String z){
System.outr.println( (x+y) + “<>” + z);
}
}

i
14

613
Herencia

Tiene 3 métodos con el mismo nombre pero parámetros distintos. Lo que no podremos tener nunca serán 2
métodos pintar que reciban el mismo número y tipo de parámetros, la implementación de este método
dentro de la clase Prueba daría un error:

public void pintar( int c , int m){


System.outr.println( x+y);
}

El modificador final

El modificador final indica que el atributo es una constante, su valor no se puede modificar.

class fecha {
final int diasSemana = 7;
final int [] diasMes = {31,28,31,30,31,30,31,31,30,31,30,31};
int dia, mes, anno;
}
fecha f1 = new fecha()
f1.diasSemana = 5; // Error.
f1.diasMes[1] = 29; // Correcto, los datos del array se
// pueden modificar.
f1.diasMes = new int[12]; // Error, no se puede crear un nuevo
// array, lo constante es la referencia.

-o, opción de compilación para no incluir las constantes en los objetos. De esta forma las constantes se
sustituyen por su valor y no reserva espacio en memoria.

Normalmente los atributos declarados como final van a ser estáticos:

La razón es que no se necesita crear un objeto para acceder a ellas:

En los métodos, el modificador final indica que no se pueden redefinir, es decir, que ninguna clase derivada
puede cambiar ese método.

static final float pi = 3.1416f;


static final int altas = 2;

15

614
Herencia

El modificador protected

Los atributos o métodos de una clase que sean declarados como protected, solamente podrán ser accedidos
desde la propia clase y desde las clases derivadas de ella, pero nunca desde otras clases.

Ejemplo:

El atributo num al ser declarado


como protected, solamente podrá
ser accedido desde objetos de las
clases A ( su propia clase) y desde la
clase B ya que es derivada de A, pero
nunca desde la clase C.

El modificador private

Los atributos o métodos de una clase que sean declarados como private, solamente podrán ser accedidos
desde la propia clase.

El atributo num al ser declarado


como private, solamente podrá ser
accedido desde objetos de la clase A,
pero nunca desde la clases B y C, a
pesar de que B sea derivada de A.

16

615
Herencia

4. Resumen

Has llegado al final de este recurso formativo que denominamos “Herencia”


En esta lección hemos estudiado los siguientes contenidos:

i
17

616
PROGRAMACION
ORIENTADA A
OBJETOS
CON JAVA

617
ÍNDICE
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

1. Clases abstractas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3
2. Clases anidadas, locales y anonimas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5
3. Interfaces. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9
4. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11

618
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

1. Clases abstractas
Características de las clases abstractas

Una clase abstracta (modificador abstract) es una clase que puede tener clases que deriven de ella, pero no
puede ser instanciada, es decir, no se puede hacer un new.

Características de las clases abstractas:

- Una clase abstracta tiene que derivar de una clase abstracta.


Por ejemplo, la clase Number es una clase abstracta que representa cualquier tipo de números y sus
métodos no están implementados, son abstractos, lo que quiere decir que están vacíos. Las clases
descendientes de ésta, como Integer o Float, sí implementan los métodos de la clase base Number,
y se pueden instanciar.

- Sirven para modelar conceptos.

- Es una clase diseñada para actuar como base de otras clases derivadas en la cual se pone la
funcionalidad (los métodos) común de los objetos derivados, pero a diferencia de las clases normales
no se pueden crear objetos de la base abstracta.

Ejemplo

abstract class Figura {


// Cuerpo de la clase.
}
No se pueden crear objetos pero sí referencias:
Figura fig; // Referencia.
Figura fig = new Figura(); //Error, no se puede crear objeto.
Figura fig = new Alfil(); //Correcto, Alfil es derivada.

619
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Métodos abstractos

Las clases abstractas opcionalmente pueden tener métodos abstractos. Un método abstracto no se
implementa (va sin código) para que sea una clase derivada quien lo implemente.

Es decir, un método que obligatoriamente hay que redefinirlo (sobrescribirlo).

- Sólo las clases abstractas pueden tener métodos abstractos.

- Si una clase tiene un método abstracto sus derivadas deben implementar el método abstracto o
seguirán siendo clases abstractas.

- Una clase abstracta puede tener constructores los cuales serán obligatorios para las derivadas.

- Los métodos estáticos no pueden ser abstractos.

Ejemplo

abstract class Figura extends Casilla {


int color;
Figura (int x, int y, int color) {
super (x, y);
this.color = color;
}
public String toString() {
return “Color: “+color+super.toString();
}
abstract bolean movimientoACasilla (Casilla c);
// Método no implementado ya que es abstracto, se
// redefine y se ejecuta el método en la clase derivada.
boolean esAtacadaPor (Figura f) {
if (f.puedeMoverA(this)) return true;
return false;
}
}

620
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

2. Clases anidadas, locales y anónimas


Clases anidadas

Llamamos clase interna (inner class) a una clase que está declarada dentro de otra a la que se le denomina
clase externa (outer class).

Revisemos esto a través de un ejemplo:

class Robot {
Robot (String nombre, int posX, int posY) {
this.descripcion = new Descripcion(nombre);
this.posX = posX;
this.posY = posY;
}
int posX, posY;
Descripcion descripcion;
class Descripcion {
String nombre;
Descripcion (String nombre) {
this.nombre = nombre;
}
public String toString() {
return “Robot: “+nombre+” en coordenadas: “+
“[“posX+” , “+posY+”]”;
}
} // Cierre de la Clase Descripcion.
} // Cierre de la Clase Robot.

i
5

621
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Ventaja de la clase interna

La clase interna tiene la ventaja de que puede acceder a los atributos de la clase externa (aunque sean
privados) y a sus propios atributos.

Siguiendo con el ejemplo anterior, para crear un objeto a partir de la clase Robot, se haría así:

Dentro de Descripcion se puede acceder a los atributos de Robot:

posX = 10; posY = 11;

Clase interna deriva en clase externa

La clase interna puede derivar de la externa, pero la externa no puede derivar de la clase interna.

Continuando con el ejemplo, esto sería así:

622
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Clase interna estática

La clase interna puede ser estática, en cuyo caso sólo puede acceder a los atributos estáticos de la clase
externa, pero a cambio va a poder ser instanciada desde fuera de la clase:

class Contenedora {
static class contenida {
int x,y;
}
}
public static void main (String[] args) {
Contenedora.Contenida c1 = new Contenedora.Contenida();

Las clases anidadas pueden ser también abstractas y finales (abstract / final).

Clases locales

La clase local es aquella que está declarada dentro del método de otra clase.

La clase local puede acceder a las variables locales del método y a los atributos de la clase externa y puede
derivar de la clase externa pero no al revés.

Ejemplo

class Prueba {
public static void main(String [] args) {
class Punto { // Clase Local puede acceder a las var.
int x,y; // locales de main y a los atributos
} // de la clase Prueba.
}
Punto p = new Punto();
}

i 7

623
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Clases anónimas

La clase anónima es aquella que se crea sin nombre como derivada de otra.

A la vez que se crea la clase anónima se instancia un objeto de dicha clase.

Ejemplo

public static void main (String [] args) {


Punto p = new Punto(2,3)
{
int color = 5;
public String toString() {
return super.toString()+” color: “+color;
}
};
}

En este caso no se puede acceder a los atributos de la clase anónima:

p.color = 10; //Error.


Pixel px = (Pixel) p; // Error.

Las clases anónimas sirven para redefinir métodos.

i
8

624
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

3. Interfaces

Una interface es una clase que no implementa sus métodos, sino que deja a cargo la implementación a otras
clases. Las interfaces pueden derivar de otras interfaces pero no de otras clases.

Interface

- Sus métodos suelen ser abstractos y sus atributos son finales (una interfaz contiene solamente
métodos vacíos y/o constantes).

- Genera relaciones entre clases que de otro modo no están relacionadas, o para distribuir paquetes
de clases indicando la estructura de la interface pero no las clases individuales.

- Distintas clases pueden implementar las mismas interfaces, y a la vez derivar de otras clases.

- Una clase sólo puede derivar a la vez de una sola clase, sin embargo puede implementar más de una
interface. Es la forma de dotar a Java de herencia múltiple ya que a diferencia de C++ carece de esta
característica.

class <nombre_clase> [extends <clase base>]


[implements <lista_interfaces>]
{. . .}

Ejemplo de interface

Una interface es una especificación de las operaciones que tienen los objetos de un determinado tipo de
forma.

Una clase que implementa una interface, tiene que implementar todos sus métodos o bien
declararse como abstracta.

i
9

625
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

interface Television {
[abstract] void encender();
void apagar();
void subirVolumen (int cuanto);
void bajarVolumen ( int cuanto);
void cambiarCanal (int canal);
int getCanalActual();
}
class Sony implements Television {
int volumen, canal;
static final int MIN_VOLUMEN = 0;
static final int MAX_VOLUMEN = 20;
static final int MIN_CANAL = 1;
static final int MAX_CANAL = 99;
void apagar () {
System.out.println (“Televisor apagado. Adiós.”);
}

void encender () {
System.out.println (“Televisión Sony BT13, hola.”); }
void subirVolumen (int cuanto) {
if (volumen + cuanto > MAX_VOLUMEN)
volumen = MAX_VOLUMEN;
else volumen += cuanto; }
void bajarVolumen (int cuanto)
if (volumen – cuanto > MIN_VOLUMEN)
volumen = MIN_VOLUMEN;
else volumen -= cuanto;
}
void cambiarCanal (int canal) {
if (canal < MIN_CANAL || canal > MAX_CANAl)
return;
this.canal = canal;
}
void getCanalActual() {
return canal;
}
} // Fin de clase Sony.

10

626
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

4. Resumen

Has llegado al final de este recurso formativo que denominamos “Clases abstractas, anidadas, locales y
anónimas. Interfaces”

En esta lección hemos estudiado los siguientes contenidos:

i
11

627
PROGRAMACION
ORIENTADA A
OBJETOS
CON JAVA

628
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

PROGRAMACION ORIENTADA A OBJETOS CON JAVA


Diseño orientado a objetos

Conceptos básicos de Orientación a Objetos


A continuación vamos a analizar algunos conceptos básicos de orientación a objetos aprovechando la notación
UML que estudiaremos en detalle mas adelante.

Clase
Es una abstracción de la realidad, un elemento del presente en el dominio del problema que pasará a formar
parte de nuestro S.I. en una forma simplificada. Las características que definen a la clase son los atributos
y los métodos.

- Los atributos también son llamados campos, variables de clase o propiedades de la clase.
- Los métodos también son llamados operaciones o funciones.

i
2

629
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Objeto
Es una instancia de la clase, un caso concreto donde la clase toma valores concretos.

Los objetos pueden tener opcionalmente un nombre que los identifica, aunque en ocasiones no es necesario
indicarlo.

Interfaz
Define un contrato que deberá ser implementado por una clase (u otro elemento) y permitirá el uso de dicha
implementación sin tener que conocer el detalle de la misma.

630
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Paquete lógico
Agrupación lógica de clases, interfaces y otros elementos de Programación orientada a objetos.

EL LENGUAJE UML
UML significa Lenguaje Unificado de Modelado.

El lenguaje UML es visual, más que programar en UML se modela visualmente.

Muchos de los elementos de UML tienen su origen en la Orientación a Objetos, otros vienen de fuentes
diferentes.

Notaciones gráficas
Son los elementos visuales existentes en UML, hemos visto algunos en la sección de orientación a objetos:

i
4

631
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Otros sin embargo son específicos de UML, como:

Estereotipo
Es una cadena de texto que permite particular las características de un determinado elemento de UML.

Por ejemplo, una clase UML puede ser estereotipada, representar elementos diferentes a las clases de la
P.O.O.

i
5

632
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Aunque algunos estereotipos tienen un significado prácticamente universal, otros se pueden encontrar con
diferentes acepciones dependiendo del entorno laboral.

Un analista, diseñador o arquitecto puede crear sus propios prototipos si una determinada situación lo
aconseja.

UML reconoce la posibilidad de que un estereotipo modifique la representación visual de dicho elemento.

Relaciones
Enlaces realizados entre las notaciones gráficas con el fin de mostrar la interacción existente entre dichas
notaciones. Existen diversas notaciones

Asociación
Indica que existe una relación de uso entre los elementos vinculados con la asociación.

La relación puede tener direccionalidad indicando que elemento referencia al otro.

i
6

633
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

En ocasiones se simplifican los diagramas indicando que una asociación implica la presencia de un atributo
en la clase origen de la siguiente manera.

El avión tiene un número indeterminado de ruedas

Agregación
Es una asociación donde los elementos relacionados presentan un vínculo de todo-parte.

El uso de la agregación frente a la asociación dependerá en gran medida del caso concreto que estemos
modelando y de las características del sistema.

El avión tiene inexorablemente 2 alas, solo podremos emplear aviones en nuestro S.I. cuando las alas estén
disponibles.

i
7

634
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Composición
Es una asociación donde los elementos relacionados presentan un vinculo más fuerte que en la asociación y
agregación.

La creación de instancias de una clase compuesta implicará la creación de instancias de las otras clases
compuestas. De la misma manera la destrucción de instancias será simultánea.

Asociación versus Agregación versus Composición


Existen diferentes teorías sobre dónde usar una asociación, una agregación o una composición.

La falta de estandarización desaconseja que se haga un uso gratuito de unas u otras si no se respeta alguna
de las numerosas interpretaciones existentes y a ser posible se documente la motivación de su uso.

En caso de duda, la asociación representa tanto a la agregación como a la composición y siempre se podrá
detallar en mayor medida en fases posteriores del modelado.

Herencia
Indica que existe una relación padre-hijo entre clases, de manera que la clase hija hereda las propiedades
del padre.

El trabajador es la superclase o clase base. Empleado y autónomo son dos subclases.


8

635
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Dependencia
Indica que el elemento origen de la flecha precisa de alguna de las propiedades del elemento destino de la
flecha para poder funcionar.

Realización
El elemento origen de la flecha proporciona una implementación para el elemento destino de la flecha.

En el siguiente ejemplo vemos que la clase ConexionBBDDOracle proporciona una implementación concreta
de ConexionBBDDGenerica.

Cuando se representa una implementación entre clases e interfaces la realización se simplifica visualmente
con una flecha continua sin cabeza, lo que puede provocar confusión con una relación de asociación
bidireccional.

636
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Adornos de una relación

Los adornos aportan información adicional sobre las relaciones existentes entre diferentes elementos. El uso
de dichos adornos dependerá de la labor específica que estemos desempeñando en un momento dado.

En el siguiente ejemplo hemos añadido una cardinalidad (valor numérico) a la relación.

El avión tiene de n ruedas

Podemos también indicar un nombre a la relación.

El piloto es el comandante de un vuelo

i
10

637
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

O si necesitamos mayor detalle en la definición del papel que cada clase juega en la relación podemos usar
los roles de las clases.

El cliente alquila un coche que él mismo conducirá

DIAGRAMAS

Diagrama de casos de uso


Modela los casos de uso del sistema (requisitos) y representa las interacciones que dichas funcionalidades
deben tener con los actores vinculados a los mismos.

Los actores pueden ser tanto seres humanos como maquinas con las que nuestro sistema debe interactuar.

Diagrama de C.U. que modela parcialmente la funcionalidad de un S.I. de banca online.

i
11

638
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Diagrama de clases
El diagrama de clases modela el comportamiento de las clases de un sistema.

En un sistema orientado a objetos cada clase representa un elemento que interactúa con otros a través de
sus métodos para conseguir un comportamiento global.

La clase CuentaBanco usa a la clase Cliente para reflejar quién es el titular de la cuenta.

Diagrama de objetos
Muestra la interacción que se produce entre instancias de las clases (objetos).

Habitualmente se emplea para modelar aspectos críticos del comportamiento dinámico del sistema.

En este caso los objetos tienen nombre, pero habitualmente se omiten.

i
12

639
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Sin embargo de por sí sólo su utilidad es muy limitada. A veces se crea como base de un diagrama de secuencia
o de comunicación.

Diagrama de secuencia
Modela la interacción que se produce entre objetos de un S.I. mediante el intercambio de mensajes.

Interacción realizada por un cliente en un cajero para ver un extracto de operaciones

i
13

640
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Diagrama de colaboración (uml 1) / comunicación (uml 2)


Al igual que el diagrama de secuencia modela la interacción que se produce entre objetos de un S.I. mediante
el intercambio de mensajes.

El Diagrama de Colaboración es muy parecido al Diagrama de Secuencia, la principal diferencia es que el


Diagrama de Secuencia se centra en la temporalidad existente entre diferentes mensajes entre objetos.

El cliente emplea el cajero para obtener un extracto de sus operaciones.

Diagrama de actividades
Muestra las interacciones existentes entre diferentes acciones de un mismo proceso.

14

641
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Diagrama de estados
Muestra el ciclo de vida de un determinado elemento de software o concepto de lógica de negocio.

Diagrama de estados simple del ciclo de vida de una cuenta de banco

Entre llaves se ubica la condición de guarda de las transiciones. Cuando se cumpla dicha transición se transita
a otro estado.

i
15

642
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Diagrama de componentes
Modela los elementos de software que van a integrar nuestro sistema.

Diagrama de componentes de un S.I. para Web que emplea una aplicación flash para la presentación al
cliente final

Diagrama de despliegue
Modela los elementos de hardware que van a integrar el sistema que se está desarrollando. En ocasiones los
elementos del Diagrama de componentes se distribuyen sobre los nodos del Diagrama de Despliegue.

Diagrama de despliegue para una aplicación típica accesible desde un dispositivo móvil y un PC.

16

643
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Diagrama de estructura compuesta


Modela los vínculos estructurales existentes entre clases con mayor detalle que un diagrama de clases
convencional.

La clase Préstamo juega dos roles diferentes con dos clases diferentes

EL PROCESO UNIFICADO DE DESARROLLO

Es una metodología basada en el desarrollo iterativo del proyecto. El Proceso Unificado de desarrollo más
conocido es el RUP (Racional Unified Process)

Se distingue del proceso iterativo clásico en que incluye una nueva variante: cada fase incluye el desempeño
del trabajo en diferentes disciplinas del proyecto.

17

644
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Fases del proceso

Definición de casos de caso


La definición de casos de uso consiste en extraer, recopilar, estructurar y modularizar los requisitos del S.I.
que se debe desarrollar.

Habitualmente estos requisitos se extraen del cliente que solicita el sistema aunque en proyectos de
reingeniería los requisitos pueden extraerse en gran medida de un S.I. preexistente.

La extracción se realiza en un diagrama de casos de uso (abreviado C.U.) y los C.U. se detallarán en mayor
medida en una ficha de C.U.

La ficha de C.U. es un documento que detalla información sobre los C.U. definidos, esta información puede
variar dependiendo del proyecto pero habitualmente tiene las siguientes características:

- Id: identificador que permite referenciar de forma única a un determinado C.U.


- Nombre: nombre del C.U.
- Descripción: descripción breve del C.U.
- Flujo principal: indica la secuencia de pasos que llevan a la consecución de la funcionalidad
especificada por este C.U.
- Flujos secundarios: indican la secuencia de pasos que llevan a situaciones no deseables que se pueden
presentar al intentar ejecutar este C.U.
- Precondiciones: condiciones que se deben cumplir antes de poder ejecutar la funcionalidad
especificada en este C.U.
- Postcondiciones: condiciones que se deben cumplir al finalizar la ejecución de la funcionalidad
especificada en este C.U.

i
18

645
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Captura de requisitos de una tienda online:


Vamos a desarrollar un caso práctico desde la captura de requisitos hasta el inicio de la codificación del
sistema para ilustrar la aplicación de la metodología RUP.

En primer lugar realizaremos la captura de requisitos con ayuda de reuniones con el cliente o, en el caso de
que exista, de documentación o aplicaciones preexistentes.

Por ejemplo el cliente podría plantear los siguientes requisitos funcionales:

- Funcionalidad propia del cliente:


* Listar los artículos con su stock
* Añadir artículos al carrito de la compra
* Confirmar el carrito de la compra
* Almacenar el carrito de la compra en el sistema para confirmarlo posteriormente
* Efectuar el pago de la compra (que interactúa con una pasarela bancaria).
- Funcionalidad propia del administrador:
* Logearse en el sistema
* Gestionar artículos y stock
*- Generar informes sobre ventas
* Modificar contraseña del administrador

Un diagrama UML que incluya la funcionalidad especificada podría ser el siguiente:

19

646
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

La metodología RUP admite múltiples variantes con respecto a la introducción de requisitos:

- Por ejemplo ‘Logearse en el sistema’ se puede considerar un prerrequisito de varios casos de uso, en
vez de un caso de uso en sí mismo.

- Gestionar artículos y stock se podría dividir en dos casos de uso o dejar en un solo caso de uso que
se explota en casos de uso más detallados.

- Podemos establecer dependencias entre casos de uso y además estereotiparlas para particular las
propiedades de esa dependencia.

Una vez realizado el diagrama de C.U. para el caso práctico deberíamos elaborar la ficha de C.U. para todos
los C.U. indicados en el diagrama y para los C.U. que estén en diagramas más detallados.

En esta fase del proyecto y en las posteriores podemos elaborar otros muchos diagramas de soporte que
consideremos útiles para clarificar conceptos de negocio, como por ejemplo el ciclo de vida de un pedido.

i
20

647
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Análisis (análisis funcional)


El análisis consiste en expandir la información elaborada en la definición de los C.U. y estructurar las clases
de análisis siguiendo criterios funcionales con el fin de modelar la lógica del negocio.

Habitualmente en el análisis no se introducen conceptos específicos de una determinada arquitectura de


Software. Es decir, el análisis debería ser independiente de Java, .NET, PHP o cualquier otra tecnología.

Las clases de análisis son clases UML que han sido estereotipadas para representar un determinado elemento
del sistema. Hay tres estereotipos predefinidos:

- Boundary (frontera): establece el punto de interacción entre el actor y el interior del S.I.

- Control (control): identifica un elemento de gestión del sistema que permite el acceso a los datos
del sistema a través de fronteras.

- Entity (entidad): es un almacén persistente de información, habitualmente una BBDD o una tabla de
una BBDD.

Como se puede apreciar en la siguiente imagen, los estereotipos modifican la representación visual de las
clases de análisis (algunas herramientas no modifican dicha representación o permiten ambas
representaciones).

Modelado de análisis de las clases vinculadas al proceso de login.


De izq. a dcha. clases estereotipadas como boundary, control y entity.

i
21

648
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Análisis del caso práctico


Para nuestra tienda online, debemos detallar los C.U. obtenidos en la captura de requisitos, en este punto
ya deberíamos tener la ficha de C.U. detallada para todos los C.U. del sistema.

RUP propone que para este tipo de tarea desarrollemos un diagrama de clases de análisis y simultánea o
posteriormente un diagrama de colaboración por cada flujo de cada C.U.

Por ejemplo si desarrollamos el C.U. ‘Añadir al carrito’ el diagrama de clases de análisis seria el siguiente

Y el diagrama de colaboración para el flujo primario seria el siguiente:

i
22

649
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

A continuación realizaríamos diagramas de colaboración o de secuencia para los flujos primarios y secundarios
de todos los C.U. existentes. Muchos de los mensajes entre objetos se traducirán en métodos sobre las clases
de análisis (en el diagrama de la parte superior serían por ejemplo los mensajes 2, 3, 5 y 6).

Al seguir poblando de métodos las clases de análisis y obteniendo otras nuevas estamos definiendo el
elemento fundamental del análisis, las clases de análisis.

Diseño (análisis orgánico)


El diseño consiste en expandir la información elaborada en el análisis del sistema y generar diagramas que
representen la misma información del análisis pero detallada en mayor medida y vinculada a la arquitectura
concreta que se vaya a usar en el sistema.

i
23

650
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Diseño del caso práctico


Para el diagrama de clases de análisis que realizamos anteriormente tendremos ahora que generar diagramas
de clases de diseño, es decir diagramas de clases específicos de la arquitectura desarrollada.

Por ejemplo en este diagrama podemos apreciar cómo hemos ‘realizado’ (expandido) el GestorCompras del
análisis en un par de clases de diseño para adaptarlo a un determinado framework (Struts de Java). Podemos
apreciar también en la parte derecha del diagrama el uso de dos patrones de diseño, el DAO y el DTO.

Corresponde al diseñador poblar estas clases con métodos de manera que reflejen toda la funcionalidad
obtenida en el análisis. Podemos estereotipar algunas clases si consideramos que es pertinente para detallar
en mayor medida sus características.

24

651
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Dependiendo de la capacidad y experiencia de los análisis y diseñadores el sistema será más o menos modular,
reutilizable, mantenible, estructurado y por lo tanto, económico en el corto, medio y largo plazo.

Las decisiones de análisis y diseño que hayamos tomado afectarán a toda la vida del sistema.

Implementación
La implementación es la fase del proyecto donde se transforman en código los diagramas generados durante
las fases anteriores.

Además se pueden emplear diagramas de componentes y de despliegue para indicar los elementos de
software y hardware que van a integrar el sistema. Incluso se pueden combinar cuando el número de nodos
de hardware

En la mayoría de sistemas el mayor volumen de trabajo con UML no se encuentra en la implementación, sino
que se usan herramientas específicas de cada arquitectura (habitualmente java o .net).

Implementación del caso práctico


Existen herramientas que a partir de un diagrama de clases de diseño nos generan el esqueleto de las clases
para codificar los métodos de las mismas. Estas herramientas sin embargo no se suelen adaptar a las
necesidades concretas de cada proyecto.

Un diagrama de componentes y otro u otros de despliegue suelen ayudar en esta fase del proyecto, a veces
si el número de nodos de hardware es reducido se combinan en uno solo como es el caso de la tienda online.

i 25

652
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Resumen de la aplicación práctica de RUP


Aunque lo hemos visto en el desarrollo del caso práctico vamos a resumir los pasos principales de la
metodología RUP.

En un proyecto que siga la metodología RUP, el punto de partida son los C.U. que reflejan en detalle los
requisitos del sistema.

Cada C.U. se detallará en una ficha con sus características, una de ellas es el flujo primario. El flujo primario
se empleará para elaborar un diagrama de clases de análisis y el diagrama de comunicación o secuencia que
modele el flujo primario del C.U. en cuestión.

En teoría también deberían modelarse en diagramas de secuencia o comunicación los flujos alternativos o
secundarios, pero por restricciones de tiempo se suelen obviar muchos flujos secundarios.

i
26

653
PROGRAMACION ORIENTADA A OBJETOS CON JAVA

Una vez elaborados los diagramas de clases de análisis y de secuencia o de colaboración que el analista
considere oportunos podemos pasar al diseño, elaborando diagramas de clases de diseño que reflejarán
elementos específicos de la arquitectura seleccionada.

Los diagramas de diseño habitualmente se emplean para generar la estructura de clases con los atributos y
métodos que formarán el esqueleto del sistema que los programadores deberán codificar. Las herramientas
de modelado suelen aportar opciones para generar esos esqueletos de forma automática.

Muchas empresas disponen de métricas especificas que son variaciones de RUP o versiones simplificadas o
más complejas que varia el tipo de entregables generados.

Herramientas existentes
Para modelado con UML se pueden emplear entre otras las siguientes herramientas:

- StarUML: herramienta de software libre con soporte de UML 2.0. Los diagramas de este curso han sido
desarrollados con esta herramienta.
- Rational Rose: una herramienta desarrollada por Rational antes de que fuera comprado por IBM,
desactualizada desde 2003 pero todavía en uso en algunas empresas.
- Rational IBM Software Modeller: herramienta de IBM con soporte para UML 2.0.
- MyEclipse: versión de pago del IDE Eclipse con un plug-in para algunos diagramas de UML.

i
27

654
PROGRAMACION ORIENTADA A OBJETOS
CON JAVA – Caso práctico
Módulo: PROGRAMACION ORIENTADA A OBJETOS CON JAVA – Caso práctico
Indica en menos de 10 líneas qué módulos formarían un sistema informático empleado en un
aeropuerto. Esta aplicación debería permitir gestionar los aviones, las pistas, los despegues, la
recepción de las maletas, la carga de las mismas en el avión…, en definitiva, todos los aspectos
relativos a la gestión de un aeropuerto.

Ten en cuenta que los módulos deben estar cohesionados consigo mismos y no acoplados entre sí.

655
PROGRAMACION ORIENTADA A OBJETOS
CON JAVA – Caso práctico
Módulo: PROGRAMACION ORIENTADA A OBJETOS CON JAVA – Caso práctico

Diseña un diagrama DER que modele la estructura de BBDD de una clínica veterinaria incluyendo todos
los datos que sea pertinente almacenar.

656
 

Módulo 6:
Excepciones

   

657
EXCEPCIONES

658
ÍNDICE
EXCEPCIONES

1. Clasificación de las Excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3


2. Lanzamiento de excepciones. Cláusula throw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8
3. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14

659
EXCEPCIONES

1. Clasificación de las Excepciones


Tipos de errores en Java

Una excepción Java representa un error en tiempo de ejecución

Para la generación de excepciones crea un objeto con la descripción del error y se le envía al programa. Si
el programa no recoge la excepción se produce una parada en la ejecución del programa. El programa puede
recoger la excepción y tratarla para que no se pare.

Uso de excepciones

Una vez diseñado el programa para hacer lo previsto, hay que pasar a definir el manejo de los casos en que
se produzca un error en tiempo de ejecución. Para ello se hará uso de las excepciones.

La forma de tratar las excepciones que Java proporciona tiene un aspecto como el que sigue:

public class MiPrimeraClaseExcepcional {


public void unMetodoExcepional() throws MiPrimeraExcepcion {
//Código donde se puede producir MiPrimeraExcepción
}
...
}

Aquí indicamos que este método puede lanzar (producir) una excepción, que además se llama
MiPrimeraExcepcion.

i 3

660
EXCEPCIONES

Error en el cuerpo del método

Hasta ahora, cuando diseñamos un método para que realice una serie de operaciones y nos devuelva una
variable de un tipo determinado, estamos confiando en que nos dará siempre esa variable. Puede ocurrir, sin
embargo, que pase algo anormal en el cuerpo de ese método y se produzca un error. Si esto ocurre no
tenemos la variable que devuelve el método y nuestro programa se bloqueará.

Es aquí donde entran las excepciones, que servirán para que nosotros en todo momento tengamos control
sobre el programa. Si nos falla la variable, lo sabremos y actuaremos al respecto, pero el programa no se
bloquea, no se para.

No olvidar que las excepciones son objetos de una clase y gozan de las ventajas de tener una jerarquía.

Instancias de la clase error

No todos los errores deben ser listados al declarar un método. Las instancias de la clase Error no deben ser
capturadas.

661
EXCEPCIONES

Error: Las excepciones que deriven de la rama Error no se capturan, son tales como NoClassDefFoundError
(no se encuentra una clase), NoSuchMethodError (no se encuentra la definición de un método), y en general
son todas las que terminan con la palabra “Error” (también llamadas excepciones de la “maquina virtual”).

Exception: Dentro de la rama exception hay otras dos ramas. Las excepciones que derivan de
RunTimeException que se denominan “excepciones del sistema” dentro de estas hay 5 que veremos a
continuación, y las “de librería” que son excepciones que se encuentran en librerías Java, como por ejemplo,
IOException que se encuentra en el paquete Java.io o MalformedURLException que se encuentra en la librería
Java.net.

Excepciones del sistema

Revisa qué tipo de excepciones tenemos. Pulsa sobre cada una de ellas:

1. ArithmeticException:
Se produce cuando sucede un error de tipo aritmético, por ejemplo, cuando tratamos de dividir un número
por cero, el programa no entiende lo que es y se para.

2. NullPointerException:
Se produce cuando tratamos de acceder a una propiedad de un objeto que no existe todavía para el
programa.

Ejemplo:
String cadena=null:
int longitud=cadena.length(); //Error porque el objeto no existe aún.

3. ClasCastException:
Se produce cuando no hacemos correctamente un casting entre clases.

i
5

662
EXCEPCIONES

4. ArrayIndexOutOfBoundsException:
Se produce cuando accedemos a una posición de un array superior al número de elementos del array.

5. NegativeSizeArrayIndexException:
Se produce cuando accedemos a una posición de un array inferior al elemento cero del array, es decir, a una
posición negativa del array.

Uso práctico de excepciones 1

Estudiemos ahora cómo usar las excepciones. Para esto, recordaremos el método que definimos
anteriormente denominado unMetodoExcepcional():

Recordar método
public class MiPrimeraClaseExcepcional {
public void unMetodoExcepional() throws MiPrimeraExcepcion {
...
}
...
}
Llamar método
public void otroMetodoExcepcional() throws MiPrimeraExcection {
MiPrimeraClaseExcepcional mPCE = new MiPrimeraClaseExcepcional();
mPCE.unMetodoExcepcional();
}

i
6

663
EXCEPCIONES

Si no tratamos aquí la excepción MiPrimeraExcepcion, al menos hemos de lanzarla (indicar) a los llamadores
de nuestro método otroMetodoExcepcional() (lo hacemos mediante la sentencia throws) y hemos de hacerlo
así porque estamos llamando al método unMetodoExcepcional() que puede producir dicha excepción.

Uso práctico de excepciones 2

Si ahora quisiéramos nosotros mismos manejar la excepción lo haríamos de una forma parecida a la que sigue
(sólo la manejamos nosotros):

public void metodoResponsable() {


MiPrimeraClaseExcepcional mPCE = new MiPrimeraClaseExcepcional();
try {
mPCE.unMetodoExcepcional();
}
catch (MiprimeraExcepcion m) {
// aquí haríamos las acciones pertinentes
// si se produjera la excepción MiPrimeraExcepcion
}
}

La traducción de la sentencia try podría ser: “Intenta ejecutar el código de dentro de las llaves y si hay
excepciones lánzalas que yo las uniré a los manejadores para que se ocupen de ellas”. Generalizando lo que
hemos hecho, podríamos tener tantas cláusulas catch al final de la sentencia try como necesitemos y cada
una nos permitiría manejar una instancia de una de las clases listadas dentro de los paréntesis o de sus
subclases (recordemos que las excepciones son clases).

i
7

664
EXCEPCIONES

2. Lanzamiento de excepciones.Cláusula throw


Manejar la excepción

Para completar los casos, si quisiéramos manejar la excepción y además pasársela a aquel que llame a nuestro
método, escribiríamos:

public void metodoResponsable() throws MiprimeraExcepcion {


MiPrimeraClaseExcepcional mPCE = new MiPrimeraClaseExcepcional();
try {
mPCE.unMetodoExcepcional();
}
catch (MiPrimeraExcepcion m) {
// aquí haríamos las acciones pertinentes
// si se produjera la excepción MiPrimeraExcepcion
throw m; // relanzamos la excepción
}
}

Esto funciona debido a que las excepciones pueden anidarse. Es interesante operar de esta forma porque así,
estamos tratando para nosotros la excepción, pero además, se la pasamos a aquel que use nuestro método
para que realice sus oportunas acciones. El sistema, por sí mismo, trata todas las excepciones que no son
cogidas (tratadas desde catch), pero lo hace abortando el programa y mostrando un mensaje de error.

i
8

665
EXCEPCIONES

Lanzar excepciones si algo no funciona bien

También podemos lanzar excepciones, si en algún punto del programa detectamos que algo no funciona bien:

public class MiPrimeraClaseExcepcional {


public void unMetodoExcepional() throws MiprimeraExcepcion {
...
if (algoInusualOcurrio()) {
throw new MiPrimeraExcepcion();
// la ejecucion ya no llegaría aquí
}
}
...
}

Esta vez throw actúa de forma similar a break, salta sin ejecutar las líneas de código inmediatamente.

i
9

666
EXCEPCIONES

Construir cadenas

Las excepciones son una potente herramienta para dividir el amplio espacio de posibles errores en partes más
manejables.

Se pueden construir cadenas como las del siguiente ejemplo:

try {
algunMetodoExcepcional();
}
catch (NullPointerException n) {
// Tratamiento
}
catch (RuntimeException r) {
// Tratamiento
}
catch (IOException i) {
// Tratamiento
}
catch (Exception e) {
// Tratamiento que se realizará siempre en caso de que el código del programa no entre
por ninguno de los catch anteriores, esto funciona como un comodín, siempre al final
ponemos la clase superior (Exception) y así nos aseguramos de que siempre se ejecutara
algún catch en caso de error.
}

i
10

667
EXCEPCIONES

Listar subclases

Listar primero las subclases e ir subiendo en la jerarquía, se hace para que las clases más especificas traten
las excepciones más especificas y que las más generales sean manejadas por la parte superior de la jerarquía.

Mediante estas cadenas y aprovechando que disponemos de una jerarquía también para las excepciones,
podemos crearnos nuestro propio árbol para éstas y tratar de forma precisa cada excepción.

Falta, como no, aplicar esto, pero utilizando interfaces para el caso en el que la jerarquía típica se quede
corta. No entramos en ello de momento.

Pasos para lanzar una excepción

Para conocer los pasos para lanzar una excepción, pulsa sobre la caja.

i
11

668
EXCEPCIONES

1. Se crea el objeto del tipo excepción.

2. Con la palabra reservada throw se lanza:


class Demothrow {
static void ProcDemo() {
try { throw new NullPointerException (“Mi Error”); }
catch (NullPointerException ex) {
System.out.println (“Captura en ProcDemo”);
throw ex;
}
} // fin ProcDemo
public static void main(String [] args) {
try {ProcDemo();}
catch(NullPointerException ex) {
System.out.println(“Capturada en main”+ex);
}
} // fin main
} // fin de clase

3. Si una función no captura una excepción, la excepción viaja por la pila de llamada a funciones hasta
que una función la captura o finaliza la ejecución del programa:
main() calula() divide() // Error
try { calcula() }
catch() { . . . }
En un bloque try se pueden definir varios tipos de excepciones:
class MultiCatch {
public static void main(String [] args) {
try { int a = args.length;
int b = 42 / a; //AritmethicException
int[] c = {2, 8};
c[a] = 99; //IndexOutOfBoundsException
}
catch (AritmethicException ex) {
System.out.println (“No hay argumentos”+ex);
}
catch (IndexOutOfBoundsException ex) {
System.out.println (“Demasiado argumentos”);
}
catch (Exception ex) { // Para demás excepciones
System.out.println (“Error desconocido”+ex);
}
} // fin de main
} // fin de clase
12

669
EXCEPCIONES

Limitaciones para el programador

A la hora de sobreescribir métodos, hemos de tener en cuenta las excepciones y debemos coger (mediante
catch) las excepciones necesarias.

Ejemplo

public class MiClaseIlegal {


public String toString() {
algunMetodoExcepcional();
... // devuelve algún String
}
}

La superclase Object definió el método toString() sin cláusulas throw y nosotros debemos mantener esa
restricción. Por eso no podemos llamar a algunMetodoExcepcional() que genera errores y excepciones y
algunas de estos deben ser cogidas en su respectiva sentencia catch.

Ejemplo

public class MiClase {


public String toString() {
try {
algunMetodoExcepcional();
}
catch (IOException e) {
}
catch (MiPrimeraExcepcion m) {
}
... // devuelve algún String }
}

Hemos cogido las dos excepciones pero no hemos hecho nada con ellas, esto es legal, pero no será siempre
lo correcto. Habremos de añadir un comportamiento no trivial que hará nuestro programa más robusto.

13

670
EXCEPCIONES

3. Resumen

Has llegado al final de este recurso formativo que denominamos “Excepciones Java”
En esta lección hemos estudiado los siguientes contenidos:

i
14

671
CONTROL DE
EXCEPCIONES.
EXCEPCIONES
PERSONALIZADAS

672
ÍNDICE
CONTROL DE EXCEPCIONES. EXCEPCIONES PERSONALIZADAS

1. Utilización de los bloques try, catch y finally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3


2. La lista de throws. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8
3. Crear excepciones personalizadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10
4. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14

673
Control de Excepciones. Excepciones personalizadas

1. Utilización de los bloques try, catch y finally


Descripción genérica de excepciones: try/catch/finally

Una vez visto el manejo de excepciones de un modo práctico, repasemos la estructura try, catch y finally.

Estructura Genérica

try {
// código a ejecutarse y qué puede producir
// algún tipo de excepción
}
catch(Excepcion1 e1) {
// aquí se ejecutaría el código necesario si dentro
// de try ocurriera la excepción denominada Excepcion1
}
catch(Excepcion2 e2) {
// aquí se ejecutaría el código necesario si dentro
// de try ocurriera la excepción denominada Excepcion2
}
...
finally {
// aquí se ejecutaría SIEMPRE el código que nos
// interese, como pueda ser limpieza de variables ...
}

try: El bloque try constituye un conjunto de sentencias como otras, pero que pueden lanzar
excepciones que serán tratadas a continuación.

674
Control de Excepciones. Excepciones personalizadas

Catch: El bloque o los bloques catch, van a manejar cada uno el tipo de excepción al que hace referencia si
esta ocurre en el bloque try. Su argumento debe ser del tipo Throwable o una subclase de éste. La excepción
la cogerá la primera cláusula catch cuyo argumento será del mismo tipo que la excepción ocurrida. Puede
haber todos los bloques catch que sean necesarios, igualmente puede no haber ninguno. Por ello, podemos
deducir que no debe haber un bloque catch por cada tipo de excepción que pueda ocurrir.

La cláusula finally

Puede darse el caso que tengamos que hacer una determinada acción necesariamente. Para asegurarnos que
se va a realizar conviene crear una excepción, para ello es conveniente usar una cláusula dentro de la
sentencia try que está diseñada con este propósito: la cláusula finally.

algunaClaseArchivo f = new algunaClaseArchivo();


if (f.open("/a/file/name/path")) { // instrucción para abrir un fichero try {
algunMetodoExcepcional();
}
finally {
f.close();
// instrucción para cerrar un fichero
}
}

La cláusula finally 2

Lo que hay dentro de la cláusula finally se va a ejecutar siempre pase lo que pase. De este modo lo que
hacemos es poner la instrucción de cierre del fichero dentro de una claúsula finally, así suceda lo que suceda,
tendremos la seguridad de que el fichero se va a cerrar.

i
4

675
Control de Excepciones. Excepciones personalizadas

Esta forma de trabajar se comporta mejor que la siguiente:

algunaClaseArchivo f = new algunaClaseArchivo();


if (f.open("/a/file/name/path")) {
try {
algunMetodoExcepcional();
}
catch (Throwable t) {
f.close();
throw t;
}
}

Características de la cláusula finally

Para conocer las características de la cláusula finally, pulsa sobre cada una de las flechas:

- La cláusula finally se usa generalmente para la limpieza del sistema (cierre de ficheros, liberación
de recursos, etc.).

- Una propiedad importante del bloque finally es que siempre se va a ejecutar aunque sólo se ejecutase
una porción de try y se saltase con un break o return.

- El orden establecido de ejecución de la estructura completa es: ejecutar try y si ocurre alguna
excepción se salta a los catch. Una solución es que se coja aquí la excepción y se trate, otra es
pasársela para que la coja el nivel superior subiendo en la jerarquía. Después de esto siempre se
ejecutara el bloque finally.

- Una utilidad de la pareja try/finally, y saliéndonos de las excepciones, está en usar try como etiqueta
para un conjunto de sentencias y finally como bloque de liberación de recursos después de que éstas
se ejecutaran siempre, haya o no dentro del try breaks continues o returns.

i
5

676
Control de Excepciones. Excepciones personalizadas

Repaso

Para asentar los conocimientos, repasemos algunos términos así como su significado:

Throwable: Es una clase que representa un objeto que se puede lanzar.

Error: Causados al enlazar dinámicamente el programa, son de bajo nivel para que el programador a veces
pueda manejarlos.

Exception: Las excepciones que no son RuntimeExceptions son condiciones que deben ser manejadas por
nuestro código. Las Excepciones son errores de usuario:

i
6

677
Control de Excepciones. Excepciones personalizadas

IOException (operaciones de entrada / salida)

RunTimeException (excepciones más comunes de Java)

RuntimeExceptions: Generadas durante la ejecución del código Java, reflejan una condición que nosotros
tendremos que manejar explícitamente, otras veces y más a menudo reflejan un error de codificación y
muestran un mensaje de error impreso. Errores derivados de RunTimeException:

AritmethicException > Error aritmético, división por 0 o dé negativo.


ClassCastException > Convertir una ref. base a una derivada.
NullPointerException > Indirecionada una ref. nula.
IndexOutOfBoundsException > Nos salimos de los límites del array.
NegativeArraySizeException > Se produce un índice negativo.

i
7

678
Control de Excepciones. Excepciones personalizadas

2. La lista de throws

Si un método es capaz de provocar una excepción que no cubre, deberá especificar este comportamiento en
el prototipo para que los métodos que le llaman puedan protegerse frente a la posible excepción.

<tipo Retorno> <Nombre Método> (<Lista Parámetro>)


throws <Lista Throws>

Hay que poner la lista de throws para todas las excepciones derivadas de Exception excepto las
derivadas de RunTimeException.

También hay que ponerlo para Throwable pero no para Error y para sus derivadas.

class ThrowsDemo {
static void Proc1() throws IOException {
System.out.println (“Algo va mal.”);
throw new IOException (“Demo”);
}
public static void main (String [] args) {
Proc1();
}
}

i
8

679
Control de Excepciones. Excepciones personalizadas

Enlace Dinámico

Cuando se redefine un método las excepciones que lance el método redefinido tienen que ser como máximo
las excepciones de la base (Enlace Dinámico).

- Si en la derivada se lanza una excepción no prevista en la base se va a producir un error.

- Se pueden quitar excepciones de la lista.

- Los constructores también pueden llevar lista de throws y en caso de que se produzca la excepción
en el constructor, el objeto se crea pero a la referencia no se asigna el objeto, con lo cual, el Sistema
de Recogida de Java liberará la memoria del objeto creado.

i
9

680
Control de Excepciones. Excepciones personalizadas

3. Crear excepciones personalizadas


Crear tipo de excepciones personalizadas

Se crearán derivadas de Exception para los errores. Será bueno crear dentro de la derivada el constructor y
el método toString.

Ejemplo

class ExcepcPersonal extends Exception { //Deriva de Exception.


private int valor;
ExcepcPersonal (int valor) { this.valor = valor; }
String toString() {
return “El valor “+valor” es demasiado grande.”;
}
} // fin de clase
public class ExcepcionDemo {
static void contar (int a) throws ExcepcPersonal {
System.out.println (“Llamada contar con valor “+a);
if (a > 10) throw new ExcepcPersonal (a);
System.out.println (“Salida normal “+a);
}
public static void main (String [] args) {
try { contar(1);
contar(20);
}
catch(ExcepcPersonal ex) {
System.out.println(“Excepción capturada “+a);
}
}
} // Fin de clase.

i
10

681
Control de Excepciones. Excepciones personalizadas

Ventajas

La ventaja del uso de excepciones frente al manejo tradicional de errores, es que el manejo de errores en
el uso tradicional estaba dentro de la lógica del problema mientras que con el tratamiento de excepciones
existe una separación clara entre el manejo de la misma y la lógica del problema.

Manejo tradicional

int leerfichero (const *char Nombrefichero) {


int CodError = 0;
FILE fichero;
CodError = Openfile (Nombrefichero,&hfichero);
if (CodError == 0) {
int longitud;
CodError = Getfilelength(hfichero,&longitud);
if (CodError == 0) {
....
Algoritmo del problema
....
}
}
return CodError;
}

i
11

682
Control de Excepciones. Excepciones personalizadas

Manejo de e Excepciones

static void leerfichero (String nombrefichero) throw IOException {


try {
File f = new File();
f.openFile(nombrefichero);
int longitud = f.getFileLength();
....
Algoritmo del problema
....
}

catch(FileOPenFailedException ex) {
System.out.println (“No existe el fichero”);
}

catch(DeterminationFailedException ex) {
System.out.println (“No se sabe la longitud”);
}
}

El error se propaga automáticamente por la pila de llamadas a función. No hace falta, como en el método
tradicional, retornar ningún código de error. Se permite dividir los errores en categorías utilizando la
herencia.

i
12

683
Control de Excepciones. Excepciones personalizadas

Listado con algunas de las excepciones más usadas en Java.

AclNotFoundException InterruptedException ProtocolException


ActivationException InterruptedIOException RefreshFailedException
AlreadyBoundException IntrospectionException RemarshalException
ApplicationException InvalidMidiDataException RemoteException
ArrayOutOfBoundsException InvalidPreferencesFormatException RuntimeException
AWTException InvocationTargetException SAXException
BackingStoreException IOException ServerNotActiveException
BadLocationException LastOwnerException SocketException
BatchUpdateException LineUnavailableException SQLException SQLEXCEPTION
CertificateException MalformedURLException SQLWarning
ChangedCharSetException MidiUnavailableException SSLException
CharacterCodingException MimeTypeParseException SyncFailedException
CharConversionException NamingException TooManyListenersException
ClassNotFoundException NegativeArraySizeException TransformerException
CloneNotSupportedException NoninvertibleTransformException UnknownHostException
ClosedChannelException NoSuchElement UnknownServiceException
DataFormatException NoSuchFieldException UnsupportedAudioFileException
DestroyFailedException NoSuchMethodException UnsupportedCallbackException
EOFException NotBoundException UnsupportedEncodingException
ExpandVetoException NotOwnerException UnsupportedFlavorException
FileLockInterruptionException NumberFormatException UnsupportedLookAndFeelException
FileNotFoundException ObjectStreamException UnsupportedOperationException
FontFormatException ParseException URISyntaxException
GeneralSecurityException ParserConfigurationException UserException
GSSException PrinterException UTFDataFormatException
IIOException PrintException XAException
IllegalAccessException PrivilegedActionException ZipException
InstantiationException PropertyVetoException

i
13

684
Control de Excepciones. Excepciones personalizadas

3. Resumen

Has llegado al final de este recurso formativo que denominamos “Control de Excepciones. Excepciones
personalizadas”

En esta lección hemos estudiado los siguientes contenidos:

i
14

685
EXCEPCIONES – Caso práctico

Módulo: EXCEPCIONES – Caso práctico


Realiza un programa Java que provoque una excepción de tipo NullPointerException.

Tendrás que ir comprobando que el código que está por debajo de la línea que provoca la excepción
no se ejecuta. Tendrás que incorporar una cláusula finally para comprobar que siempre se ejecuta.

686
EXCEPCIONES – Caso práctico

Módulo: EXCEPCIONES – Caso práctico


Realiza un programa Java que cree un método llamado metodo1(), en el cual se lance una excepción
de forma “manual”. Dicha excepción tendrá que ser capturada en el método y además será lanzada
por la pila de funciones para que llegue hasta el método main (), donde también será capturada para
evitar que dicha excepción provoque la parada del programa.

687
 

Módulo 7:
Aplicaciones basadas en
entorno gráfico

   

688
APLICACIONES
BASADAS EN
ENTORNO
GRÁFICO
Applets

689
ÍNDICE
APLICACIONES BASADAS EN ENTORNO GRÁFICO

1. Características de un Applet. Ciclo de vida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3


2. Inclusión de un Applet en una pagina web. Paso de parámetros . . . . . . . . . . . . . . . . . . . . . . .8
3. Ejecutar Applets. La clase Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15
4. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .28

690
APLICACIONES BASADAS EN ENTORNO GRÁFICO

1. Características de un Applet. Ciclo de vida


Objetivos

1. Conocer qué es un Applet y cómo se crea.


2. Reconocer la inclusión de un Applet en una página web.
3. La clase Graphics: texto, fuente y color.

Presentación del Applet en Java

Lo primero que hay que hacer es diferenciar una aplicación de un Applet. Las aplicaciones Java funcionan
por sí solas usando el interprete java.exe. Sin embargo, los Applets Java deben ejecutarse desde un browser
(un navegador) del WWW. Los Applets son llamados desde documentos HTML en el navegador.

Debido a que los Applets viajan a todas partes, pudiendo portar virus que podrían dañar los sistemas de
archivos de ordenadores clientes, la JVM define sobre los Applets algunas restricciones de seguridad
(SANDBOX SECURITY MODEL).

Los Applets no pueden leer o escribir sobre el sistema de ficheros,


excepto en directorios específicos.

No pueden comunicarse con otro servidor que no sea el que guarda el


Applet. Esto a veces se puede configurar desde el browser.

Los Applets no pueden ejecutar programas del sistema de lectura.

Los Applets no pueden cargar programas nativos de la plataforma local.

i
3

691
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Creación de Applet

Para crear un Applet hemos de crear una subclase de la clase Applet que está dentro del paquete java.applet.

La sintaxis es:

import java.applet.Applet;
public class nombreClase extends Applet {
...
}

La clase original debe ser pública.

Actividades del Applet

Para comenzar a trabajar con Applets, se necesita algo más que el main() usado en las aplicaciones. Un
Applet necesita hacer algunas actividades asociadas a eventos importantes en el ciclo de vida del Applet y
que están directamente relacionados con el funcionamiento del browser. Así, cada actividad tiene asociado
su método.

i
4

692
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Los principales métodos a tener en cuenta son:

1.- Inicialización:

Nada mas el Applet se carga. Entre lo que se puede hacer aquí hay que destacar:

a. Crear objetos que necesitemos.


b. Inicializar valores.
c. Cargar imágenes.
d. Cargar fuentes.

El método a sobreescribir (HOTPOT al pulsar aparece descripción inferior) es:

public void init() {


...
}

2.- Arranque:

Ocurre después de inicializar o después de una parada previa. Este proceso puede ocurrir muchas veces
durante la vida de un Applet.

El método a sobreescribir (HOTPOT al pulsar aparece descripción inferior) es:

public void start() {


...
}

i
5

693
APLICACIONES BASADAS EN ENTORNO GRÁFICO

3.- Parada:

Ocurre cuando el usuario abandona la página que incluye este Applet o cuando llamamos nosotros a stop():

public void stop() {


...
}

4.- Destrucción:

Sirve para limpiar la memoria antes de abandónarla desde el navegador. Normalmente no sobreescribiremos
este método a menos que queramos liberar recursos específicos.

La diferencia entre destroy() y finalize() está en que finalize() es mas genérico y sirve para un objeto
cualquiera mientras que destroy() es propia del Applet.

El método a sobreescribir (HOTPOT al pulsar aparece descripción inferior) es:

public void destroy() {


...
}

i
6

694
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Métodos del Applet

Otro de los principales métodos es el método paint().

Define cómo un Applet dibuja algo en la pantalla. Este proceso puede ocurrir cientos de veces en la vida del
Applet.

El método a sobreescribir es:

public void paint(Graphics g) {


...
}

Dentro del código de nuestra Applet hemos de incluir: import java.awt.Graphics;

El método paint (Gaphics g) recibe un objeto g de la clase Graphics. Este objeto se denomina contexto gráfico
y se va a utilizar obligatoriamente siempre que queramos dibujar algo dentro del paint.

Ejemplo:

public void paint(Graphics g)


{

g.drawString (“Hola desde java”, 10,10);


}

En este ejemplo dibujamos un String (Hola desde java) en las coordenadas x=10 y=10 dentro del Applet.
(Después se verán los métodos más importantes para dibujar en el Applet).

i 7

695
APLICACIONES BASADAS EN ENTORNO GRÁFICO

2. Inclusión de un Applet en una pagina web. Paso de parámetros


La etiqueta <APPLET>

Para incluir un Applet en una página web hay una etiqueta especifica; la etiqueta <APPLET>.

Dentro del cuerpo de nuestra pagina web y allí donde nos interese, pondríamos el Applet como:

<APPLET CODE="NombreApplet.class" WIDTH=200 HEIGHT=60>

Texto Alternativo

</APPLET>

- Detrás de la palabra CODE se pone entre comillas el nombre de la clase Applet que queremos. De este
modo suponemos que el Applet (.class) se encuentra en el directorio donde está el documento HTML.
En el nombre hay que incluir la extensión .class.

- El texto alternativo sirve para sustituir al Applet si el navegador no entiende la etiqueta <APPLET>.
Es interesante hacer uso de esta opción para usuarios de nuestros Applets que no dispongan de un
browser lo suficiente potente.

- WIDTH y HEIGHT serían respectivamente el ancho y el alto del applet en píxeles.

i
8

696
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Atributos de la etiqueta <APPLET>

La etiqueta APPLET tiene varios atributos que se colocarían dentro de la misma etiqueta <APPLET .....
atributos> </APPLET>.

Los atributos son:

ALIGN
Define cómo debe alinearse el Applet. Puede tener 9 valores.
Para alinear en horizontal:

ALIGN=LEFT
Sitúa el Applet al margen izquierdo de la pagina web y todo el texto que sigue a la derecha del Applet.

ALIGN=RIGHT
Sitúa el Applet al margen derecho de la pagina web y todo el texto que sigue a la izquierda del Applet.

Si queremos que el texto siga debajo usaremos la etiqueta <BR> o su familia <BR CLEAR=opcion>, donde
opción puede ser LEFT, RIGHT o ALL.

i
9

697
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Para alinear en vertical usaremos:

ALIGN=TEXTTOP
Alinea la parte superior del Applet con la parte superior del texto en línea.

ALIGN=TOP
Alinea la parte superior del Applet con la parte superior del texto/imagen en línea.

ALIGN=ABSMIDDLE
Alinea el centro del Applet con el centro del texto/imagen en línea.

ALIGN=MIDDLE
Alinea el centro del Applet con la base del texto en línea.

ALIGN=BASELINE
Alinea la parte inferior del Applet con la base del texto en línea.

ALIGN=BOTTOM
Equivale a ALIGN=BASELINE.

ALIGN=ABSBOTTOM
Alinea la parte inferior del Applet con la parte más baja del texto/imagen/Applet en línea.

HSPACE y VSPACE
HSPACE Espacio horizontal en píxeles entre un Applet y el texto adjunto. Es el valor que deja tanto a izquierda
como a derecha.

VSPACE Espacio vertical en píxeles entre un Applet y el texto adjunto. Es el valor que deja tanto arriba como
abajo.

i
10

698
APLICACIONES BASADAS EN ENTORNO GRÁFICO

En definitiva, es como si la porción ocupada por el Applet fuera:

Anchura: HSPACE+WIDTH+HSPACE
Altura: VSPACE+HEIGHT+VSPACE
CODE y CODEBASE
CODE sirve para indicar la clase del Applet si ésta está en el mismo directorio que el archivo HTML en uso.
CODEBASE es similar, pero dando la URL de donde se encuentra el Applet, bien absoluta o bien relativa, al
archivo HTML actual. Es decir, haríamos:

<APPLET CODE="nombreClase.class" CODEBASE="clases"


WIDTH=100 HEIGHT=100> Java Applet Here </APPLET>

NAME y ALT

NAME sirve para nombrar el Applet en caso de tener varios y tener que trabajar con ellos.
ALT se utiliza opcionalmente para indicar un texto alternativo por si no se carga el Applet (es lo mismo que
el texto sustitutivo antes comentado).

La etiqueta <EMBED>

Actualmente los únicos archivos ejecutables embebidos en documentos HTML son los Applets de Java y los
controles Actives de Microsoft. Debido a que pronto surgirán nuevos ejecutables en nuevos lenguajes de
programación, éstos para estar embebidos en los HTML tendrían una nueva etiqueta al igual que Java tiene
<APPLET>.

Para unificar criterios se define una etiqueta genérica denominada <EMBED> para representar a cualquier
recurso que pueda ser cargado dentro del documento HTML.

i
11

699
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Ejemplo:

<APPLET CODE="nombreClase.class" CODEBASE="clases"

WIDTH=100 HEIGHT=100> Java Applet </APPLET>

Utilizando la etiqueta <EMBED> escribiríamos:

<EMBED SCR="clases/nombreClase.class"

WIDTH=100 HEIGHT=100> Java Applet </EMBED

La etiqueta <EMBED> hereda todas las propiedades que hasta ahora tenia la etiqueta <APPLET> y por ello
tiene la misma sintaxis y los mismos atributos que ésta. Sólo cambia que los atributos CODE y CODEBASE se
unen en un único atributo SCR.

Pasando parámetros a Applets

A los Applets también se les pueden pasar parámetros, para ello es necesario:

1. Una etiqueta especial en el archivo HTML.

2. Código en nuestro Applet para tratar estos parámetros.

i
12

700
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Los parámetros en un Applet van en dos partes: un nombre y su valor. La etiqueta especial del lenguaje HTML
es <PARAM>.

Su uso es:

<APPLET CODE="nombreClase" WIDTH=100 HEIGHT=100>


<PARAM NAME=”nombre” VALUE="Luis">
<PARAM NAME=”ciudad” VALUE="Madrid">
...

</APPLET>

Pasando parámetros a Applets en su inicialización

Los parámetros se pasan al Applet en su inicialización en el método init() y accederemos al valor de los
parámetros pasados al applet dentro del programa a través del método getParameter().

Este método requiere un argumento que es un String representando el nombre del parámetro y devuelve el
valor del mismo que será otro String.

Si no nos interesara un String, haríamos una conversión de tipo. Así en nuestro caso, en init(), para coger los
parámetros anteriores se haría:

public void init() {


String nombre = getParameter("nombre");
String ciudad = getParameter("ciudad");
...
}

i
13

701
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Si el parámetro no está especificado

Hemos de tener presente que el lenguaje es case-sensitive. Si el parámetro que esperamos no está
especificado en el fichero HTML, el método getParameter() devuelve null, por ello es interesante y ante una
respuesta null, que nuestro programa utilice un valor por defecto:

if (nombre == null) {
nombre = "Luis";
}

Si por ejemplo queremos hacer una conversión de String a entero:

int tamaño;
String s = getParameter("tamaño");
if (s == null) {
tamaño = 12; // valor por defecto
}
else { tamaño = Integer.parseInt(s); }

i
14

702
APLICACIONES BASADAS EN ENTORNO GRÁFICO

3. Ejecutar Applets. La clase Graphics


Desarrollando y ejecutando un Applet

Para desarrollar y ejecutar un Applet primeramente realizamos el fichero Java con el código del Applet.

Después de construir el fichero .java se compila como siempre con javac: C:> javac MiApplet.java.

Luego, construimos el archivo MiApplet.htm e insertamos la clase (fichero.class) en el atributo code.

Ejemplo

import java.awt.*;
public class MiApplet extends Applet
{
public void init( )
{
setBackground (Color.red);//pone el fondo del applet en rojo
}
public void paint(Graphics g)
{
g.drawString(“Hola desde java...”,20,20); // Escribimos en el applet
}
}

i
15

703
APLICACIONES BASADAS EN ENTORNO GRÁFICO

MiApplet.htm:

<html>
<body>
<applet code="MiApplet.class" width="200" height="200">
</applet>
</body>
</html>

Por último abrimos el Internet Explorer (browser) y abrimos la página MiApplet.htm con el resultado final.

Al cerrar este cuadro de texto, aparece con animación la flecha y la segunda imagen. Hot pot a esta segunda
imagen, aparece lo siguiente:

También es posible poder visualizar el Applet sin un navegador, con la ayuda del appletviewer la herramienta
de visualización de Applets incluida en el JDK.

Lo haríamos de la siguiente forma: C:>appletviewer MiApplet.htm

i 16

704
APLICACIONES BASADAS EN ENTORNO GRÁFICO

La clase Graphics

Para dibujar algo en nuestro Applet, no tenemos que crear siempre un objeto de esta clase, sino que vamos
a hacer uso del objeto Graphics de la función paint(), y dibujando sobre este objeto, el resultado aparecerá
en nuestro Applet.

Este objeto es pasado desde el navegador al propio Applet

Para hacer uso de la clase Graphics en nuestro Applet debemos incluir, al principio de nuestro Applet, como
ya dijimos, el paquete que contiene a esta clase:

import java.awt.Graphics;

El origen de coordenadas del sistema de gráficos tiene su origen (0,0) en la esquina superior izquierda.

- Los valores positivos crecen hacia abajo y hacia la derecha.

- Los píxeles tienen asociados valores enteros, nunca fraccionarios.

i
17

705
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Dibujar líneas

Para dibujar líneas basta usar el método drawLine(). Se le pasan 4 argumentos, las coordenadas del punto
origen x1, y1 y las del punto destino x2 e y2.

Ejemplo

public void paint(Graphics g) {


g.drawLine(x1,y1,x2,y2);
...
}

Existe la posibilidad de dibujar tres tipos de rectángulos. Para cada una de estas formas, disponemos de dos
métodos, que lo dibuja y otro que lo dibuja y rellena. Los parámetros que se le pasan a estos métodos son
las couno ordenadas (x,y) de la esquina superior izquierda, la anchura (w) y la altura (h).

- Rectángulos planos
- Rectángulos redondeados
- Rectángulos tridimensionales

i
18

706
APLICACIONES BASADAS EN ENTORNO GRÁFICO

i
19

707
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Dibujar un polígono

Para dibujar un polígono necesitamos de un set de puntos (x,y). El método dibuja líneas de punto a punto
siguiendo el orden dado.

Como ocurría en los rectángulos, podemos dibujar y también rellenar:

drawPolygon();
fillPolygon();

El método drawPolygon() no cierra el polígono, así si queremos que se cierre hemos de incluir el primer
punto como último punto también. El método fillPolygon() sí une el primer punto con el ultimo.

Los argumentos se le pueden pasar de dos formas dado que tenemos el método sobrecargado:

a. Tres argumentos: array con las coordenadas x, array con las coordenadas y, valor entero con el
numero de puntos totales.
b. Un argumento: un objeto polígono, perteneciente a la clase Polygon.

Un objeto polígono se puede crear con la directiva new:

Polygon poli = new Polygon();


Polygon poli = new Polygon(vectorx,vectory,numPuntos);

y podemos añadirle puntos al polígono:

poli.addPoint(xNueva,yNueva);

i
20

708
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Dibujar elipses y círculos

Para dibujar elipses y círculos, los parámetros que se le pasan vienen a ser los mismos que para dibujar
rectángulos planos:

drawOval(x,y,ejehoriz,ejevert);
fillOval(x,y,ejehoriz,ejevert);

Se dibuja el óvalo que está circunscrito en el rectángulo que hemos definido.

Dibujar Arcos

Para dibujar arcos utilizaremos la siguiente función:

drawArc(x,y,w,h,ang,grad);
fillArc(x,y,w,h,ang,grad);

El método fillArc() rellena como si el arco se tratara de una porción de una tarta. Para contar los grados,
debemos tomar una circunferencia de referencia y situar el valor 0 donde un reloj marca las 3. Los grados
aumentan en sentido contrario a las agujas del reloj.

i
21

709
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Ejemplo

import java.applet.Applet;
import java.awt.*;
public class MiApplet extends Applet
{
public void init( )
{
setBackground (Color.blue);//pone el fondo del applet en naranja
}
public void paint(Graphics g)
{
g.setColor(Color.orange);//rellenamos d ecolr verde el rectángulo
g.fillArc(20,20,80,50,0,90); // Escribimos en el applet
}
}

i
22

710
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Gráficos

Finalmente y en relación con los gráficos, es posible copiar una porción de un gráfico o borrarlo.
Los métodos son:

copyArea(x,y,w,h,distx,disty);
clearRect(x,y,w,h);

Donde x,y,w,h son los parámetros del área rectangular y donde distx y disty son los movimientos en x e y hacia
donde vamos a copiar el área dada. Es decir, las nuevas coordenadas de la esquina superior izquierda del
rectángulo son:

xnueva = x + distx
ynueva = y + disty

El método clearRect() dibuja un rectángulo con el color de fondo. Si queremos borrar el Applet completo
podemos hacer uso de la función size() de la siguiente forma:

g.clearRect(0,0,size().width,size().height); Devuelve el ancho del Applet


size().width: Devuelve el alto del Applet
size().height:

i
23

711
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Texto y fuentes

Un objeto fuente se caracteriza por su nombre, su estilo y su número de puntos.

- Fuentes: "TimesRoman", "Courier", "Helvetica", ...


- Estilos: Font.PLAIN, Font.BOLD, Font.ITALIC, ...
- Tamaño: 12, 24, 36, ...

Los estilos se pueden combinar y crear un nuevo estilo:

Font.BOLD + Font.ITALIC Texto en negrita y cursiva

Para usar una fuente debemos cargar el paquete: import java.awt.Font;

Para asignar la fuente al Applet usamos el método de la clase Graphics setFont() que recibe un objeto de tipo
Font.

import java.awt.Font;
...
...
public void paint(Graphics g)
{
Font f=new Font(“Arial”,Font.BOLD,25);
g.setFont(f); // Para asignar la fuente al Applet
g.drawString(“Hola desde java”,20,20);
}
}

24

712
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Caracteres y Cadenas

Para dibujar caracteres y cadenas usaremos los métodos:

drawChars();
drawString();

Los dos valores numéricos “x” e “y” indican la posición donde comienza a dibujarse la cadena de caracteres.

El método drawChars funciona análogamente, pero se la pasa un array de caracteres. Tiene 5 argumentos:

g.drawChars(array,intFirst,intLast,x,y);

Los nuevos valores intFirst e intLast indican el primer y el último elemento del array que se va a dibujar.

- Existen una serie de métodos que nos proporcionan información sobre las fuentes

- Existe otra clase denominada FontMetrics que da información más especifica sobre una fuente. Para
crear un objeto de este tipo haremos:

Font f = new Font("TimesRoman", Font.BOLD, 24);


FontMetrics fmetrics = getFontMetrics(f);
g.setFont(f);

25

713
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Ejemplo

public void paint(Graphics g) {


Font f = new Font("TimesRoman", Font.BOLD, 24);
g.setFont(f);
g.drawString("Esta es una fuente grande. ",x,y);
...
}

Color

Usando la clase Color podemos escribir y dibujar en varios colores.


Para eso crearemos una instancia de la clase Color.

Esta clase define ciertos colores almacenados en variables pero si


queremos otros colores de la paleta menos populares podemos hacerlo
igualmente. Los colores más populares son:

Si queremos cualquier otro color o de forma mas general haremos:

Color c = new Color(R,G,B); Los valores de R, G y B varían entre 0 y 255.

i
26

714
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Método de la clase color

Para dibujar en un cierto color, en el método paint(), por ejemplo, haremos referencia a éste como sigue:

g.setColot(Color.green);
g.setColor(c);

Además podemos fijar los colores del fondo y del plano principal (texto e imágenes) utilizando los métodos:

setBackground(Color.white);
setForeground(Color.black);

Además de configurar los colores, podemos leer sus valores:

getColor(); Devuelve el color


getBackground(); Devuelve el color de fondo
getForeground(); Devuelve el color del primer plano

i
27

715
APLICACIONES BASADAS EN ENTORNO GRÁFICO

4. Resumen

Has llegado al final de este recurso formativo que denominamos “Applets”


En esta lección hemos estudiado los siguientes contenidos:

i
28

716
APLICACIONES
BASADAS EN
ENTORNO
GRÁFICO

717
APLICACIONES BASADAS EN ENTORNO GRÁFICO

MÓDULO 7. APLICACIONES BASADAS EN ENTORNO GRÁFICO

Más sobre Applets.Interfaz AppletContext. Java Plugg-Ins

Son programas que se utilizan cuando la lógica del problema que hay que resolver es demasiado complicada
para realizarla con HTML o JavaScript.

Estos programas, por la seguridad que tiene la Java Virtual Machina (Máquina Virtual de Java), no dejan
acceder a la máquina del cliente. El cliente con los applets está protegido.

Hay que tener en cuenta que los applets ralentizan la ejecución de una página Web ya que cuando el
navegador se encuentra con un applet entonces arranca la JVM. Los navegadores no arrancan la JVM hasta
que lo necesitan.

Los applets son ficheros .class que se colocan en el servidor Web y se ejecutan cuando lo pide el cliente.

No es la única tecnología que existe, se encuentran otras como la ActiveX. Son programas que se ejecutan
bajo el sistema operativo Windows. Son bastantes rápidas, pero la seguridad es bastante mala.

Por defecto el Applet es UNTRUSTED esto quiere decir que no está certificado y no puede entrar en las
máquina cliente donde se ejecuta. Cuando es TRUSTED, es decir certificado, si podrá acceder a la máquina
cliente.

Para crear un applet por el usuario como requisito imprescindible es que herede de la clase Applet.

i
2

718
APLICACIONES BASADAS EN ENTORNO GRÁFICO

También habrá que importar los paquetes applet y awt:

import java.applet.*;
import java.awt.*;

Para introducir el applet en una página HTML se tiene el marcador <APPLET>:

<APPLET code=”nombre.class”
width=”150”
height=”25”>
</APPLET>

import java.applet.*;
import java.awt.*;

public class AppletMinimo extends Applet {


public void paint (Graphics g) {
g.setColor(Color.red);
g.setFont(new Font (“Arial”,Font.ITALIC,20));
g.drawString(“Hola Mundo de JAVA otra vez”,20,20);
}
}

i
3

719
APLICACIONES BASADAS EN ENTORNO GRÁFICO

<HTML>
<HEAD>
<TITTLE> Applet Mínimo </TITTLE>
</HEAD>
<BODY>
A continuación va el Applet: <BR>
<APPLET code=”AppletMinimo.class”
width=”300”
height=”25”>
</APPLET>
</BODY>
</HTML>

Marcador <APPLET>

Formato del marcador Applet:

<APPLET
[codebase=URLBaseCodigo]
[code=FicheroApplet]
[archive=FicheroJava]
[alt=TextoAlternativo]
[name=NombreInstanciaApplet]
height=pixels
width=pixels
[align=”left | center | right | top | middle | bottom”]
[vspace=pixels]
[hspace=pixels]
[<PARAM name=NombreParametro1 value=NombreValor1>]

i
4

720
APLICACIONES BASADAS EN ENTORNO GRÁFICO

[<PARAM name=NombreParametro2 value=NombreValor2>]


...
[HTML que se visualiza en ausencia de Java]>
</APPLET>

codebase: es donde está el directorio de la URL, el directorio no tiene que coincidir con el del
fichero HTML.
code: fichero .class.
archive: fichero comprimido (.jar) donde se introducen varios ficheros .class del applet en el
caso del que el applet tenga más de un fichero.
alt: texto alternativo.
name: nombre del applet, sirve para la comunicación entre applets.
width, height: tamaño de la ventana de ejecución del applet medido en pixels.
align: alineación del applet sólo puede tomar uno de los valores referenciados
anteriormente.
vspace, hspace: indica el margen vertical y el margen horizontal respectivamente.
<PARM>: sirve para pasar parámetros desde la página HTML al applet.
HTML: sive para el caso en que el navegador no entiende Java.

Ejemplo del pase de parámetros:

En la página HTML:

<APPLET code=”AppletPrueba.class height=”200” width=”200”>


<PARAM name=”usuario” value=”Pedro”>
<PARAM name=”tamano” value=”200”>
<PARAM name=”velocidad” value=”3.5”>
</APPLET>

i
5

721
APLICACIONES BASADAS EN ENTORNO GRÁFICO

En el Applet:

String <Applet>.getParameter(String name)

String usuario = this.getParameter(”usuario”)


// retorna en usuario el valor “Pedro”.

int tamano = Integer.parseInt(this.getParameter(“tamaño”);


// retorna en tamanoo el valor 200.

float velocidad =
(new Float(getParameter(“velocidad”)).floatValue();
// retorna en velocidad el valor 3.5.

URL <Applet>.getDocumentBase()
Devuelve la página donde está en el applet

URL <Applet>.getCodeBase()
Devuelve el directorio donde está situado el applet.
Constructor de URL: URL(String url)

AppletContext: es el objeto que contiene las características del browser donde se está ejecutando el applet,
AppletContext es un interface.

Applet <AppletContext>.getApplet(String name)


Obtiene una referencia a otro applet incluido en la página Web.

Applet <AppletContext>.getAppletContext()
Obtiene el AppletContext

i
6

722
APLICACIONES BASADAS EN ENTORNO GRÁFICO

PAGINA HTML

Enumeration <AppletContext>.getApplets()
Devuelve todos los applets de una página Web.

void <AppletContext>.showStatus(String msg)


Da un mensaje en la barra de estado incluido en el parámetro msg.

void <AppletContext>.showDocument(URL url)


Para dar un salto a otro documento Web.

i
7

723
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Técnicas de depuración de Applets

- Con el método:

void <AppletContext>.ShowStatus(String msg)

- Utilizando la consola de depuración del browser.

- Utilizando el appletviewer del JDK.

Ciclo de vida del Applet

El applet se puede controlar en el momento en que se está ejecutando a partir de una serie de métodos:

public class Applet {


public void init() {...}
public void start() {...}
public void paint(Graphics g) { . . . }
public void stop() {...}
public void destroy() {...}
}

init: se ejecuta en el momento en el que el applet se ha ejecutado en memoria.


start: se ejecuta cuando anteriormente se ha ejecutado un stop. Se vuelve al applet..
paint: pinta el applet
stop: se ejecuta cuando se sale de la página o cuando se minimiza.
destroy: se ejecuta cuando el navegador se cierre que es cuando la página se descarga de memoria.

i
8

724
APLICACIONES BASADAS EN ENTORNO GRÁFICO

<HTML>
<HEAD>
<TITTLE> Applet Estado </TITTLE>
</HEAD>
<BODY>
A continuación va el Applet: <BR>
<APPLET code=”AppletEstado.class”
width=”300”
height=”25”>
</APPLET>
</BODY>
</HTML>

i
9

725
APLICACIONES BASADAS EN ENTORNO GRÁFICO

import java.applet.*;
import java.awt.*;

public class AppletEstado extends Applet {


private String descripcion = “”;

public void init () { descripcion += “init()...”; }


public void start () { descripcion += “start()...”; }
public void stop () { descripcion += “stop()...”; }
public void destroy () { descripcion += “destroy()...”; }

public void paint (Graphics g) {


descripcion += “paint()...”;
g.setColor(Color.blue);
g.drawString(descripcion,20,20);
}
} // fin de clase

Java Plug-In

Utilizar un añadido de la Máquina Virtual de Java. Es una solución a nivel corporativo pero no sirve para una
única página Web.

Con el Plug-in se consige que el Browser utilice la JVM de Sun.

i
10

726
APLICACIONES BASADAS EN ENTORNO GRÁFICO

- Plug-in para el navegador Explorer:

<OBJECT classid=”CLSID:8AD9C840-044E-11D1-B3E9-00805F499D93”
width=”200” height=”200” align=”baseline”
(1) codebase=”http://java.sum.com/products/plugin/1.2.2./
jinstall-1_2_2-wm.cab#version=1.2.2”>

<PARAM name=”code” value=”Propiedades.class”> Oligatorio


<PARAM name=”codebase” value=”/ejemplos”/> No es obligatorio
<PARAM name=”type” value=”application/x-java-applet;
version=1.2.2”> Obligatorio
<PARAM name=”lista” value=”Todo”> Opcional, ejemplo para pasar
parámetros al applet.
Su browser no tiene instalado el plug-in
</OBJECT>

(1) Apunta al URL donde está el componente de ActiveX. Si el usuario no lo tiene le pregunta si quiere
instalarlo.

Plug-in para el navegador Netscape:

<EMBED type=”application/x-java-applet;version=1.2.2”
width=”300” height=”300” align=”baseline”
code=”Propiedades.class”
pluginpage=”http://java.sum.com/products/plugin/1.2.1/
plugin-install.html”>
<NOEMBED>
Su browser no tiene instalado el plug-in
</NOEMBED>
</EMBED>

i
11

727
APLICACIONES BASADAS EN ENTORNO GRÁFICO

- Plug-in para ambos navegadores (Explorer y Netescape):

<OBJECT . . .> Explorer


...
<COMMENT> Explorer
<EMBED> Netescape
<NOEMBED> Netescape
...
<APPLET . . .> Explorer y Netescape
</NOEMBED>
</EMBED>
</COMMENT>
</OBJECT>

import java.applet.*;
import java.awt.*;
import java.util.*;

public class AppletBidon extends Applet {


// Atributos
int ancho, alto, lleno, x, y;
int anchoapplet, altoapplet;
AppletBidon otro;

public void init() {


// Se extraen los valores que se pasan desde la pág.HTML.
ancho = Integer.parseInt(this.getParameter(“ancho”));
alto = Integer.parseInt(this.getParameter(“alto”));
lleno = Integer.parseInt(this.getParameter(“lleno”));

i
12

728
APLICACIONES BASADAS EN ENTORNO GRÁFICO

// Se calcula el lleno del bidon en pixels.


lleno = (lleno * alto) / 100;

// Se extrae el ancho y alto del applet.


anchoapplet = size().width;
altoapplet = size().height;

// Se calcula el punto de inicio del bidon.


x = (anchoapplet - ancho) / 2;
y = (altoapplet - alto) / 2;

//Actualización de punteros entre Applets.


Enumeration e = getAppletContext().getApplets();

while (e.hasMoreElements()) {
AppletBidon a = (AppletBidon) e.nextElement();

if (this != a) { // Compara direcciones de memoria.


otro = a; // Apunta otro al primero.
otro.otro = this; // Apunta otro del primero al segundo.
}
}
}

public void paint (Graphics g) {


g.drawRect (x, y, ancho, alto);
g.fill3DRect (x+1, y+alto-lleno+1, ancho-2, lleno-2, true);
}
public boolean mouseUp (Event ev, int x, int y) {
int cuantopasar; //líquido a pasar al otro bidon.

i
13

729
APLICACIONES BASADAS EN ENTORNO GRÁFICO

if (lleno >= 20) cuantopasar = 20;


else cuantopasar = lleno;

if (otro.alto - otro.lleno < cuantopasar)


cuantopasar = otro.alto - otro.lleno;

lleno -= cuantopasar;
otro.lleno += cuantopasar;
repaint(); // repinta el applet.
otro.repaint(); // repinta el otro applet.
return true; // Se ha procesado el evento.
}
}

<HTML>
<HEAD>
<TITTLE> Applet con Bidom </TITTLE>
</HEAD>
<BODY>
<TABLE align=”center”> <TR>
<TD align=”center”>
<APPLET name = “bidon1” code=”AppletBidon.class”
width=”300” height=”300”>
<PARAM name=”ancho” value=”100”>
<PARAM name=”alto” value=”200”>
<PARAM name=”lleno” value=”50”>
</APPLET>
</TD>
<TD align=”center”>

i
14

730
APLICACIONES BASADAS EN ENTORNO GRÁFICO

<APPLET name = “bidon2” code=”AppletBidon.class”


width=”300” height=”300”>
<PARAM name=”ancho” value=”100”>
<PARAM name=”alto” value=”200”>
<PARAM name=”lleno” value=”50”>
</APPLET>
</TD>
</TR> </TABLE>
</BODY>
<HTML>

Acceso a Java desde JavaScript

Desde el Applet se va a poder acceder a JavaScript y viceversa:

1. Desde Javascript a Java (Applet):

Se va utilizar el objeto packages, el cual puede acceder a cualquier elemento de Java:

var sol = packages.java.lang.Math.sqrt(4);

Se va a poder también acceder a un applet una página Web, existen dos formas:

document.applets[<indice>].<nombreMetodo>();

<APPLET code=’Javaservidor.class’ name=’ElApplet’>

document.ElApplet.<nombreMetodo>();

i
15

731
APLICACIONES BASADAS EN ENTORNO GRÁFICO

El método que se indica en ambos caso debe ser público.

Si se utiliza el plugin el Explorer habrá que hacerlo de la siguiente forma:

<OBJECT . . .>
<PARAM name=”scriptable” value=”true”>
</OBJECT>

En el caso del Netescape 6 todavía no funciona.

import java.applet.*;
import java.awt.*;
import java.util.*;

public class AppletAccedido extends Applet {


// Atributos.
private String mensaje;

public void init () {


mensaje = getParameter(“mensaje”);
}
public void ponerMensaje (String mensaje) {
this.mensaje = mensaje;
repaint();
}
public void paint (Graphics g) {
g.drawString(mensaje,10,20);
}
}

i
16

732
APLICACIONES BASADAS EN ENTORNO GRÁFICO

<HTML>
<HEAD>
<TITTLE> Acceso a Java desde JavaScript </TITTLE>
<SCRIPT language=”JavaScript”>
<!—
function CambiarMensaje() {
var nuevo=document.forms[0].mensaje.value;
document.ElApplet.ponerMensaje(nuevo);
}
—>
</SCRIPT>
</HEAD>
<BODY>
<FORM>
<P> Escribe un mensaje:
<INPUT type=”text” name=”mensaje” value=”Hola Mundo”
size=”40”>
</P>
<P>
<APPLET code=”AppletAccedido.class” name =”ElApplet”
width=”300” height=”100”>
<PARAM name=”mensaje” value=”Hola Mundo”>
</APPLET>
</P>
<INPUT type=”button” value=”Cambiar Mensaje”
onclick=”CambiarMensaje(); return false;”> <BR>
</FORM>
</BODY>
</HTML>

i
17

733
APLICACIONES BASADAS EN ENTORNO GRÁFICO

2. Desde Java a Javascript:

Se va a utilizar la clase netscape.javascript.JSObject

Funciona tanto en Explorer como en Netscape.

Habrá que importarlo de la siguiente forma java40.jar

Se tendrá que introducir el marcador <APPLET> con el atributo mayscript:

<APPLET . . . mayscript>

Reglas de conversión de Java a Javascript:

1. Todos los objetos de Javascript se representan con instancias de JSObject.

2. Se puede pasar cualquier tipo de dato numérico a Javascript. Pero Javascript siempre devolverá objetos
de tipo FLOAT.

3. Los tipos de datos boolean y String permanecen sin cambios.

Se deberá obtener una referencia de window. Se tiene la siguiente función:

static Object <JSObject>.getWindow(Applet ap)

JSObject window = (JSObject) JSObject.getWindow(this);

i
18

734
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Se irán accediendo a las partes de window, Se tiene el siguiente método:

Object <JSObject>.getMember(String name)

JSObject doc = (JSObject) Jsobject.getMember(“document”);


JSObject formpedido = (JSObject) doc.getMember(“formpedido”);
JSObject caja = (JSObject) formpedido.getMember(“nombre”);
Caja.setMember (“value”,”Fernando”);

A veces ocurre que los objetos de la página son arrays. Para ello se tiene el siguiente método:

Object <JSObject>.getSlot(int index)

void <JSObject>.setSlot(int index, Object value)

Ejecutar métodos de Javascript:

Object <JSObject>.call (String method, Object [] args)

document.write(‘Hola’);

doc.call(“write”,{“Hola”});

static Object <JSObject>.eval(String command)

doc.eval(“document.write(‘Hola’)”);

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import netscape.javascript.*;

i
19

735
APLICACIONES BASADAS EN ENTORNO GRÁFICO

public class AppletColores extends Applet


implements ActionListener {
// Atributos
private List lbColor = new List();
private Label etiqueta = new Label(“Elija Color de Fondo:”);

public void init() {


lbColor.add(“White”); lbColor.add(“Red”);
lbColor.add(“Green”); lbColor.add(“Yellow”);
lbColor.add(“Pink”); lbColor.add(“Black”);
add(etiqueta);
add(lbColor);
lbColor.addActionListener(this);
}

public void actionPerformed (ActionEvent ev) {


String color = ev.getActionCommand();
JSObject doc = (JSObject) JSObject.getWindow(this).
getMember(“document”);

doc.setMember(“bgColor”,color);
}
}

<HTML>
<HEAD>
<TITTLE> Acceso a JavaScript desde Java </TITTLE>
</HEAD>
<BODY>
<APPLET code=”AppletColores.class” width=”200” height=”150”
mayscript>
</APPLET>
</BODY>
</HTML>

i 20

736
APLICACIONES
BASADAS EN
ENTORNO
GRÁFICO

737
ÍNDICE
APLICACIONES BASADAS EN ENTORNO GRÁFICO

1. Ventanas AWT y componentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3


2. Paneles y Layouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12
3. Más componentes GUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .24
4. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .29

738
APLICACIONES BASADAS EN ENTORNO GRÁFICO

1. Ventanas AWT y componentes


Objetivos

- Ventanas
- Barras de menú
- Botones
- Contenedores que incluirán otros componentes

Ventanas AWT y sus componentes

Una ventana Java es básicamente, un conjunto de componentes anidados.

Estos componentes pueden ser más ventanas, barras de menús, botones y/o
contenedores que incluirán otros componentes.

Éstos son el grupo de componentes que usaremos dentro del AWT:

Contenedores
Son componentes genéricos del AWT que pueden contener a otros componentes (incluso containers). La forma
mas común es el panel (es una región diferenciada donde se incluyen componentes).

Lienzos
Son simplemente superficies de dibujo. Son útiles para dibujar imágenes y otras operaciones gráficas.

Componentes UI
Pueden incluir botones, listas, menús desplegables, checkboxes y otros elementos de un interfaz de usuario.

Componentes de construcción de una ventana.


Incluye ventanas, frames, barras de menú y diálogos

i
3

739
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Jerarquía de clases AWT

La jerarquía de clases del AWT queda definida en la siguiente figura:

Los componentes básicos del interfaz de usuario

El componente básico es el componente UI. Podemos crearlos y añadirlos a nuestro Applet sin conocer nada
sobre contenedores ni paneles. Como nuestro Applet es ya en sí un contenedor (deriva de Panel) puede
contener componentes AWT y entre éstos, los componentes UI.

El modo de trabajar con estos componentes es sencillo:

1. Creamos el componente. Se hace en el método init().

2. Sumamos el componente al panel que queramos.( add)

i
4

740
APLICACIONES BASADAS EN ENTORNO GRÁFICO

3. Le asignamos una localización. Por defecto se colocaría en el centro del panel y se aplica la regla
de añadir los nuevos componentes de izquierda a derecha y en filas (uno detrás de otro).

4. Asignarle una función/método al evento asociado a la activación del componente.

Etiquetas

Las Etiquetas son cadenas de texto que sirven para nombrar o etiquetar los otros componentes. La ventaja
respecto al texto propiamente es que no tenemos que repintarlas nosotros y además se alinean en el panel.

Para crear una etiqueta usaremos uno de los siguientes constructores:

Label ()
Crea una etiqueta vacía, su texto se alinea a la izquierda

Label(String)
Crea una etiqueta con el string que le pasamos alineado a la izquierda.

Label(String, int)
Crea una etiqueta con el string que le pasamos y la alinea según el valor que le pasamos. Los alineamientos
posibles son 3. Así la variable int será: Label.RIGHT, Label.LEFT o Label.CENTER

La fuente que escribe el contenido de la etiqueta depende de la fuente que hayamos configurado con
setFont().

Ejemplo:

add( new Label("Texto centrado", Label.CENTER));

Una vez definida una etiqueta podemos utilizar métodos predefinidos en la clase Label.

741
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Botones

Botones son los elemento que sirven para realizar una acción cuando son pulsados.

Para crear un botón usaremos uno de estos constructores:

Button ():
crea un botón vacío.

Button (String):
crea un botón con el string como etiqueta.

Una vez creado el botón podemos usar estos métodos con él.

El tamaño del botón lo da la fuente de texto que lo etiqueta.

Checkboxes

Los Checkboxes son interfaces de usuario que pueden estar activadas o desactivadas. Son pequeñas cajas
cuadradas (casillas de verificación) que se pueden marcar o desmarcar.

i
6

742
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Las checkboxes pueden ser utilizadas de dos formas:

- Checkboxes no exclusivas
- Cualquiera de un grupo puede estar seleccionada o no.

Checkboxes exclusivas
Una sola checkbox de un grupo puede estar activada. Se llaman radio buttons o también checkbox groups.

Checkboxes no exclusivas
Para su creación utilizaremos uno de los siguientes constructores:

Checkbox() :
crea una checkbox vacía.

Checkbox(String) :
crea una checkbox con la etiqueta que le pasamos.

Checkbox(String, null, boolean):


crea la checkbox con la etiqueta que le pasamos y que estará activada/desactivada si el boolean vale
true/false. El valor null es característico de estos componentes.
Mouse over sobre la imagen, al pasar el ratón sobre ésta permite verla mejor, al agrandarse.

Para los checkboxes también se definen algunos métodos de utilidad.

i
7

743
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Ejemplo
Código HTML:
import java.awt.*;
import java.applet.Applet;
<html>
public class Cajas extends Applet
<body>
{
Label l1=new Label("Comedia"); <applet
Label l2=new Label("Oeste"); code="Cajas.class"
Label l3=new Label("Terror"); width=200
height=200>
Checkbox c1=new Checkbox(); </applet>
Checkbox c2=new Checkbox(); </body>
Checkbox c3=new Checkbox(); </html>
public void init()
{
setBackground(Color.yellow);
add(l1);
add(c1);
add(l2);
add(c2);
add(l3);
add(c3);
}
}

i
8

744
APLICACIONES BASADAS EN ENTORNO GRÁFICO

RadioButtons

RadioButton son un grupo de checkboxes exclusivas.

Para crearlos utilizaremos el siguiente constructor mediante un ejemplo.

CheckboxGroup cbg = new CheckboxGroup();


add(new Checkbox("Rojo",cbg,true));
add(new Checkbox("Azul",cbg,false));
add(new Checkbox("Verde",cbg,false));
add(new Checkbox("Amarillo",cbg,false));

Además podemos utilizar otros métodos predefinidos para los checkbox componentes del radio button:

import java.awt.*;
import java.applet.Applet;
public class RadiosButons extends Applet
{
Label l1=new Label("Forma de pago:");
public void init()
{
setBackground (Color.pink);
CheckboxGroup cbg = new CheckboxGroup();
add(l1);
add(new Checkbox("Visa",cbg,true));
add(new Checkbox("Metálico",cbg,false)); Código HTML:
add(new Checkbox("Cheque",cbg,false));
<html>
}
<body>
} <applet
code="RadiosButons.class“
width=200
height=200>
</applet>
</body>
</html>

745
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Menús de selección

Los menús de selección son menús desplegables que permiten seleccionar un ítem. Después el menú
representa ese ítem en la pantalla.

Para crear un choice menu creamos un objeto de la clase Choice, luego añadimos los ítems y finalmente
incluimos el menú en el panel:

Choice c = new Choice();


c.addItem("Manzanas");
c.addItem("Naranjas");
c.addItem("Platanos");
c.addItem("Melocotones");
add(c);

Estos menús solo permiten una selección por menú.

Mas métodos para este componente son:

i
10

746
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Campos de texto

Los campos de texto son componentes que nos permiten incluir valores en forma de texto.
Para crear una campo de texto, el constructor toma varias formas.
Después de crear el campo de texto lo sumamos al panel.

Ejemplo

TextField tf = new TextField("Hola desde Java",30);


add(tf);

El campo de texto solo incluye el campo editable y no incluye ninguna etiqueta. Seremos nosotros los que
incluyamos la nueva etiqueta.

Los campos de texto sólo ocupan una línea y están limitados a diferencia de las áreas de texto que hasta
pueden tener barras de scroll.

Además podemos crear el campo de texto típico de las contraseñas que esconda el texto. Para ello crearemos
el campo de texto como tal y después teclearemos el setEchoCharacter('*').

TextField tf = new TextField("Escribe algo",30);


tf.setEchoCharacter('*');
add(tf);

11

747
APLICACIONES BASADAS EN ENTORNO GRÁFICO

2. Paneles y Layouts

Queremos saber ahora cómo se representan, todos los componentes que hemos metido en el panel, en
pantalla.

Java dispone de administradores de layout para que cada componente pueda ser mandado a pantalla.

No hemos de dibujar los componentes, el sistema AWT lo hace por nosotros, solo tendremos que dibujar las
imágenes, gráficos, y animaciones que creamos.

Cada panel puede tener su propio administrador de layout.

El AWT nos proporciona cinco administradores básicos de layout:

Administrador de layouts

Para crear un administrador de layout utilizaremos el método setLayout() en el método init().

public void init() {


setLayout(new FlowLayout());
...
}

i
12

748
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Una vez el administrador de layout está creado podemos comenzar a añadir componentes al panel.

El orden de adición de los componentes es a menudo insignificante, dependiendo de qué administrador esté
activo.

Veamos ahora los administradores de Layout.

La clase Flowlayout

Usando el flow layout los componentes se añaden al panel uno cada vez y fila a fila.

Si un componente no ajusta en una fila se pasa a la siguiente.

También realiza un alineamiento centrado por defecto de cada fila.

Para crear un layout básico con alineamiento centrado, usaremos la siguiente línea de código en nuestro
método init():

setLayout(new FlowLayout());

y si queremos otro alineamiento:

setLayout(new FlowLayout(FlowLayout.LEFT));
setLayout(new FlowLayout(FlowLayout.RIGHT));

y si queremos separaciones distintas de tres pixeles entre elementos que son los que hay por defecto haríamos
(ejemplo para 10 pixeles en horizontal y en vertical):

setLayout(new FlowLayout(FlowLayout.RIGHT), 10, 10);

i
13

749
APLICACIONES BASADAS EN ENTORNO GRÁFICO

El layout GridLayout

El layout Grid ofrece un control más preciso a la hora de emplazar dentro del panel los componentes.

Ahora se divide el panel en filas y columnas y cada uno de los componentes se sitúa en una celda en orden
de izquierda a derecha y de arriba a abajo.

Para crear un layout de tipo Grid llamaremos en init() a:

setLayout(new GridLayout(3,4));

Si añadimos separaciones entre elementos en horizontal y vertical (10 y 15 respectivamente):

setLayout(new GridLayout(3, 4, 10, 15);

Mediante este ejemplo, se obtiene un Layout de 3 filas y 4 columnas con elementos separados 10 pixeles en
horizontal y 15 en vertical.

Con el GridLayout se obtiene siempre una rejilla con tamaños de celda iguales.

Ejemplo

import java.awt.*;
import java.applet.Applet;
public class Grid extends Applet
{
Label l1=new Label("Celda 1");
Label l2=new Label("Celda 2");
Label l3=new Label("Celda 3");
Label l4=new Label("Celda 4");
public void init()
{
setLayout(new GridLayout(2,2));
add(l1);
add(l2);
add(l3);
add(l4);
}
}

14

750
APLICACIONES BASADAS EN ENTORNO GRÁFICO

El layout GridBagLayout

Los layouts de la clase GridBagLayout son una variación de la clase GridLayout pero permiten variar la
presentación de cada elemento en la rejilla. Éstos usan una clase de ayuda denominada GridBagConstraints
para indicar cómo debe ser formateado cada elemento en la rejilla.

El GridBagLayout es un administrador de layout más flexible que el GridLayout ya que nos permite alinear
los componentes en vertical y horizontal en una rejilla de celdas de tamaño variable para cada elemento.

Antes, cada componente ocupaba una y sólo una celda, ahora el componente podrá ocupar varias celdas y
definirse así un tamaño más particular.

Cada componente se asocia a un objeto GridBagConstraints que se encarga de definir todos los parámetros
de tamaño, posición, alineamiento y demás del componente.

i
15

751
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Variables del objeto constrains

Para controlar estos parámetros daremos el valor de interés a las siguientes variables del objeto constraints.

Presiona sobre cada uno de los números para conocerlas:

1. gridx:
Posición en x en la malla de celdas de la esquina superior de componente.

2. gridy:
Posición en y en la malla de celdas de la esquina superior de componente.

El valor GridBagConstraints.RELATIVE (-1), que es el valor por defecto, especifica que el componente se
ponga justo a la derecha (para gridx) o debajo (para gridy) del componente anterior.

3. gridwidth:
Anchura del componente en número de celdas. Por defecto vale 1.

4. gridheight:
Altura del componente en número de celdas. Por defecto vale 1.

Para gridwidth y gridheight los valores constantes siguientes significan:

GridBagConstranits.REMAINDER (0) especifica que este componente es el último de la fila (para gridwidth)
o columna (para gridheight).

GridBagConstranits.RELATIVE (-1) especifica que este componente es el penúltimo de su fila (para gridwidth)
o columna (para gridheight).

i
16

752
APLICACIONES BASADAS EN ENTORNO GRÁFICO

5. fill:
Sirve para adecuar el tamaño del componente a su área de representación. Los valores de esta variable son:

GridBagConstranits.
NONE (0) hace que el componente no se deforme. Es el valor por defecto.

GridBagConstranits.
HORIZONTAL (2) ensancha el componente en horizontal para completar el área de representación en anchura.
No modifica la altura.

GridBagConstranits.
VERTICAL (3) ensancha el componente en altura para completar el área que ocupa el componente en altura.
No modifica la anchura del mismo.

GridBagConstranits.BOTH
ensancha en altura y en anchura.

6. ipadx:
Amplía la anchura del componente resultando la anchura anterior más 2*ipadx pixeles.

7. ipady:
Amplía la altura del componente resultando la altura anterior más 2*ipady pixeles.

Estos parámetros modifican el tamaño sin deformar en sí el componente.

8. insets:
Valor del margen del componente respecto de los ejes (imaginarios) de la malla.

i
17

753
APLICACIONES BASADAS EN ENTORNO GRÁFICO

9. anchor:
Sirve para situar el componente dentro de su área de representación cuando ésta es mayor a lo que ocupa
el componente. Los valores posibles son:

GridBagConstranits.CENTER (10)
GridBagConstranits.NORTH (11)
GridBagConstranits.NORTHEAST (12)
GridBagConstranits.EAST (13)
GridBagConstranits.SOUTHEAST (14)
GridBagConstranits.SOUTH (15)
GridBagConstranits.SOUTHWEST (16)
GridBagConstranits.WEST (17)
GridBagConstranits.NORTHWEST (18)

10. weightx:
Número de componentes que caben en una fila.

11. weighty:
Número de componentes que caben en una columna.

Por defecto, estas variables toman el valor 0 y el sistema con ello añade espacio extra entra la malla de
celdas y los ejes del contenedor.

Los valores numéricos, entre paréntesis, son los valores que tienen dichas constantes que también podemos
utilizar para no tener que teclear el nombre completo aunque perderemos claridad en el código fuente.

i
18

754
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Ejemplo de uso de GridBagLayout

Como ejemplo de uso de GridBagLayout, hemos definido primero un método llamado addComp(), que crea
el objeto GridBagConstraints y asigna valores a las variables características, antes comentadas, para luego
añadir el componente al GridBagLayout que le indiquemos.

El hacerlo de este modo resulta práctico cuando vayamos a poner bastantes componentes en el layout y
queramos características particulares para cada uno de ellos.

Ejemplo

void addComp(Panel panel, GridBagLayout gb, Component comp, int x, int y, int w, int h, int fill,
int anchor) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = x;
gbc.gridy = y;
gbc.gridwidth = w;
gbc.gridheight = h;
gbc.fill = fill;
gbc.anchor = anchor;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gb.setConstraints(comp,gbc);
panel.add(comp);
}
FlowLayout g = new FlowLayout();
setLayout(g);
GridBagLayout gb1 = new GridBagLayout();
Panel panel1 = new Panel();
panel1.setLayout(gb1);
TextField nombreTF = new TextField("Antonio Cabanyero Campos",45);
TextField telefonoTF = new TextField("964 217135",12);
addComp(panel1,gb1,new Label("Nombre:"),0,0,2,1,0,17);
addComp(panel1,gb1,nombreTF,2,0,4,1,0,13);
addComp(panel1,gb1,new Label("Telefono:"),0,1,2,1,0,17);
addComp(panel1,gb1,telefonoTF,2,1,2,1,0,13);
add(panel1);

19

755
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Aquí hemos definido un FlowLayout como panel principal al que le iremos añadiendo paneles que podrán
tener distintos layouts.

En este caso sólo le añadimos un panel (panel1) que hemos definido como un GridBagLayout que contiene
cuatro elementos: dos etiquetas y dos campos de texto.

BorderLayouts

Cuando añadimos un nuevo componente al panel que usa un layout de borde nosotros indicamos su
emplazamiento geográfico como...

north, south, west, east o center

Los elementos del borde ocupan el espacio que necesiten y el central ocupa el espacio restante.

i
20

756
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Para crear un border layout hemos de teclear:

setLayout(new BorderLayout());

Después añadimos los elementos con un método add() algo especial pues tiene dos argumentos, un string
indicando la posición y un campo de texto.

add("North", new TextField("Titulo",50));


add("South", new TextField("Estado",50));

También podemos crear un border layout con separación entre elementos.

setLayout(new BorderLayout(10,10));

Ejemplo

import java.awt.*;
import java.applet.Applet;
public class Border extends Applet
{
Button b1=new Button ("Norte");
Button b2=new Button ("Sur");
Button b3=new Button ("Este");
Button b4=new Button ("Oeste");
Button b5=new Button ("Cento");
public void init()
{
setLayout(new BorderLayout());
add("North",b1);
add("South",b2);
add("East",b3);
add("West",b4);
add("Center",b5);
}
}

i 21

757
APLICACIONES BASADAS EN ENTORNO GRÁFICO

CardLayouts

Si tratamos con Cardlayouts, los componentes del panel no son representados a la vez en el panel. Se
representan uno cada vez dando la sensación de tener una diapositiva.

Normalmente cuando creamos un Cardlayout sus componentes suelen ser otros contenedores de elementos,
normalmente paneles.

Y podemos usar diferentes layouts para cada "card" individual. Cuando añadamos un nuevo "card" al panel
podemos darle un nombre.

Usando los métodos de la clase CardLayout podemos mover hacia atrás y hacia delante en la pantalla los
diferentes "cards".

Presiona en el botón para ver un ejemplo de creación de un Card layout .

Ejemplo

setLayout(new CardLayout());
Panel uno = new Panel();
add("Primero",uno);
Panel dos = new Panel();
add("Segundo",dos);
Panel tres = new Panel();
add("Tercero",tres);
show(this,"Segundo");

i
22

758
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Insets

Los insets se utilizan para fijar los márgenes en horizontal y vertical entre los limites del panel y los
elementos.

La clase insets nos proporciona valores para los insets:

top bottom left right


superior inferior izquierda derecha

Para incluir un inset en cualquier layout sobreescribimos el método insets() en nuestra clase:

public Insets insets() {


return new Insets(vsup, vinf, vizq, vder);
}

Donde vsup, vinf, vizq y vder son los enteros que queramos.

i
23

759
APLICACIONES BASADAS EN ENTORNO GRÁFICO

3. Más componentes GUI


Áreas de texto

Las áreas de texto son similares a los campos de texto pero tienen más
funcionalidad para manejar mayores cantidades de texto.

Las áreas de texto tienen scrollbars por defecto. Veamos cómo crear un área de texto:

TextArea()
crea un área vacía de 0 filas y 0 columnas de caracteres de anchura.

TextArea(int, int)
crea un área de texto vacía pero con el numero de filas y columnas dado.

TextArea(String)
crea un área de texto conteniendo el string pero de 0 filas y 0 columnas.

TextArea(String, int, int)


crea un área de texto con el string dado y de tamaño el numero de filas y columnas pasado.

Los componentes áreas de texto tienen métodos predefinidos.

i
24

760
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Listas scroll

Las listas scroll son como un menú de selección pero no es desplegable, podemos definirla para elegir una o
varias opciones, la lista puede ser larga y tener scrollbar. Para crearlas:

List() crea una lista scroll vacía que permite solo una selección.
List(int,boolean) crea una lista con el numero de líneas visibles que le pasamos. El valor boolean indica a true
que es no-exclusiva o a false que es exclusiva.

Después de crear la lista scroll le añadiremos ítems mediante el método additem().


Como ejemplo puede valer el siguiente código:

List lst = new List(5,true);


lst.addItem("Asturias");
lst.addItem("Castilla ");
lst.addItem("Baleares");
lst.addItem("Extremadura");
lst.addItem("Centro");

Las listas scroll tienen métodos predefinidos para trabajar con ellas.

i
25

761
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Scrollbars y sliders

Podemos también crear scrollbars y sliders individuales para manipular rangos de valores o para seleccionar
un valor dentro de un rango predeterminado. Para cambiar dichos valores podemos utilizar tres facilidades:

a. Flechas de incremento/decremento.
b. Un rango en el medio.
c. Una caja en el medio para incrementar/decrementar.

Para este componente no hemos de manejar ningún evento, sólo fijar los valores máximo y mínimo. Para crear
una scrollbar:

Scrollbar()
crea una scrollbar de tamaño 0 (máximo y mínimo valor).

Scrollbar(int)
scrollbar de tamaño 0 (máximo y mínimo valor). El valor int es para la orientación, int= Scrollbar.HORIZONTAL
o Scrollbar.VERTICAL

Scrollbar(int, int, int, int, int)


crea la scrollbar y cada int indica y en este orden:

Orientación Scrollbar.HORIZONTAL o Scrollbar.VERTICAL


Valor inicial (debe estar entre el máximo y el mínimo)
Anchura del rango total mostrada
Mínimo valor
Máximo valor

i
26

762
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Métodos scrollbar

Los métodos ya definidos para las scrollbar son:

Ejemplo:

import java.awt.*;
public class Scroll extends java.applet.Applet {
Label l;
public void init() {
setBackground (Color.orange);
l = new Label("0");
add(l);
add(new Scrollbar(Scrollbar.HORIZONTAL,1,0,1,100));
}
public boolean handleEvent(Event evt) {
if (evt.target instanceof Scrollbar) {
int v = ((Scrollbar)evt.target).getValue();
l.setText(String.valueOf(v));
}
return true;
}
}

i
27

763
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Lienzos

Los lienzos permiten crear animaciones y dibujar imágenes dentro de ellos.

Para crear y añadir al panel un canvas haremos:

Canvas can = new Canvas();


add(can);

Creación del panel layout principal

Para la creación del panel layout principal cargamos los paquetes necesarios:

import java.awt.*;

Engloba la clase que da nombre al Applet.

Crearemos las variables instancia que sean necesarias. Puede que aquí creemos variables de alguna clase que
mas adelante vayamos a definir.

Comenzamos con el método init(), aquí inicializamos lo básico y definimos los


layouts:

- Fijar el layout principal: setLayout()


- Creación de los componentes del panel principal: new
- Añadir los componentes al Applet (panel principal): add()
- Inicializar los valores por defecto.
- Puede sernos útil sobrecargar el método insets()

i
28

764
APLICACIONES BASADAS EN ENTORNO GRÁFICO

4. Resumen

Has llegado al final de este recurso formativo que denominamos “El paquete Java.awt”
En esta lección hemos estudiado los siguientes contenidos:

i
29

765
APLICACIONES
BASADAS EN
ENTORNO
GRÁFICO

766
APLICACIONES BASADAS EN ENTORNO GRÁFICO

MÓDULO 7. APLICACIONES BASADAS EN ENTORNO GRÁFICO

Más sobre AWT. Nuevo Modelo de Eventos EDM (Event Delegation Model). Componentes avanzados

Componentes AWT versus Swing la nueva librería de componentes java

Dibujar todos los componentes (light weight components). Librería Swing


Aprovechar los componentes del Sistema Operativo (heavy weight components).

Librería AWT. Es la librería más antigua.

Los componentes de Swing no se pueden mezclar con los componentes de AWT ya que estos últimos
prevalecen sobre los primeros.

Los componentes de AWT son más rápidos que los componentes Swing.

AWT se utiliza para Applets mientras que Swing se utilizan sobre todo para las aplicaciones.

Etiquetas

Label (String text)


Label (String text, int alignament)

Valores para alignament:


static final int <Label>.LEFT;
static final int <Label>.CENTER;
static final int <Label>.RIGHT;

i
2

767
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Métodos asociados:
String <Label>.getText();
void <Label>.setText(String text);
Referente al texto de la etiqueta.

int <Label>.getAlignament();
void <Label>.setAlignament(int alignament);
Referente a la alineación del texto.

Se puede comprobar que Label y Applet están relacionados mediante la herencia:

(*) Representa cualquier componente del GUI.


Es un objeto pero con la característica de que puede contener más objetos.
Es un lienzo dentro del cual se introducen componentes.
Es un panel especial que se utiliza para las páginas Web.

i
3

768
APLICACIONES BASADAS EN ENTORNO GRÁFICO

void <Container>.add (Component c)


Permite añadir dentro del contenedor cualquier componente.

import java.applet.*;
import java.awt.*;

public class AppletEtiqueta extends Applet {


public AppletEtiqueta() {
this.add(new Label (“Es una etiqueta”,Label.LEFT));
// this.add(new Button (“Aceptar”));
// this.add(new Button (“Cancelar”));

}
} // Fin de clase

<HTML>
<HEAD>
<TITLE> Applet con Etiqueta </TITLE>
</HEAD>
<BODY>
<APPLET code=”AppletEtiqueta.class” width=”200” height=”200”>
</APPLET>
</BODY>
</HTML>

i
4

769
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Botones

Constructores:

Button (String text)


Texto del botón.

Métodos:
String <Button>.getLabel()
void <Button>.setLabel(String Label)
Referente al texto del botón.

Gestión de Eventos

Existen dos tipos de gestión de eventos:

Inherence Model (JDK 1.0):

Cuando un componente no procesa un evento se lo pasa a la clase base y si la clase base tampoco procesa
el evento se lo pasa al contenedor del componente. Si el contenedor no lo trata el evento entonces se pierde.

La forma de procesar el evento es redefinirlo en la clase derivada.

Hay tres eventos habituales:

boolean <Component>.mouseDown(Event ev, int x, int y)

Cuando se ha pulsado sobre el ratón. Devuelve true si se ha procesado el evento y false en caso contrario.
Cuando no se procesa se sigue la regla y pasa a la clase base.

i
5

770
APLICACIONES BASADAS EN ENTORNO GRÁFICO

boolean <Component>.action(Event ev, Object what)

Cuando se captura el evento por defecto (Botón > Pulsar, Lista > Seleccionar un elemento, ...)

boolean <Component>.handleEvent(Event ev)

Sirve para procesar cualquier evento que se produzca. Es el método que ejecuta el S.O. para informar al
componente de que se ha producido un evento. Comprueba qué evento se ha producido y en función de ello
ejecuta un evento u otro.

Estos métodos se denominan métodos de respuesta o callback.

class Applet {
public boolean handleEvent (Event ev) {
...
if (ev.id == Event.MOUSE_DOWN) {
if (this.mouseDown( . . .)) return true;

return getPareent().handleEvent(); // Padre


}
}
}

class AppletBidon extends Applet {


...
public boolean mouseDown (Event ev, ...) {
}
}
Las librerías AWT y MFC utilizan el inherence model.

i
6

771
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Event Delgation Model (JDK 1.1.x):

El problema que existe en el inherence model es que para tratar un evento de un componente había que
desarrollar la derivada del componente. Esto resulta bastante tedioso.

Cuando el componente produce un evento, todos envían el evento a un mismo receptor y ese receptor es un
objeto de una clase que normalmente va a ser la clase principal (formulario). Con lo cual el programdor sólo
tiene que desarrollar una clase que reciba todos los eventos.

Los métodos que reciben lo eventos se les denomina Métodos de Respuesta.

Para tratar objetos se tienen los siguientes objetos:

source object, el objeto que produce los eventos.

listener object, el objeto que gestiona los eventos.

Habrá varios Source (Componentes) en un Listener (Formularios).

Un objeto listener tiene que implementar los interface para recibir los eventos. Hay varios interfaces (lo más
típicos):

i
7

772
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Un objeto listener lo que tiene que hacer para enviar el evento es decir dónde habrá que enviarlo. Tiene dos
métodos:

void <Button>.addActionListener (ActionListener l)


Añadir un evento a un listener.

void <Button>.removeActionListener (ActionListener l)


Eliminar un evento de un listener.

El objeto listener tendrá que implementar el interface ActionListener:

public AppletBidon extends Applet implements ActionListener

interface ActionListenter {
public void actionPerformed (ActionEvent ev)
}

AppletBidon deberá implementar dentro actionPerformed.

multicast permite que cuando se produzca un evento en source se puede enviar el evento a varios objetos
listener.

i
8

773
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Object <ActionEvent>.getSource()
Devuelve el objeto source que ha producido el evento.

Dentro de actionPerformed:

if (ev.getSource() == boton1) { ... }


if (ev.getSource() == boton2) { ... }

i
9

774
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Ejemplo:

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class AppletSemana extends Applet


implements ActionListener {
private String [] semana = {“Lunes “,

“Martes “,

“Miercoles”,

“Jueves “,

“Viernes “,

“Sabado “,

“Domingo “};
private int dia;
private Label etiqueta = new Label (semana[0]);
private Button boton = new Button (“Nuevo Dia”);

public AppletSemana () {
this.add(etiqueta); //Se le añade la etiqueta al Applet.
this.add(boton); //Se le alñade el botón al Applet.
boton.addActionListener(this);//Applet funciona como contenedor.
//del botón y de la etiqueta.
}

i
10

775
APLICACIONES BASADAS EN ENTORNO GRÁFICO

public void actionPerformed (ActionEvent ev) {


dia = (dia >= 6)? 0 : dia+1;
etiqueta.setText(semana[dia]); // Cambia el texto de la etiqueta.
}
} // Fin de clase AppletSemana

<HTML>
<HEAD>
<TITLE> Applet con Etiqueta </TITLE>
</HEAD>
<BODY>
<APPLET code=”AppletSemana.class” width=”200” height=”200”>
</APPLET>
</BODY>
</HTML>

Los eventos de AWT

Representa cualquier tipo de evento.

Representa los eventos de AWT.

i
11

776
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Constructor:

EventObject (Object source)

AWTEvent (Object source, int type)


Donde source representa el objeto que produce el evento.
La variable type representa el código producido del S.O.

protected Object <EventObject>.source

Como es protegida no se va a poder acceder desde fuera de la clase, para acceder habrá que hacer la
derivada.

También se va a poder acceder a través del siguiente método:

i
12

777
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Adapater class

interface MouseListener { // interface para controlar el ratón.

public void mouseClicked (MouseEvent ev); Cuando se hace click.

public void mousePrresed (MouseEvent ev); Cuando se presiona el botón.

public void mouseReleased (MouseEvent ev); Cuando se suelta el botón.

public void mouseEntered (MouseEvent ev); Ha entrado en un componente

public void mouseExited (MouseEvent ev); Ha salido del componente.


}

Ejemplo:

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class AppletRaton extends Applet implements MouseListener {


public void mouseClicked (MouseEvent ev) {
System.out.println (“Coordenadas: [“+ev.getX()+” , “

+ev.getY()+”]“);
}

i
13

778
APLICACIONES BASADAS EN ENTORNO GRÁFICO

public void mousePressed (MouseEvent ev) {};


public void mouseReleased (MouseEvent ev) {};
public void mouseEntered (MouseEvent ev) {};
public void mouseExited (MouseEvent ev) {};

public void init() {


this.addMouseListener(this);
}
}

<HTML>
<HEAD>
<TITLE> Applet con Etiqueta </TITLE>
</HEAD>
<BODY>
<APPLET code=”AppletRaton.class” width=”200” height=”200”>
</APPLET>
</BODY>
</HTML>

i
14

779
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Existen más clases para no tener que realizar las derivadas:

xxxListener xxxAdapter
MouseListener (interface) mouseAdapter (clase)

Para poder anidar de Applet y de Adapter se utilizarán las clases anidadas (existe una clase exterior outer y
una clase interior outer).

Ejemplo:

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class AppletRaton2 extends Applet {


class Raton extends MouseAdapter {
public void mouseClicked (MouseEvent ev) {
System.out.println (“[“+ev.getX()+” , “+ev.getY()+”]“);
}
} // fin de clase Raton

public void init () {


this.addMouseListener(new Raton());
}
} // fin de clase AppletRaton2

i
15

780
APLICACIONES BASADAS EN ENTORNO GRÁFICO

<HTML>
<HEAD>
<TITLE> Applet con Etiqueta </TITLE>
</HEAD>
<BODY>
<APPLET code=”AppletRaton2.class” width=”200” height=”200”>
</APPLET>
</BODY>
</HTML>

También se utilizan los Adapter con clase anónimas (una clase anónima se crea como derivada de otra y que
a la vez que se crea se instancia un objeto de la clase).

Ejemplo:

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class AppletRaton3 extends Applet {


public void init () {
this.addMouseListener (
new MouseAdapter () {
public void mouseClicked(MouseEvent ev) {
System.out.println (“[“+ev.getX()+” , “+ev.getY()+”]“);
}
} // fin de clase anónima
);
} // fin de init.
} // fin de clase

i
16

781
APLICACIONES BASADAS EN ENTORNO GRÁFICO

<HTML>
<HEAD>
<TITLE> Applet con Etiqueta </TITLE>
</HEAD>
<BODY>
<APPLET code=”AppletRaton3.class” width=”200” height=”200”>
</APPLET>
</BODY>
</HTML>

Componente y Contenedores

i
17

782
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Component <Container>.add (Component c)


Component <Container>.add (String contrains, Component c)
Component <Container>.add (Component c, int index)

Añaden componentes y en que posición se quiere poner utilizando constrains o index.


Devuelven un Component por si se quiere hacer algo con él:
Button b= (button) this.add(new Button(“Pulsame”));

void <Container>.remove(int index)


void <Container>.removeall() Para eliminar componentes del contenedor.

int <Contaniner>.geComponentCount()
Da el número de elementos contenidos dentro del contenedor.

Component <Container>.getComponent(int index)


Devuelve el componente indicado por index.

Los layout (acomodadores)

En este punto se va indicar cómo colocar los componentes. Existen dos técnicas:

Utilizando coordenadas absolutas, las menos utilizadas.


Utilizando coordenadas relativas, las que más se utilizan.
La colocación de los componentes dentro del contenedor se realiza mediante los layouts. Existen cinco tipos.

i
18

783
APLICACIONES BASADAS EN ENTORNO GRÁFICO

BorderLayout: North, South, East, West y Center.


CardLayout, un elemento encima y el resto de los componentes están debajo del primero.
FlowLayout, coloca los componentes en el orden normal del flujo de escritura.
GridLayout, todos los componentes ocupan el mismo espacio.
GridBagLayout, sería una tabla en la que algunas celdas pueden tener varios tamaños.

void <Container>getLayout (LayoutManager mgr)


Pone al contenedor un Layout.

This.setLayout (new BorderLayout));

BorderLayout

void <Container>.add (String constrains, Component c)


this.add(“South, new Button (“Botón 1”));

void <Container>.add (Component c, int index)


this.add(new Label (“Hola”), BorderLayout.SOUTH);

Ejemplo:

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

i
19

784
APLICACIONES BASADAS EN ENTORNO GRÁFICO

public class AppletLayout1 extends Applet {


public void init () {
Panel p1 = new Panel();
Panel p2 = new Panel();
this.setLayout(new BorderLayout());
this.add(“North”,p1);
this.add(“South”,p2);
p1.setLayout(new BorderLayout());
p2.setLayout(new BorderLayout());
p1.add(“East”,new Button(“Boton 2”));
p1.add(“West”,new Button(“Boton 1”));
p2.add(“East”,new Button(“Boton 4”));
p2.add(“West”,new Button(“Boton 3”));
}
}

<HTML>
<HEAD>
<TITLE> Applet con Etiqueta </TITLE>
</HEAD>
<BODY>
<APPLET code=”AppletLayout1.class” width=”200” height=”200”>
</APPLET>
</BODY>
</HTML>

i
20

785
APLICACIONES BASADAS EN ENTORNO GRÁFICO

CardLayout

void <Container>.add (String name, Component c)


Este método sirve para introducir elementos en el CardLayout

this.add (“Herramientas”,panelHeramientas);
this.add (“Opciones”, panelOpciones);
this.add (“Configuaracion”, panelConfiguracion);

void <CardLayout>.first (Container c)


void <CardLayout>.next (Container c)
void <CardLayout>.previous (Container c)
void <CardLayout>.last (Container c)
void <CardLayout>.show (String name, Container c)

Hacen visible el CardLayout

Ejemplo:

class Applet {
// Atributos
CardLayout l = new CardLayout();

public void init () {


...
this.setLayout(l);
...
}

i
21

786
APLICACIONES BASADAS EN ENTORNO GRÁFICO

public void actionPerformed (ActionEvent ev) {


...
l.first(this);
...
}
} // fin de clase

FlowLayout

Por defecto alinean lo componentes al centro. Pero este comportamiento puede ser cambiado, para ello se
utiliza el constructor:

FlowLayout () // Al centro (por defecto).


FlowLayout (int alignament) // A donde se indique en alignament

La variable alignament puede tomar los siguientes valores:

FlowLayout.LEFT
FlowLayout.CENTER
FlowLayout.RIGHT

this.setLayout (new FlowLayout(FlowLAyout.LEFT)); // iaquierda.


void <Container>.add (Component c)
Para introducir elementos dentro del FlowLayout.

i
22

787
APLICACIONES BASADAS EN ENTORNO GRÁFICO

GridLayout

Constructor:
GridLayout (int rows, int cols)

Por defecto los componentes ocupan todo el espacio de la celda. Si se quiere que no se ocupe todo el espacio
de la celda se tiene un segundo constructor:

GridLayout (int rows, int cols, int horiz_gap, int verti_gap)

Los parámetros horiz_gap y vert_gap representan el espacio entre el componente y el borde de la celda,
ambas están medidas en pixels.

El número de filas o de columnas pueden ser 0. Donde el valor cero representa tantas celdas como haga
falta.

Dar posiciones absolutas a los componentes

this.setLayout (null); // Container no tiene Layout

// Se añaden los componentes del contenedor:

void <Container>.add (Component c)

// Por último se indican las coordenadas de los componentes.

void <Component>.setBounds (int x, int ym int width, int height)


void <Component<.setLocation (int x, int y)

i
23

788
APLICACIONES BASADAS EN ENTORNO GRÁFICO

this.setLayout(null);
Label hola = new Label (“Hola desde la posición (10,20)”);
hola.setLocation (10, 20);
this.add(hola);

Point <Component>.getLocation()
Posición del componente.

Rectangle <Component> getBounds()


Posición del componente y tamaño del mismo.

Caja de Texto (TextComponent, TextArea y TextField)

TextField, representa una caja de texto de una sola línea.


TextArea, representa una caja de texto con más de una línea.

i
24

789
APLICACIONES BASADAS EN ENTORNO GRÁFICO

TextComponent

No se puede instanciar, el constructor está protegido.

String <TextComponent>.getText()
void <TextComponent>.setText(String text)
Referente al texto de la caja de texto.

void <textComponent>.setEditable(boolean b)
Si se permite escribir o no en la caja de texto.

int <textComponent>.getSelectionStart()
int <textComponent>.getSelectionEnd()
Para seleccionar inicio y fin de texto de la caja de texto.
Si no se ha seleccionado nada ambas devuelven el valor –1.

void <textComponent>.select(int from, int to)


Para seleccionar texto (desde, hasta).

void <textComponent>.selectAll()
Para seleccionar todo el texto.

int <textComponent>.getCaretPosition()
void <textComponent>.setCaretPosition(int pos)

Referente al caret (cursor dentro de la caja de texto).

i
25

790
APLICACIONES BASADAS EN ENTORNO GRÁFICO

TextField

Constructores:

TextField()
TextField(int max_char) // nº máximos de caract.
TextField(String text)

Métodos:

void <TextField> setEchoChar(char c)


Para proteger en la entrada de la caja de texto. Donde c es el carácter de echo.

BotonPassword.setEchoChar (‘*’);
BotonPassword.setEchoChar (‘\0’); //Desactiva el echo.

TextArea

Constructores:

TextArea()
TextArea(int rows, int cols)
TextArea(String text, int rows, int cols)
TextArea(String text, int rows, int cols, int scrollbars)

Constantes para el parámero scrollbars:

TextArea.SCROLLBARS_NONE
TextArea.SCROLLBARS_BOTH
TextArea.SCROLLBARS_VERTICAL_ONLY
TextArea.SCROLLBARS_HORIZONTAL_ONLY

i
26

791
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Eventos de las Caja de Textos

TextEvent

Se produce cada vez que se modifica algo del contenido de la caja de texto.
El objeto Listener tendrá que implementar el interface TextListener:

interface TextListener {
public void textValueChanged (TextEvent ev);
}

El objeto Source tendrá el método siguiente par enviar el evento:

Void <TextComponent>.addTextListener (TextListener l)

ActionEvent

Sólo para TextField, se produce cuando se pulsa enter dentro de la caja de texto.

El objeto Listener tendrá que implementar ActionListener:

interface ActionListener {
public void actionPerformed (ActionEvent ev)
}

El objeto source tendrá el siguiente método para envia el evento:

void <TextField>.addActionListener (actionListener l)

i
27

792
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Ejemplo:

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class AppletCalculadora extends Applet


implements ActionListener {
// Atributos
Button botonSumar = new Button (“+”);
Button botonClear = new Button (“C”);
TextField cajaMarcador = new TextField(“0”);
Button botonesNumeros [] = new Button[10];
int acumulador = 0;
boolean empezar = true;

public void init() {


//Creación de los botones numéricos.
for (int i=0; i < 10; i++)
botonesNumeros[i] = new Button (String.valueOf(i));

// Se colocan los componentes en el contenedot.


this.setLayout(new BorderLayout());
this.add(“North”,cajaMarcador);
Panel p = new Panel();
this.add(“Center”,p);
p.setLayout(new GridLayout(4,3,5,5));

i
28

793
APLICACIONES BASADAS EN ENTORNO GRÁFICO

for (int i=1; i < 10; i++)


p.add(botonesNumeros[i]);

p.add(botonesNumeros[0]);
p.add(botonSumar);
p.add(botonClear);

// Para enviar los eventos de los Source al Listener


for (int i=0; i < 10; i++)
botonesNumeros[i].addActionListener(this);

botonSumar.addActionListener(this);
botonClear.addActionListener(this);
cajaMarcador.addActionListener(this);
}

// Tratamiento de eventos.
public void actionPerformed (ActionEvent ev) {
// Recogemos la fuente del evento.
Object ob = ev.getSource();

// Descomponemos los diferentes problemas.


if (ob == botonSumar || ob == cajaMarcador)
sumar();
else
if (ob == botonClear) clear();
else pulsadoNumero((Button) ob);
}

i
29

794
APLICACIONES BASADAS EN ENTORNO GRÁFICO

private void pulsadoNumero(Button boton) {


if (empezar) {
cajaMarcador.setText(boton.getLabel());
empezar = false;
}
else
cajaMarcador.setText(cajaMarcador.getText()+boton.getLabel());
}

private void sumar() {


try {
int parcial = Integer.parseInt(cajaMarcador.getText());
acumulador += parcial;
cajaMarcador.setText(String.valueOf(acumulador));
}
catch (NumberFormatException ex) {
cajaMarcador.setText(“E”);
}
finally {
empezar = true;
}
}

private void clear() {


acumulador = 0; empezar = true;
cajaMarcador.setText(“0”);
}
} // fin de clase

i
30

795
APLICACIONES BASADAS EN ENTORNO GRÁFICO

<HTML>
<HEAD>
<TITLE> Applet con Etiqueta </TITLE>
</HEAD>
<BODY>
<APPLET code=”AppletCalculadora.class” width=”200” height=”200”>
</APPLET>
</BODY>
</HTML>

Checkbox y Radiobutton

Checkbox
Constructores:

Checkbox (String label)


Checkbox (String label, Boolean selected)

Con el parámetro selected se le indica si el Checkbox está seleccionado o no.

Métodos:

boolean <Checkbox>.getState()
Devuelve el estado del Checkbox.

i
31

796
APLICACIONES BASADAS EN ENTORNO GRÁFICO

void <Checkbox>.setState (boolean selected)


Con este método se cambia el estado del Checkbox.

Eventos:

ItemEvent, se produce cada vez que se cambia el estado del Checkbox.

El objeto Listener mplementa ItemListener:

interface ItemListener {
public void itemStateChanged (ItemEvent ev);
}

El objeto Source tien el siguiente método para enviar los eventos al objeto Listener:

void <Checkbox>.addItemListener (ItemListener l)

Radiobutton

i
32

797
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Para crear un radiobutton se hará mediante la clase CheckboxGroup.

Se crarán los objetos de tipo Checkbox y se relacionarán mediante un objeto CheckboxGroup.

Formas de asociar los Checkbox al CheckboxGroup:

Utilizando el siguiente constructor del Checkbox:

Checkbox (String label, bolean selected, CheckboxGroup c)

Utilizando el siguiente método

void <Checkbox>.setChekboxGroup (CheckboxGroup c)

Panel p = new Panel();


p.setLayout (new gridLayout(3,0));
CheckGroup c = new CheckGroup();
Checkbox uno = new Checkbox (“Uno”, true, c);
Checkbox dos = new Checkbox (“Dos”, false, c);
Checkbox tres = new Checkbox (“Tres”, false, c);

i
33

798
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Métodos:

Checkbox <CheckboxGroup>.getSelectedCheckbox()
Devuelve el Checkbox seleccionado.

Eventos:

ItemEvent, solo se produce cuando se selecciona y no cuando no se selecciona.

Choice y List

Choice

Constructor:

Choice()

Métodos:

void <Choice>.add (String item)


Añade elementos a un Choice.

void <Choice>.insert (String item, int index)


Inserta elementos en un Choice en la posición indicada en el parámetro index.

void <Choice>.remove (String item)


void <Choice>.remove (int index)
void <Choice>.removeAll()
Elimina elementos del Choice.

i
34

799
APLICACIONES BASADAS EN ENTORNO GRÁFICO

int <Choice>.getItemCount()
Devuelve el número de elementos incluidos en el Choice.

String <Choice>.getItem(int index)


Devuelve el elemento que está en la posición indicada por el parámetro index.

int <Choice>.getSelectedIndex()
Devuelve la posición del el elemento seleccionado.

String <Choice>.getSelectedItem()
Devuelve el elemento seleccionado.
void <Choice>.select(int index)
Selecciona el elemento a partir de la posición indicada en el parámetro index.

Eventos:

ItenEvent, se produce cada vez que se elige un elemento del Choice.

Para el objeto Listener implementa ItemListener:

interface ItemListener {
public void itemStateChanged (ItemEvent ev)

Para enviar el evento del objeto Source al objeto Listener se tiene el siguiente método:

void <Choice>.addItemListener (ItemListener l)

i
35

800
APLICACIONES BASADAS EN ENTORNO GRÁFICO

List

Constructores:

List ()
List (int rows)
List (int rows, Boolean multiselect)

Métodos:

void <List>.add (String item)


void <List>.add (String item, int index)
Añade elementos a la lista.

int <List>.getItemCount ()
Número total de elementos de la lista.

int <List>.getRows ()
Número de elementos que se visualizan en el List.

void <List>.makeVisible (int index)


Visualiza un elemento indicado la posición a través del parámetro index.

void <List>.select (int index)


Selecciona el elemento a partir de la posición indicada por el parámetro index.

String <List>.getSelectedItem ()
Devuelve el elemento seleccionado.

i
36

801
APLICACIONES BASADAS EN ENTORNO GRÁFICO

int <List>.getSelectedIndex ()
Devuelve la posición del elemento seleccionado.

boolean <List>.getSelectIndex ()
Devuelve la posición del objeto seleccionado.

boolean <List>.isIndexSelected (int index)


Devuelve true si el elemento de la posición que se pasa por parámetro está seleccionado, de
lo contrario el método devuelve false.

int [] <List>.getSelectedIndexes ()
String []<List>.getSelectedItems ()
Cuando el objeto List tiene multiselección.

Eventos:

ItemEvent, se produce cuando se selecciona un elemento de la lista.


ActionEvent, cuando se realiza doble clic sobre un elemento de la lista.

Ejemplo:

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class AppletTraductora extends Applet


implements ActionListener {
// Atributos.
TextField cajaPalabra = new TextField(“”,8);
Button botonTraducir = new Button(“Traducir”);

i
37

802
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Label etiquetaTraduccion = new Label(“ “);


List listaPalabrasParecidas = new List ();
CheckboxGroup g = new CheckboxGroup ();
Checkbox inglesEspanol = new Checkbox(“Inglés-Español”, true, g);
Checkbox espanolIngles = new Checkbox(“Español-Inglés”, false, g);
String [][] palabras = {{“cat”,”gato”},

{“dog”,”perro”},
{“horse”,”caballo”},
{“mouse”,”raton”},
{“panther”,”pantera”},

{“woman”,”mujer”},

{“man”,”hombre”},

{“house”,”casa”},

{“lyon”,”leon”},

{“tiger”,”tigre”}};

public void init() {

// Pintar el Applet
this.setLayout(new BorderLayout());
this.add (“Center”,listaPalabrasParecidas);
Panel panelArriba = new Panel ();
this.add (“North”,panelArriba);
panelArriba.setLayout(new GridLayout(3,1));

i
38

803
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Panel p = new Panel (new FlowLayout(FlowLayout.LEFT));


p.add(new Label (“Palabra:”));
p.add(cajaPalabra);
p.add(botonTraducir);
panelArriba.add(p);

p = new Panel (new FlowLayout(FlowLayout.LEFT));


p.add(new Label (“Traducción: “));
p.add(etiquetaTraduccion);
panelArriba.add(p);

p = new Panel (new GridLayout (3,1));


p.add(inglesEspanol);
p.add(espanolIngles);
p.add(new Label(“Palabras Parecidas:”));
panelArriba.add(p);

// Tratamiento de Eventos
botonTraducir.addActionListener(this);
listaPalabrasParecidas.addActionListener(this);
}

public void actionPerformed (ActionEvent ev) {


Object obj = ev.getSource();
int col = 0;

if (inglesEspanol.getState())
col = 0;
else
col = 1;

i
39

804
APLICACIONES BASADAS EN ENTORNO GRÁFICO

if (obj == botonTraducir)
traducirPalabra (cajaPalabra.getText(), col);
else
traducirPalabra (listaPalabrasParecidas.getSelectedItem(), col);
}

private void traducirPalabra (String palabra, int col) {


listaPalabrasParecidas.removeAll();

for (int i = 0; i <= palabras.length; i++) {


if (palabras[i][col].startsWith(palabra))
listaPalabrasParecidas.add(palabras[i][col]);

if (palabras[i][col].equals(palabra))
etiquetaTraduccion.setText(palabras[i][1-col]);
}
}
} // fin de clase

<HTML>
<HEAD>
<TITLE> Applet con Etiqueta </TITLE>
</HEAD>
<BODY>
<APPLET code=”AppletTraductora.class” width=”200” height=”200”>
</APPLET>
</BODY>
</HTML>

i
40

805
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Scrollbars

Constructores:

Scrollbar (int orientation)


Scrollbar.HORIZONTAL
Scrollbar.VERTICAL

Scrollbar (int orientation, int value, int visible_area, int minimum,


int maximum)

visible_area => tamaño del tirador (el cuadrado que se desplaza).


minimum= 0
maximum=255

Para saber la posición de la barra:


int <Scrollbar> getValue()
void <Scrollbar> setValue(int value)

Incremento de unidad: cuánto se modifica la barra cuando pinchamos en las flechas.

void <Scrollbar> setUnitIncrement (int unit)

Incremento de bloque: cuánto se modifica la barra cuando pinchamos en la barra.

void <Scrollbar> setBlockIncrement (int block)

Los eventos que producen las barras son de tipo: AdjustmentEvent y se producen cada vez que modificamos
la posición de la barra.

i
41

806
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Para capturar el evento, hay que indicar al objeto Sourcer a que Objeto Listener enviar los eventos y para
esto tenemos el método:

void <Scrollbar> addAdjustmentListener

El objeto Listener debe implementar la interface:

interface AdjustmentListener {
public void adjustmentValueChanged(AdjustmentEvent ev);
}

int <AdjustmentEvent> getAdjustmentType()


Devuelve una constante indicando lo que ha ocurrido:

AdjustmentEvent.TRACK // ARRASTRANDO EL TIRADOR


AdjustmentEvent.UNIT_INCREMENT
AdjustmentEvent.UNIT_DECREMENT
AdjustmentEvent.BLOCK_INCREMENT
AdjustmentEvent.BLOCK_DECREMENT

int <AdjustmentEvent> getValue();


Para saber en que posición ha quedado la barra después de producirse un evento

El contenedor Scrollpane

Es un panel con barras de Scrollbar. Gestiona los eventos de las barras de Scroll.

Constructores:

ScrollPane()
ScrollPane(int scrollBarDisplayPolicy)

i
42

807
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Indicamos cuando queremos que aparezcan las barras de Scroll. Hay tres posibles valores:

Constantes del objeto Scrollpane:

ScrollPane.SCROLLBARS_AS_NEEDED // Cuando se necesiten


ScrollPane.SCROLLBARS_ALWAYS // Siempre
ScrollPane.SCROLLBARS_NEVER // Nunca

Ese ScrollPane tiene asociado un área scrollable (total de superficie que podemos ver en ese ScrollPane), que
será la suma de todos los componentes que hayamos metido. No podemos indicar el tamaño del área
scrollable, pero si podemos indicar el tamaño del ScrollPane, con:

void <Component> setSize(int width, int height)

void <ScrollPane> setScrollPosition(int x, int y);


Para indicar el punto de origen del ScrollPane(Esquina superior izq)

Desarrollo de Aplicaciones Gráficas con AWT

Cómo crear ventanas

i
43

808
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Frame es la ventana principal y Dialog es una ventana de auxiliar.

Para crear una ventana:

1. Creamos un objeto de tipo Window.

2. Dar tamaño a la ventana (hay dos formas):

void <Window> setSize(int width, int height);


void <Window> setBounds(int x, int y, int width, int height);
void <Window> pack()

Delega en los layout en dar el tamaño, y los layaout lo asignarán según el tamaño preferido de los
componentes (la suma). Para poder utilizar pack() nuestra ventana debe tener componentes; y si lo usamos
nuestra ventana sólo tendrá la barra de título.

3. Mostrar la ventana:

void <window> show()


Por un lado hace visible la ventana y realiza la reserva de recursos del S.O. Crea un hilo que se encargará
de ir recogiendo los mensajes del S.O. y ir ejecutando los métodos de respuesta correspondientes en el
objeto.

4. Cerrar la ventana:

void <window> dispose()

Libera los recursos del S.O.; pero el hilo que se crea con show sigue ejecutándose. Para matar ese hilo
debemos utilizar:

i
44

809
APLICACIONES BASADAS EN ENTORNO GRÁFICO

System.exit(0)
(Para la ventana principal). De esta forma el hilo se quedará dormido y no se perderá hasta que no cerremos
el programa.

5. Hacer invisible una ventana para luego poderla utilizar:


void <Window> setVisible(boolean b)

Frame

Tiene dos posibles constructores:

Frame();
Frame(String title);

Métodos:

void <Frame> setTitle(String text);


Para cambiar el título de la ventana

void <Frame> setResizable(boolean b)


Para que no se pueda cambiar el tamaño.

void <Component> setCursor (int type)


Cuando pase por encima de un objeto el cursor será distinto. type puede tomar los valores definidos en la
clase Cursor:

Cursor.DEFAULT_CURSOR
Cursor.CROSSHAIR_CURSOR
Cursor.HAND_CURSOR

i
45

810
APLICACIONES BASADAS EN ENTORNO GRÁFICO

void <Frame> setIconImage(Image image)


Establece el icono de la esquina superior izquierda. No funciona en todos los S.O.

Dialog

Representa un cuadro de diálogo; que se clasifican en modales (una vez que salen se apoderan del foco y no
lo pierden hasta que lo cerramos) y amodales (no se apoderan del foco).

Tiene dos constructores:

Dialog (Frame parent, boolean modal) // Frame asociado a la ventana


Dialog (Frame parent, String title, boolean modal)

Eventos de las ventanas WindowEvent

A la ventana se le dirá a que objeto Listener enviarlo con el siguiente método:

void <Window> addWindowListener(WindowListener l)

interface WindowListener {

public void windowOpened (WindowEvent ev)


Cuando se abre la ventana.

public void windowClosing (WindowEvent ev)


Cuando se va a cerrar

public void windowClosed (WindowEvent ev)


Cuando se cierra la ventana.

i
46

811
APLICACIONES BASADAS EN ENTORNO GRÁFICO

public void windowIconified (WindowEvent ev)


Se miniminiza la ventana.

public void windowDeiconified(WindowEvent ev)


Se maximiza la ventana.

public void windowActivated (WindowEvent ev)


Pasa a primer plano.

public void windowDeactivated(WindowEvent ev)


Se cambia de ventana.

Para este caso será más cómodo utilizar WindowApadter para no tener que definir todos estos métodos.

Ejemplo:

import java.awt.*;
import java.awt.event.*;
public class VentanaColores extends Frame {

// Atributos
Scrollbar barraRojo = new Scrollbar(Scrollbar.HORIZONTAL,255,64,0,255);
Scrollbar barraVerde = new Scrollbar(Scrollbar.HORIZONTAL,255,64,0,255);
Scrollbar barraAzul = new Scrollbar(Scrollbar.HORIZONTAL,255,64,0,255);

VentanaColores() {
super(“Color?”);

i
47

812
APLICACIONES BASADAS EN ENTORNO GRÁFICO

GridBagLayout layout = new GridBagLayout();


GridBagConstraints c = new GridBagConstraints();
this.setLayout(layout);

Label l =new Label(“Rojo”);


layout.setConstraints(l,c);
this.add(l);

c.gridwidth = GridBagConstraints.REMAINDER;
c.fill=GridBagConstraints.HORIZONTAL;
c.weightx = 1.0;
layout.setConstraints(barraRojo,c);
this.add(barraRojo);

c.gridwidth= 1;
c.fill= GridBagConstraints.NONE;
c.weightx = 0.0;
l=new Label (“Verde”);
layout.setConstraints(l,c);
this.add(l);

c.gridwidth = GridBagConstraints.REMAINDER;
c.fill=GridBagConstraints.HORIZONTAL;
c.weightx = 1.0;
layout.setConstraints(barraVerde,c);
this.add(barraVerde);

c.gridwidth= 1;
c.fill= GridBagConstraints.NONE;

i
48

813
APLICACIONES BASADAS EN ENTORNO GRÁFICO

c.weightx = 0.0;
l=new Label (“Azul”);
layout.setConstraints(l,c);
this.add(l);
c.gridwidth = GridBagConstraints.REMAINDER;
c.fill=GridBagConstraints.HORIZONTAL;
c.weightx = 1.0;

layout.setConstraints(barraAzul,c);
this.add(barraAzul);
}

public static void main (String [] args) {


VentanaColores v = new VentanaColores();
v.pack();
v.show();
}
} // fin de clase

GridBagLayout

GridBagConstraints van a ser unos objetos que permiten especificar como modificar las celdas.

Tenemos que crear un GridBagLayout y un GridBagConstriants, un Layout:

GridBagLayout = new GridBagLayout ();


GridBagConstraints = new GridBagConstraints ();
Panel panel = new Panel(layout);

i
49

814
APLICACIONES BASADAS EN ENTORNO GRÁFICO

// Para cada componente que vayamos a añadir


layout.setContraints(componente,c);
panel.add(componente);

Los atributos que tiene GridBagConstraints:

gridx,gridy > Indica la fila y la columna donde se va a añadir el componente.


GridBagConstraints.RELATIVE > Indica que se añaden en orden.
gridwidth, gridweight > Número de filas y columnas que ocupa el componente, por defecto es 1.
GridBagConstraints.REMAINDER> Lo que sobre hasta el final.
GridBagConstraints.RELATIVE > Lo que sobre hasta la penúltima.
fill > Indica si se ajusta o no el componente cuando la celda es más grande que el componente.

GridBagConstraints.NONE > Lo que ocupe.


GridBagConstraints.VERTICAL > Ocupe toda la vertical.
GridBagConstraints.HORIZONTAL> Ocupe toda la horizontal.
GridBagConstraints.BOTH > Lo rellene todo.

ipadx,ipady (Internal Padding)

Indica cuántos píxeles estirar el componente respecto a su tamaño preferido.

inset (External Padding)

Indica el espacio mínimo entre los bordes del componente y la rejilla, en píxeles.

anchor

Cuando el componente es mayor que la casilla, se usa para indicar en qué lado ponerlo, hay una serie de
constantes, en la clase GridBagConstraints:

i
50

815
APLICACIONES BASADAS EN ENTORNO GRÁFICO

NORTH
NORTHEAST
EAST
SOUTHEAST
SOUTH
SOUTHWEST
WEST
NORTHWEST

weightx,weighty

Indica el porcentaje que estiramos un componente cuando el contenedor cambia de tamaño. El valor estará
comprendido entre 0.0 y 1.0.

Ejemplo:

import java.awt.*;
import java.awt.event.*;
public class VentanaColores extends Frame

implements AdjustmentListener {
//Atributos
Label etiquetaRoja= new Label(“Rojo”);
Label etiquetaVerde= new Label(“Verde”);
Label etiquetaAzul= new Label(“Azul”);
Scrollbar barraRojo= new
Scrollbar(Scrollbar.HORIZONTAL,255,64,0,255);
Scrollbar barraVerde= new
Scrollbar(Scrollbar.HORIZONTAL,255,64,0,255);

i
51

816
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Scrollbar barraAzul= new


Scrollbar(Scrollbar.HORIZONTAL,255,64,0,255);

// Constructor
VentanaColores() {
super(“Ventana para colores”);
GridBagLayout layout= new GridBagLayout();
GridBagConstraints c1= new GridBagConstraints();
GridBagConstraints c2= new GridBagConstraints();

c2.gridwidth= GridBagConstraints.REMAINDER;
c2.fill= GridBagConstraints.HORIZONTAL;
c2.weightx= 1.0;

setLayout(layout);

layout.setConstraints(etiquetaRoja,c1);
this.add(etiquetaRoja);

layout.setConstraints(barraRojo,c2);
this.add(barraRojo);

layout.setConstraints(etiquetaVerde,c1);
this.add(etiquetaVerde);

layout.setConstraints(barraVerde,c2);
this.add(barraVerde);

layout.setConstraints(etiquetaAzul,c1);
this.add(etiquetaAzul);

i
52

817
APLICACIONES BASADAS EN ENTORNO GRÁFICO

layout.setConstraints(barraAzul,c2);
this.add(barraAzul);

this.addWindowListener( //Eventos los envia a la cl. anónima.


new WindowAdapter () {
public void windowCLosing (WindowEvent ev) {
dispose();
System.exit(0);
}
}
);

barraRojo.addAdjustmentListener(this);
barraVerde.addAdjustmentListener(this);
barraAzul.addAdjustmentListener(this);

}//Constructor

public void adjustmentValueChanged (AdjustmentEvent ev) {


Color c = new Color (barraRojo.getValue()+64,

barraVerde.getValue()+64,

barraAzul.getValue()+64);
this.setBackground(c);
etiquetaRoja.setBackground(c);
etiquetaVerde.setBackground(c);
etiquetaAzul.setBackground(c);
}

i
53

818
APLICACIONES BASADAS EN ENTORNO GRÁFICO

public static void main(String []args) {


VentanaColores v= new VentanaColores();
v.setSize(200,200);
v.show();
}
}//Fin clase

Cuadros de diálogo comunes

Los Sistemas Operativos tienen ya implementados algunos cuadros de diálogo denominados comunes.
En el caso de Java se tiene la siguiente clase que implementa:

Constructor:

FileDialog (Frame frame)


FileDialog (Frame frame, String title)
FileDialog (Frame frame, String title, int kind)

i
54

819
APLICACIONES BASADAS EN ENTORNO GRÁFICO

El parámetro kind representa el tipo de FileDialog que se quiere abrir:

FileDialog.LOADPara ficheros que existan en disco.


FileDialog.SAVE Para ficheros que no existan.

Métodos:

void <FileDialog>.show()
Visualiza el FileDialog. Es un método asíncrono o bloqueante, el hilo se queda dormido hasta que se sale del
método. Es un método modal.

String <FileDialog>.getFile()
Devuelve el nombre del fichero seleccionado en el FileDialog. Si no se selecciona ninguno devuelve null.

String <FileDialog>.getDirectory()
Devuelve el path del fichero seleccionado en el FileDialog. Si no se selecciona ninguno devuelve null.

FileDialog es una forma de pedir al usuario un nombre de fichero, no realiza operaciones sobre ficheros.

Filtros: para permitir seleccionar ficheros de un determinado tipo desde el FileDialog

UNIX
.txt / .gif
WINDOWS

Mac
Tipo Mime > text/plain text/html text/css image/gif
BeOS

Interface FilenameFilter {
public bolean accept (File dir, String name)
}

i
55

820
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Este método (accept) se ejecuta una vez por cada fichero del directorio preguntando si se acepta o no.

void <FileDialog>.setFilenameFilter(FilenameFilter f)
Indica cuál es el filtro.

Ejemplo:

import java.awt.*;
import java.io.*;
import java.awt.event.*;

public class VentanaDialogo extends Frame

implements FilenameFilter{

Label etiqueta = new Label();

VentanaDialogo () {
super (“Ventana Dialogo”);
FileDialog Fd = new FileDialog(this, “Abrir”);
Fd.setFilenameFilter(this);
Fd.show();
add(etiqueta);
etiqueta.setText(Fd.getDirectory() + Fd.getFile());
}

public static void main (String [] args) {


VentanaDialogo v= new VentanaDialogo();
v.setSize(500,500);
v.show();
}

i
56

821
APLICACIONES BASADAS EN ENTORNO GRÁFICO

public boolean accept(File dir, String name) {


System.out.println(name);
if (name.endsWith(“.java”)) return true;
else return false;
}
} // fin de clase

Menús

i
57

822
APLICACIONES BASADAS EN ENTORNO GRÁFICO

MenuBar

Métodos:

void <MenuBar>.add(Menu m)
Añade una persiona al Menubar.

void <MenuBar>.remove(Menu m)
Añade una persiona al Menubar.

int <MenuBar>.getMenuCount()
Devuelve el número de menús incluidos en el MenuBar.

Menu <MenuBar>.getMenu(int index)


Devuelve un Menú que ocupa la posición indicada por el parámetro index.

For (int i=0;i < barra.GetMenuCount(); i ++) {


Menu m = barra.getMenu(i);
// Proceso
}

void <Frame>.setMenuBar(MenuBar mb)


Se inserta una barra de Menus en un frame.

MenuItem

Representa cualquier elemento del menú. Puede representar:

- Una persiana (MenuBar).


- Una opción de menú.
- Un separador (será un MenuItem cuyo texto se “-“).

i
58

823
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Producen eventos ActionEvent.

Para fijar el objeto Listener se tiene el método:

void <MenuITem>addActionListener (ActionListener l)

Métodos:

void <MenuItem>.setEnable(Boolean b)
Activa o desactiva las opciones de menú.

CheckboxMenuItem

Representa una opción de menú con marca de chequeo para indicar que la opción está activada o no.

Constructor:

CheckboxItem (String Label, bolean state)

Produce eventos ItemEvent (también los produce los Checkbox) y también ActionEvent.

Para indicar el Listener tiene el siguiente método:

Void <CheckboxMenuItem>.addItemListener (ItemListener l)ç

Métodos:

void <CheckboxMenuItem>.getState()
Para saber si una opción está o no seleccionada.

void <CheckboxMenuItem>.setState()
Activa o desactiva un MenuItem.

i
59

824
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Menu

Métodos:

void <Menu>.add(MenuItem mi)


Añade un MenuItem a un objeto Menu.

MenuShortcut

Para el acceso rápido a menús se tienen dos formas de acceder:

- Tecla Rápida.
- Tecla Aceleradora.

En AWT no se tienen teclas rápidas pero sí se tienen aceleradoras (combinación de teclas).

Constructores:

MenuShortcut (int key) > Ctrl + key


Menushortcut (int key, boolean shift) // Shift + Ctrl + key
El parámetro key representa el código de la tecla virtual (clase KeyEvent)
El parámetro shift con valor true será la combinación indicada anteriormente.

Métodos:

void <MenuShortcut>.setShotcut(MenuShortcut s)
Asocia a un objeto MenuItem una tecla aceleradora.

i
60

825
APLICACIONES
BASADAS EN
ENTORNO
GRÁFICO
Gestión de eventos

826
ÍNDICE
APLICACIONES BASADAS EN ENTORNO GRÁFICO

1. Manejando acciones UI y eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3


2. Anidando paneles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6
3. El ratón . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9
4. Eventos del teclado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16
5. El manejador de eventos del AWT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .20
6. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23

827
APLICACIONES BASADAS EN ENTORNO GRÁFICO

1. Manejando acciones UI y eventos


Objetivos

- Manejar acciones UI y eventos


- Conocer los eventos y paneles anidados
- Identificar el evento El ratón
- Identificar los eventos del teclado
- Reconocer el manejador de eventos del AWT

Manejando acciones UI y eventos

Para que todos los componentes UI que hemos aprendido a crear tengan un efecto, es decir, para que el
evento asociado a ellos determine una acción a realizar hemos de engancharles una operación.

Para interceptar una acción relacionada con un componente UI hemos de definir un método action() en
nuestra clase o en nuestro Applet.

public boolean action(Event evt, Object obj) {


...
}

Método action ()

El método action () tiene el aspecto similar al tratamiento de eventos de ratón, pero añade un segundo
argumento que es un objeto de cualquier tipo y que va a depender del componente UI.

i
3

828
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Por ejemplo, y salvo las etiquetas que no generan acciones, podemos destacar las siguientes:

1. Los botones crean acciones al ser pulsados y el argumento es la etiqueta del botón.

2. Las checkboxes, tanto las exclusivas como las no-exclusivas generan una acción cuando el elemento
es marcado y el argumento es siempre true.

3. Los menús de elección crean una acción cuando un ítem es seleccionado y el argumento es ese
ítem.

4. Los campos de texto crean acciones cuando el usuario pulsa return dentro del campo de texto y no
si sale de éste sin pulsar.

Variable evt.target y operador instanceof

Múltiples objetos y de distinto tipo se juntaran en el método action()

Para tratar con ellos y de forma individualizada habremos de testear el tipo de objeto que ha creado el
evento dentro del cuerpo de nuestro método action(). Para ello haremos uso de la variable evt.target y del
operador instanceof, para preguntar si un objeto pertenece a una determinada clase.

Según el componente llamaremos a otro método (con los argumentos que sean necesarios) fuera de aquí
para tratar lo que se debe hacer para cada componente del panel (para no hacer demasiado grande el método
action()).

i
4

829
APLICACIONES BASADAS EN ENTORNO GRÁFICO

No nos olvidemos que el método action() devuelve un valor boolean.

public boolean action(Event evt, Object arg) {


if (evt.target instanceof TextField) {
manejaText(evt.target);
}
else if (evt.target instanceof Choice) {
manejaChoice(arg);
}
...
return true;
}

Donde manejaText() y manejaChoice() serían dos métodos que después definiríamos para la gestión del
elemento en particular.

Ejemplo:

Un applet que pone el color de fondo, según el botón que pulsemos. Se elige entre cinco colores.

import java.awt.*;
public class BotonAccion extends java.applet.Applet {
public void init() {
add(new Button("Rojo"));
add(new Button("Azul"));
add(new Button("Verde"));
add(new Button("Blanco"));
add(new Button("Negro"));
}
public boolean action(Event evt, Object obj) {
if (evt.target instanceof Button) {
changeColor((String)obj);
}
return true;
}
void changeColor(String bname) {
if (bname.equals("Rojo")) { setBackground(Color.red); }
else if (bname.equals("Azul")) { setBackground(Color.blue); }
else if (bname.equals("Verde")) { setBackground(Color.green); }
else if (bname.equals("Blanco")) { setBackground(Color.white); }
else { setBackground(Color.black); }
repaint();
}
}

830
APLICACIONES BASADAS EN ENTORNO GRÁFICO

2. Anidando paneles

Los Applets se hacen interesantes cuando comenzamos a anidar paneles.

Es así como creamos diferentes layouts en nuestro Applet.

Podemos aislar fondos y planos principales de distintos colores para cada panel, y lo mismo con las fuentes.

La superclase de la clase Panel es la clase Container y proporciona un comportamiento genérico para manejar
otros componentes dentro de ella.

Además la clase Applet es una subclase de Panel.

Por ejemplo para anidar un nuevo panel vamos a crear un nuevo panel y a añadirlo al Applet como si fuera
otro componente.

setLayout(new GridLayout(1,2,10,10);
Panel panel1 = Panel();
Panel panel2 = Panel();
add(panel1);
add(panel2);

Configuración de layout

Podemos ahora configurar un layout diferente para cada panel y podemos incluir nuevos componentes a cada
panel independientes de los otros paneles haciendo uso del método add() de forma apropiada:

i
6

831
APLICACIONES BASADAS EN ENTORNO GRÁFICO

panel1.setLayout(new FlowLayout());
panel1.add(newButton("Arriba");
panel1.add(newButton("Abajo");
panel2.setLayout(new GridLayout());
panel2.add(newButton("Hola");
panel2.add(newButton("Adios");

Normalmente y en Applets de envergadura considerable se suelen separar en diferentes clases lo relacionado


a cada panel o layout.

Eventos y paneles anidados

Al anidar paneles, creamos una jerarquía con el panel principal (normalmente el Applet) a la cabeza. Esta
jerarquía de componentes determina el orden de pintado en pantalla.

El manejo de los eventos entre distintos componentes en la jerarquía va a ser importante y vamos a hacer
uso del valor boolean que devuelven normalmente los métodos de manejo de eventos.

Según atendemos un evento éste se pasa o no a manejadores de eventos por encima en la jerarquía:

1. Si el evento no nos interesa y no lo procesamos devolvemos false.

2. Si el evento nos interesa y la procesamos devolvemos true. En este momento el evento deja de
subir en la jerarquía.

3. Interceptar el evento, procesarlo y pasárselo a otro manejador. En este caso el manejador suele
devolver false para que siga subiendo en nuestra jerarquía.

i
7

832
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Event ID

La forma más general de manejar eventos continúa siendo el método ya visto handleEvent(), y para manejar
los eventos de los componentes UI redefiníamos el método action().

Para eventos relacionados con scrollbars y listas scroll la única forma de manejarlos es mediante el método
handleEvent(). Para interceptar estos eventos lo que haremos será testear los ID's asociados.

Los ID definidos en la clase Event nuevos son los siguientes:

i
8

833
APLICACIONES BASADAS EN ENTORNO GRÁFICO

3. Clicks del ratón


El ratón

El evento click del ratón ocurre siempre que el usuario pulsa dentro del área de nuestro Applet. Podemos usar
este evento para múltiples acciones.

El evento del click del ratón se desglosa en dos eventos:

El evento MouseDown

El evento mouseDown se corresponde con el pulsado del botón del ratón.

Manejar este evento es muy fácil ya que basta sobrecargar mouseDown():

public boolean mouseDown(Event evt,int x, int y) {


...
}

i
9

834
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Al método se le pasan tres parámetros: el mismo evento y las coordenadas (x,y) de pulsación del ratón dentro
del área del Applet.

No hay que olvidar que el método debe devolver un boolean y por ello hemos de hacer uso de la palabra
reservada return seguida de dicho valor.

Este boolean lo debemos de interpretar para ver si nuestro Applet ha reaccionado ante el evento.

Va a ser útil cuando creemos interfaces de usuario.

La idea es que si el método trata el evento devuelva true.

El evento Mouseup

El evento mouseUp se corresponde con el soltado del botón del ratón. Manejar este evento es fácil, basta
sobrecargar ahora mouseUp():

public boolean mouseUp(Event evt,int x, int y) {


...
}

Al método se le pasan los tres parámetros de antes. El manejo del valor resultado se hace de forma análoga
al método mouseDown().

i
10

835
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Ejemplo: Vamos a hacer un Applet para que cuando pinchemos con el ratón en cualquier área del mismo
aparezca un mensaje en las coordenadas 10,10 diciendo: “Has pulsado el ratón...”

Código HTML:
import java.awt.*;
import java.applet.Applet; <html>
public class Raton extends Applet <body>
{ <applet
public void init() code="Raton.class"
{ width=200
setBackground(Color.yellow); height=200>
} </applet>
public boolean mouseDown(Event e , int x,int y) </body>
{ </html>
Graphics g=getGraphics();
g.drawString(“Has pulsado el ratón...",10,10);
return true;
}
}

i
11

836
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Movimientos del ratón

Cada vez que el ratón se mueve se genera un evento de movimiento del ratón. Hay dos eventos relacionados
con el movimiento del puntero del ratón:

1. Movimiento del ratón sin pulsar el botón.


2. Arrastre del ratón (drag), que es el movimiento del ratón a la vez que se mantiene el botón pulsado.

Para usar estos eventos se carga el paquete Event y el Point dado que se suele trabajar con puntos para
almacenar las coordenadas del ratón:

import java.awt.Event;
import java.awt.Point;

Movimiento del ratón.


El movimiento del ratón da lugar al evento mouseMove. Para tratar este evento se sobrecargara el método
mouseMove():

public boolean mouseMove(Event evt,int x, int y) {


...
}

Arrastre del ratón.


El arrastre del ratón da lugar al evento mouseDrag. Para tratar este evento se sobrecargara el método
mouseDrag():

public boolean mouseDrag(Event evt,int x, int y) {


...
}

i
12

837
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Ejemplo: Un applet que permite dibuja líneas con el ratón:

import java.awt.*;
public class Lineas extends java.applet.Applet {
final int MAXLINES = 10;
Point comienzo[] = new Point[MAXLINES];
Point fin[] = new Point[MAXLINES];
Point ancho;
Point puntoactual;
int lineaactual= 0;

public void init() {

setBackground(Color.white);
}
public boolean mouseDown(Event evt,int x,int y) {
ancho = new Point(x,y);
return true;
}

i
13

838
APLICACIONES BASADAS EN ENTORNO GRÁFICO

public boolean mouseUp(Event evt,int x,int y) {


if (lineaactual<MAXLINES) { addline(x,y); }
else { System.out.println("Demasiadas lineas."); }
return true;
}
public boolean mouseDrag(Event evt,int x,int y) {
puntoactual = new Point(x,y);
repaint();
return true;
}
void addline(int x, int y) {
comienzo[lineaactual] = ancho;
fin[lineaactual] = new Point(x,y);
lineaactual++;
puntoactual = null;
repaint();
}
public void paint(Graphics g) {
g.drawRect(0,0,size().width-1,size().height-1);
for (int i=0; i<lineaactual; i++) {
g.drawLine(comienzo[i].x,comienzo[i].y,fin[i].x,fin[i].y);
}
g.setColor(Color.blue);
if (puntoactual != null) {
g.drawLine(ancho.x,ancho.y,puntoactual.x,puntoactual.y);
}
}
}

i
14

839
APLICACIONES BASADAS EN ENTORNO GRÁFICO

mouseEnter() y mouseExit()

Hay otros métodos relacionados con el movimiento del ratón.

A estos métodos que son mouseEnter() y mouseExit() se accede cuando el puntero del ratón entra y sale del
área del Applet.

Son útiles en programas que usen interfaces.

La sintaxis de ambos es similar a los últimos métodos vistos:

public boolean mouseEnter(Event evt,int x, int y) {

...

public boolean mouseExit(Event evt,int x, int y) {

...

i
15

840
APLICACIONES BASADAS EN ENTORNO GRÁFICO

4. Eventos del teclado

Los eventos del teclado se generan siempre que pulsamos una tecla de nuestro teclado. Podemos tratar las
teclas pulsadas o para entradas de datos como caracteres.

Para capturar un evento de pulsación en el teclado se sobrecargara el método keyDown():

public boolean keyDown(Event evt,int key) {


...
}

El argumento key es un entero representando el carácter ASCII pulsado, incluyendo números, alfanuméricos,
teclas de función, ...

Para usarlos como caracteres basta hacer una conversión de tipos:

teclapulsada = (char)key;

Método KeyUp()

Análogamente a como ocurría con el botón del ratón para capturar un evento de soltado, en el teclado se
sobrecargara el método keyUp():

public boolean keyUp(Event evt,int key) {


...
}

i
16

841
APLICACIONES BASADAS EN ENTORNO GRÁFICO

La clase evento nos proporciona un conjunto de variables para referirse a algunas teclas no-alfanuméricas.

Podemos así testear el nombre de estas teclas en nuestro programa en lugar de sus valores ASCII. Si hemos
de utilizar teclas conviene utilizar éstas.

Por ejemplo si queremos comprobar si la tecla UP (flecha hacia arriba) ha sido pulsada haremos:

if (key == Event.UP) {
...
}

Teclas standard

Es también muy útil para testear las teclas hacer uso de la estructura ya estudiada switch, ya que los valores
de estas variables son enteros.

Las teclas standard definidas son las siguientes:

Variable > Tecla pulsada


Event.HOME > HOME
Event.END > END
Event.PGUP > PAGE UP
Event.PGDN > PAGE DOWN
Event.UP > UP Flecha
Event.DOWN > DOWN Flecha
Event.LEFT > LEFT Flecha
Event.RIGHT > RIGHT Flecha

i
17

842
APLICACIONES BASADAS EN ENTORNO GRÁFICO

El carácter RETURN (line feed) es el número 10 y el carácter ENTER (retorno de carro) es el número 13.
Dependiendo del sistema se trabaja con un carácter u otro.

Si queremos que nuestro programa pueda trabajar en plataformas distintas debemos testear ambos
caracteres.

Ejemplo: Vamos a hacer un Applet que visualice en la coordenada 10,10 la letra que pulsamos desde el
teclado.

import java.awt.*;
import java.applet.Applet;
public class Tecla extends Applet
{
public void init()
{

setBackground(Color.orange);
setForeground(Color.blue);
}

public boolean keyDown(Event e , int key)


{
Graphics g=getGraphics();
g.drawString("Tecla pulsada"+ (char)key,10,10);
return true;
}
}

i
18

843
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Teclas modificadoras

Las teclas SHIFT, CTRL y META (normalmente ALT) son modificadoras y la tecla pulsada tiene un significado
que va a depender de si éstas estaban o no pulsadas.

Podemos manejar estos eventos añadiendo al tratamiento del pulsado una comprobación de si esta pulsada,
por ejemplo, SHIFT. Veámoslo:

public boolean mouseDown(Event evt,int x, int y) {

if (evt.shiftDown()) {
// manejo si SHIFT pulsada
} else {
// manejo si SHIFT no pulsada
}
}

Donde hemos usado la comprobación de si la tecla SHIFT estaba pulsada cuando ocurrió el otro evento:
evt.shiftDown().

Los métodos a usar con teclas modificadoras son:

> shiftDown()
> controlDown()
> metaDown()

i
19

844
APLICACIONES BASADAS EN ENTORNO GRÁFICO

5. El manejador de eventos del AWT

Existe un método genérico que realiza el manejo de los eventos vistos. Es el método handleEvent().

public boolean handleEvent(Event evt) {


...
}

En el método por defecto, lo que se hace es llamar a los métodos vistos antes.

Si queremos tratar de forma distinta los eventos hemos de sobreescribir el método handleEvent().

Es bastante útil usar la estructura switch para tratar los eventos.

Para esto examinaremos la variable instancia ID que es un entero y además la clase Event que define un
conjunto de eventos ID como variables de clase para que nosotros podamos testearlas en el cuerpo de dicho
método.

Pulsa en el botón ejemplo, para ver cómo se podría definir el método.

Ejemplo

public boolean handleEvent(Event evt) {


switch (evt.id) {
case Event.MOUSE_DOWN:
System.out.println("Evento MouseDown: " + evt.x + "," + evt.y);
return true;
case Event.MOUSE_UP:
System.out.println("Evento MouseUp: " + evt.x + "," + evt.y);
return true;
case Event.MOUSE_MOVE:
System.out.println("Evento MouseMove: " + evt.x + "," + evt.y);
return true;
case Event.MOUSE_DRAG:
System.out.println("Evento MouseDrag: " + evt.x + "," + evt.y);
return true;
default:
return false;
}
}

20

845
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Método handleEvent

Hay más identificadores. En total podemos relacionar los siguientes:

Teclado

public boolean handleEvent(Event evt) {


if (evt.id == Event.MOUSE_DOWN) {
// procesado especifico para el click del ratón
return true;
} else {
return super.handleEvent(evt);
}
}

Ratón

Con todos estos eventos podemos sobrecargar el método handleEvent() a nuestras necesidades, pero es
importante conocer que al sobrescribir este método ninguno de los métodos de manejo de eventos son
llamados ya que ocultamos el comportamiento del método de la superclase.

Así, tenemos dos posibilidades:

1. Tratar en nuestra definición todos los posibles eventos y qué hacer ante ellos.

2. Tratar los eventos que queramos tratar de forma particular y llamar al método handleEvent() de la
superclase para que éste trate el resto de eventos.

i
21

846
APLICACIONES BASADAS EN ENTORNO GRÁFICO

i
22

847
APLICACIONES BASADAS EN ENTORNO GRÁFICO

5. Resumen

Has llegado al final de este recurso formativo que denominamos “Gestión de eventos”
En esta lección hemos estudiado los siguientes contenidos:

i
23

848
APLICACIONES
BASADAS EN
ENTORNO
GRÁFICO
El paquete javax.swing

849
ÍNDICE
APLICACIONES BASADAS EN ENTORNO GRÁFICO

1. Los contenedores y componentes de la clase Swing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3


2. Los Botones JButton, JCheckBox, JRadioButton y JToggleButton. . . . . . . . . . . . . . . . . . . . . . .9
3. Los Menús. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16
4. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .29

850
APLICACIONES BASADAS EN ENTORNO GRÁFICO

1. Los contenedores y componentes de la clase Swing


Objetivos

- Conocer la librería Swing.


- Reconocer Los contenedores y componentes de la clase Swing.
- Conocer los Botones JButton, JCheckBox, JRadioButton y JToggleButton
- Saber cómo manejar los menús de la clase Swing.

Librería JFC (Java Foundation Classes)

La librería JFC es un conjunto de librerías destinadas a hacer la parte gráfica de Java.

Java Foundation Class:

- AWT
- Swing
- Java 2D y 3D
- Drag & Drop
- Accesibility

Aunque la Swing es más grande que la AWT, se considera un subconjunto de AWT porque se basa en ella.

i
3

851
APLICACIONES BASADAS EN ENTORNO GRÁFICO

La Clase JComponent

La Clase JComponent va a ser la base de todas las clases de Swing.

Todos los elementos de la Swing son contenedores y pueden contener componentes.

JDialog, JFrame y JApplet son las únicas clases que no derivan de JComponent.

Son ventanas del Sistema Operativo. Contenedores de primer nivel.

i
4

852
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Los contenedores de primer nivel

Los contenedores de primer nivel tienen 3 paneles:

RootPane: raíz o principal; dentro de él tenemos el panel de la barra de menú; y el ContentPane.

El RootPane tiene un Layout de tipo BorderLayout; y está creado automáticamente.

void <JRootPane>.setJMenuBar(JMenuBar menu)

Para añadir la barra de Menú.

JRootPane <JDialog>.getRootPane()
<JApplet>
<JFrame>

i
5

853
APLICACIONES BASADAS EN ENTORNO GRÁFICO

RootPane

Existe un método para establecer la barra de menú sin tener que coger primero el RootPane:

void <JFrame>.setJMenuBar (JMenuBar menu)


<JDialog>
<JApplet>
this.setJMenuBar(barra_menu);
void <JTootPane>.getContentPane()

Para acceder al ContentPage:


Container cp = this.getRootPane().getContentPane();
void <JRootPane>.setContentPane(Container c)

Acceder al ContentPane:
Container <Frame>.getContentPane();

Para establecer la barra de menu sin tener que coger primero el RootPane
void <Container>.add(Component c)

i
6

854
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Añadir elementos al ContentPane

Para añadir elementos al ContentPane.

a. Si se realiza algo como:

ventana.add(componente); // Se produce excepción.

b. Para evitarlo:

ventana.getContentPane().add(componente); //Corr.

En principio podemos cambiar el ContentPane por otro contenedor, pero JSplitPane, JtabbedPane, JScrollPane
no funcionan correctamente. El motivo es que son semitransparentes y para evitarlo se utiliza un método que
lo hace opaco:

void <JComponent> setOpaque(boolean b)

Los JApplet, a diferencia de los Applet, sí podrán tener menús.

Los layout por defecto de los componentes

Los componentes tienen un layout por defecto, que es distinto en el caso de AWT y el de Swing.

En AWT
Frame, Dialog => BorderLayout
Panel, Applet => Flowlayout

En Swing
JFrame, JDialog, JApplet => BorderLayout
JPanel => FlowLayout

i
7

855
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Como crear un Jframe

Los Jframe se crean parecidos a AWT, pero a la hora de añadir se utiliza el método:

ventana.getContentPane().add(componente);

Otra diferencia es que en Swing, cuando se pulsa el botón de cerrar la ventana, la ventana se hace invisible
pero no se destruye. Con esto podemos hacerla visible si lo requerimos más adelante. Cuando está invisible
el hilo está dormido.

void <JFrame> setDefaultCloseOperation(int op);

Sirve para controlar qué debe ocurrir cuando se pulse el botón de cerrar

interface WindowConstants {
public static final int DISPOSE_ON_CLOSE;
public static final int DO_NOTHING_ON_CLOSE;
public static final int HIDE_ON_CLOSE;
}
DISPOSE_ON_CLOSE, libera el recurso.
DO_NOTHING_ON_CLOSE, no hace nada.
HIDE_ON_CLOSE, Oculta el recurso.

Esta interface está implementada por JFrame y JDialog.

this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

i
8

856
APLICACIONES BASADAS EN ENTORNO GRÁFICO

2. Los Botones JButton, JCheckBox, JRadioButton y JToggleButton.


Los Botones:

void <AbstractButton> setEnabled(boolean b)


Activarlo o desactivarlo

Todos los botones tienen, además del texto, un Icono y un Mnemonic (tecla rápida).

void <AbstractButton>.setText(String text)


String <AbstractButton>.getText()
void <AbstractButton>.setIcon(Icon icon)
Icon <AbstractButton>.getIcon()
void <AbstractButton>.setMnemonic(char c)
char <AbstractButton>.getMnemonic()

JButton > Botón pinchable


JChekBox > CheckBox
JRadioButton > Radio Button
JToggleButton > Un botón que cuando se pincha se aplasta y cuando se vuelve a pinchar se levanta.

i
9

857
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Los botones: JButton

Los constructores de JButton son los siguientes:

JButton()
JButton(String text)
JButton(Icon icon)
JButton(String text, Icon icon)

Se le indica al formulario cuál es el botón por defecto

void <JRootPane> setDefaultButton(JButton boton)

Para indicar la posición del texto respecto al icono

void <AbstractButton> setVerticalTextPosition(int pos)

AbstractButton.CENTER (defecto)
AbstractButton.TOP
AbstractButton.BOTTOM
void <AbstractButton>.setHorizontalTextPosition(int pos)
AbstractButton.LEFT
AbstractButton.CENTER
AbstractButton.RIGHT (defecto)

i
10

858
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Eventos de JButton

Se podrá poner una etiqueta personalizada en HTML a JLabel y JButton:

JButton b = new JButton


("<HTML> compre <FONT size=+2> ahora
</FONT>");

Para cambiar el color del texto

void <Component>.setForeground(Color c)

Para cambiar el color del fondo

void <Component>.setBackground(Color c)

Eventos:

- ActionEvent

i
11

859
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Los botones: JcheckBox

Los constructores de JcheckBox son:

JCheckBox()
JCheckBox(String text)
JCheckBox(String text,Icon icon)

Eventos:

- ItemEvent
- ActionEvent

Se produce cada vez que pulsamos en el CheckBox. El más utilizado es el ActionEvent, ya que se utiliza junto
al método:

int <ItemEvent>.getStateChange()

Devuelve el estado del CheckBox. Se puede saber lo que ha ocurrido.

Los botones: JRadioButton

Existe una clase para agruparlos: ButtonGroup (derivada de Object).

void <ButtonGroup> add (AbstractButton b)

i
12

860
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Se añadirán los RadioButton

JRadioButton rojo = new JRadioButton("rojo");


JRadioButton verde = new
JRadioButton("verde",true);
JRadioButton azul = new JRadioButton("azul");
ButtonGroup grupo = new ButtonGroup();
grupo.add(rojo);
grupo.add(verde);
grupo.add(azul);

Los botones: JToggleButton

JTroggleButton es un botón que se aplasta o se desaplasta. Es un booleano. De ella derivan CheckBox y


RadioButton. Se podrán crear grupos de JTroggleButton:

void <ButtonGroup> add(AbstractButton b)

Eventos:

- ItemEvent Para el cambio de estado.


- ActionEvent Para la acción de pulsar.

Cómo usar Icon:

Es una interface que representa iconos. Hay una clase que la implementa, muy usada, ImageIcon que sirve
para crear un icono a partir de un fichero .GIF o .JPEG.

Constructores:

ImageIcon(String filename); // path absoluto o relativo


ImageIcon(URL url)

13

861
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Los botones: JToggleButton

La forma de crear un botón al que le ponemos un icono sería:

ImageIcon i = new ImageIcon ("open.gif");


JButton b = new JButton("Abrir",i);

Es fácil crearse una clase que implemente a Icon, para crear nuestros propios iconos:

interface Icon {
public abstract int getIconHeight();
public abstract int getIconWidth();
public abstract void paintIcon(Component c, Graphics g,
int x, int y); // x,y origen del botón.
}

Retornamos el tamaño del icono y en PaintIcon se pintará.

i
14

862
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Ejemplo

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class IconoPersonal {
public static void main (String [] args) {
JFrame frame = new JFrame("Boton Personal");
frame.setSize(400,400);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent ev) {
System.exit(0);
}
});

// Añadimos el botón
frame.getContentPane().add(new JButton("Aros", new IconoAros()));

// Mostrar la ventana
frame.show();
} // fin de main
} /// fin de la clase

class IconoAros implements Icon {


public int getIconWidth() {
return 16;
}
public int getIconHeight() {
return 16;
}
public void paintIcon(Component c, Graphics g, int x, int y) {
g.setColor(Color.black);
g.drawOval(x,y+4,8,8);
g.drawOval(x+6,y+4,8,8);
}
} // fin de clase

15

863
APLICACIONES BASADAS EN ENTORNO GRÁFICO

3. Los menús

En Swing los menús no están hechos con los menús nativos del Sistema Operativo, sino que son ventanas
dibujadas por Swing pero usando ventanas del Sistema Operativo, por lo que no son componentes ligeros, sino
elementos pesados.

En AWT no derivan de Component. En Swing si derivan de Component e incluso de JComponent.

i
16

864
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Métodos de los menús

JMenuBar
Representa la barra horizontal de Menú. Sólo puede haber una en la ventana. Está formado por varios
elementos JMenu

JMenu
Representa una persiana. Está formado por varios elementos JmenuItem.

JMenultem
Representa una opción de la persiana.

Para colocar los elementos dentro de los Menús, tenemos los métodos:

void <JMenuBar> add(JMenu m)


void <JMenu> add(JMenuItem mi)

Una vez que se ha colocado, se tiene que añadir la barra de menú con el método:

void <JFrame> setJMenuBar(JMenuBar bar)

Para añadir opciones a una persiana:

JMenuItem <JMenu> add (String title)

i
17

865
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Ejemplo 1:

JMenuItem abrir = new JMenuItem("Abrir");


persianaArchivo.add(abrir);

Ejemplo 2:

JMenuItem abrir = persianaArchivo.add(abrir);

Eventos de los menús

Se pueden poner separadores en la persiana, pero en vez de crear una opción con guiones como en AWT,
utilizaremos el método:

void <JMenu> addSeparator()

Los eventos que producen los Menús son ActionEvent

i
18

866
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Estos dos tipos de opciones de Menú, también producen eventos del tipo ItemEvent.
Las opciones podrán tener:

- un texto
- un icono
- una tecla rápida (aparece subrayada)

void <AbstractButton> setMnemonic (char ch)

- una tecla aceleradora (combinación de teclas)

void <JMenuItem> setAccelerator(KeyStroke ks)

KeyStroke

Los objetos de tipo KeyStroke se piden al sistema utilizando la función estática:

static KeyStroke <KeyStroke> getKeyStroke(int key_code, int modifiers)

Key_code

Código de tecla virtual (dentro de la clase KeyEvent)

Modifiers

ALT_MASK, CONTROL_MASK (dentro de la clase KeyEvent)

i
19

867
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Ejemplo:

opcion1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, KeyEvent.ALT_MASK);

Las barras de herramientas

JToolBar es la clase que nos permite crear Barras de Herramientas. Actúa como un contenedor donde
metemos los botones. Para poner una barra de herramientas en una ventana, el ContentPane debe utilizar
BorderLayout.

Por defecto, son Dockable: se pueden poner a cualquier lado de la ventana. Si no se pone borde, queda
flotando. Si no queremos que esto ocurra tenemos el método:

void <JToolBar> setFloatable(boolean b)

Para añadir componentes a una barra:

void <Container> add(Component c)

Cuando añadimos los botones y queremos dejar un espacio entre ellos, podemos hacerlo utilizando el
método>>

void <JSeparator> addSeparator(); // un espacio por defecto


void <JSeparator> addSeparator (Dimension d); // Espacio de d pixeles
class Dimension {
int width;
}

Se debe indicar el alto y el ancho que utilizará uno u otro en función de cómo está colocada la barra de
herramientas.

Ejemplo

20

868
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Cómo hacer un Applet con Swing

Los Applet en Swing están representados por la clase JApplet.

Son parecidos a los Applet excepto porque:

- Pueden tener menú

- A la hora de añadir componentes al Applet, antes hacíamos algo como:

mi_applet.add(componente); // AWT

y ahora haremos:

mi_applet.getContentPane().add(componente); // SWING

Por defecto tiene puesto un BorderLayout; y en AWT tenía un FlowLayout.

i
21

869
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Los paneles en Swing

Los paneles en Swing están representados por JApplet.

Son opacos, pintan todo su fondo de una color gris. Nos viene bien para poner un JPanel como ContentPane,
aunque puede ralentizar el programa cuando dentro de un JPanel se encuentran otros.

Para solucionar esto tenemos el método: (combinando opacos y transparentes ganamos velocidad)

void <JComponent> setOpaque (boolean b)

Por defecto utilizan FlowLayout igual que en AWT. Si se quiere utilizar otro Layout se le indicará en el
constructor de JPanel:

JPanel(LayoutManager m)

i
22

870
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Como referirse el tamaño de los componentes

Todos los componentes tendrán:

- Tamaño mínimo.
- Tamaño preferido.
- Tamaño máximo.

Estos tamaños los utilizará el Layout para determinar dónde y de qué tamaño colocará los componentes. Para
que el Layout pueda preguntar por estos tamaños, se tienen los siguientes métodos:

Dimension <Component>.getMinimumSize()
Dimension <Component>.getPreferedSize()
Dimension <Component>.getMaximumSize()

class Dimension {
int width;
int height;
}

El Layout no siempre hará caso a la respuesta de los métodos.

BorderLayout hace caso a los componentes mínimos que se colocan a los lados.

FlowLayout hace caso al tamaño preferido del componente.

i
23

871
APLICACIONES BASADAS EN ENTORNO GRÁFICO

CardLayout y GridLayout

CardLayout y GridLayout no hacen caso de los tamaños del componente, ocupan todo el espacio del Layout.

GridBayLayout utiliza, por defecto, el tamaño mínimo del componente. Aunque se puede modificar luego el
tamaño del componente.

Ejemplo

JButton b = new JButton ("Aceptar") {


public Dimension getPreferredSize() {
Dimesion d = super.getPreferredSize();
d.height+= 10;
return d;
}
};
Panel p = new Panel (new FlowLayout());
p.add(b);
this.add(p);

Estos métodos se pueden utilizar en Swing pero existen otros métodos para no tener que desarrollarlo como
en el ejemplo anterior:

void <JComponent>.setMinimumSize (Dimension d)


void <JComponent>.setPreferredSize(Dimension d)
void <JComponent>.setMaximumSize (Dimension d)

i
24

872
APLICACIONES BASADAS EN ENTORNO GRÁFICO

JComponent deriva de Component

Con los métodos expuestos, el ejemplo anterior quedaría optimizado de la siguiente manera>>

JButton b = new JButton("Aceptar);


Dimension d = b.getPreferredSize();
d.height+=10;
b.seSizePreferred(d);

Parámetro Align

El parámetro Align, en cuanto a los tamaños del componente, nunca hace caso al máximo y se utiliza en el
caso de usar BoxLayout.

Los componentes además tendrán alineación vertical y horizontal respecto al contenedor.

void <JComponent>.setAlignamentX (float align)


void <JComponent>.setAlignamentY (float align)

El parámetro Align se define con las siguientes constantes:

TOP_ALIGNAMENT
(0.0)

LEFT_ALIGNAMENT CENTER_ALIGNAMENT RIGHT_ALIGNAMENT


(0.0) (0.5) (1.0)

BOTTOM_ALIGNAMENT
(1.0)

Sólo el BoxLayout tiene en cuenta estos alineamientos. Los antiguos Layouts no los toman en cuenta.

i
25

873
APLICACIONES BASADAS EN ENTORNO GRÁFICO

El Layout BoxLayout

Layout BoxLayout sólo lo utiliza Swing y permite colocar los componentes en filas o en columnas.

Respeta tanto el mínimo como el máximo y el preferred. También permite la alineación vertical y horizontal.

Constructor:

BoxLayout (Container c, int axis)

Donde el parámetro Axis toma el valor de las siguientes constantes:

BoxLayout.X_AXIS
BoxLayout.Y_AXIS

Reglas para colocar los componentes en la vertical:

Intenta dar a los componentes su tamaño preferido, pero intentado conseguir que todos los
componentes ocupen toda la vertical.

Si los componentes no ocupan toda la vertical redimensiona los componentes para que ocupen
toda la vertical pero siempre respetando el MaximumSize y el MinimumSize.

Respecto a la horizontal:

Intenta dar a los componentes el ancho del componente más ancho, pero de nuevo respeta el
MinimumSize y el MaximumSize. De forma que si algún componente no puede hacelo más ancho
no lo hace.

En el caso de que algún componente no se pueda hacer todo lo ancho que se necesite entra en
juego las alineaciones X e Y.

i
26

874
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Los Paneles Deslizanes (JScrollPane)

Los paneles deslizantes (JScrollPane) son paneles con barras de scroll dentro de los cuales se pueden colocar
componentes más grandes. La parte que se ve del componente dentro del JScrollPane se llama viewpart.

Se utilizan mucho para poner barra de scroll a los componentes Swing, ya que los componentes Swing por sí
solos no tienen barras de scrolls.

JTextArea no tiene barra de scroll.

Ejemplo:

JTextArea cajaTexto = new JTextArea (80,25);


JScrollPane panel = new JScrollPane(cajaTexto);

// Se refiere a la ventana principal.

getContentPane().setPreferredSize(new Dimension (400,400));


getContentPane().add(panel,BordeLayout.CENTER);

Cambiar el Look & Feel de los componentes

Para los componentes Swing existen varios LOOK & FEEL de los componentes.

Para cambiar el LOOK & FEEL se tiene la siguiente función estática:

static void <UIManager>.setLookAndFeel (LookAndFeel lf)

i
27

875
APLICACIONES BASADAS EN ENTORNO GRÁFICO

Están implementados por clases y las clases más conocidas son las siguientes:

javax.swing.plaf.metal.MetalLookAndFeel
com.sun.java.swing.plaf.motif.MotifLookAndFeel // Para UNIX.
com.sun.java.swing.windows.WindowsLookAndFeel // Para Window.
com.sun.java.swing.plaf.beos.BeOSLookAndFeel // Para BeOs.

Para hacerlo al principio del programa (main o init):

try {
UIManager.setLookAndFeel (
new com.sun.java.swing.plaf.windows.WindowsLookAndFeel());
}
catch (Exception ex) { }

Para realizarlo en otra parte del programa se tiene la siguiente función:

static void <SwingUtilities>.updateComponentTreeUI (Component c)

i
28

876
APLICACIONES BASADAS EN ENTORNO GRÁFICO

4. Resumen

Has llegado al final de este recurso formativo que denominamos “El paquete javax.swing”
En esta lección hemos estudiado los siguientes contenidos:

i
29

877
APLICACIONES BASADAS EN ENTORNO
GRÁFICO – Caso práctico
Módulo: APLICACIONES BASADAS EN ENTORNO GRÁFICO – Caso práctico
Realiza un programa Java consistente en la realización de un menú de Windows.

El Menú tendrá la opción Base de Datos, con las subopciones Conectar, Desconectar y Salir. Entre la
opción Desconectar y Salir se introducirá una barra de separación.

La distribución de la ventana será una BorderLayout, y en la zona sur añadiremos un label (Estado:)
que nos irá informando de la opción pulsada a medida que vayamos pulsando en cada opción de menú.
La información será cambiar el texto del Label.

878
APLICACIONES BASADAS EN ENTORNO
GRÁFICO – Caso práctico
Módulo: APLICACIONES BASADAS EN ENTORNO GRÁFICO – Caso práctico
Realiza un programa Java que sea un Applet en el que tengamos la opción de poder pintar sobre él como
si se tratase de un Paint de Windows. El ratón será el pincel. Con él pintaremos sobre la superficie del
Applet.

Tendremos 3 botones para elegir el color del pincel ( rojo, verde o azul) y también tendremos una caja
de texto para elegir el grosor del pincel con el que pintamos, pondremos el tamaño y pulsaremos en
un botón Ok.

879
 

Módulo 8:
Acceso a datos en Java

   

880
ACCESO A DATOS
EN JAVA

881
ACCESO A DATOS EN JAVA

Fundamentos del lenguaje SQL

LMD (Lenguaje de manipulación de datos)

SELECT

SELECT [DISTINCT] <lista_columnas> | *


FROM <lista_tablas>
[WHERE <predicado>]

EJ: Visualizar todos los vuelos que tengan como origen o destino Cáceres.

SELECT *
FROM VUELOS
WHERE ORIGEN=’CACERES’
OR DESTINO=’CACERES’

EJ: Visualizar todos los vuelos que tengan como origen Madrid o Londres y como destino Londres o Madrid.

SELECT *
FROM VUELOS
WHERE (ORIGEN=’MADRID’
AND DESTINO=’LONDRES’)
OR (ORIGEN=’LONDRES’
AND DESTINO=’MADRID’)

Claúsula IN

Expresa la pertenencia del valor de una columna a un determinado conjunto de valores.

EJ: Seleccionar aquellos vuelos que tengan como origen Madrid, Barcelona o Sevilla.

SELECT *
FROM VUELOS
WHERE ORIGEN IN (‘MADRID’,’BARCELONA’,’SEVILLA’)

O también

SELECT *
FROM VUELOS
WHERE ORIGEN=’MADRID’ OR ORIGEN=’BARCELONA’ OR ORIGEN=’SEVILLA’
2

882
ACCESO A DATOS EN JAVA

EJ: Visualizar todos los vuelos existentes excepto aquellos que llegan a Londres o a Copenhague.

SELECT *
FROM VUELOS
WHERE DESTINO NOT IN (‘LONDRES’,’COPENHAGUE’)

Claúsula BETWEEN

Sirve para establecer o expresar un rango de valores. Obedece a la siguiente sintaxis:

<nombre_columna> BETWEEN valor1 AND valor2

El rango será [valor1, valor2], extremos incluidos.

EJ: Recuperar todos los vuelos que salgan entre las 6 y las 12 de la mañana.

SELECT *
FROM VUELOS
WHERE HORA_SALIDA BETWEEN ‘06.00.00’
AND ‘12.00.00’

ó también

SELECT *
FROM VUELOS
WHERE HORA_SALIDA >= ‘06.00.00’
AND HORA_SALIDA <= ‘12.00.00’

EJ: En la columna NUM_VUELO representaré los vuelos con 6 caracteres. Los dos primeros caracteres
indicarán la compañía a la que pertenece cada vuelo (IB®Iberia, BA®British Airways), los cuatro caracteres
siguientes corresponderán al número de vuelo. Bajo estas condiciones recupérense todos los vuelos que no
pertenecen a IBERIA.

SELECT *
FROM VUELOS
WHERE NUM_VUELO NOT BETWEEN ‘IB0000’
AND ‘IB9999’

883
ACCESO A DATOS EN JAVA

Claúsula LIKE

Sirve para especificar, con la ayuda de metasímbolos, cadenas de caracteres que comparten ciertos
caracteres en común. Los metasímbolos que serán utilizados son:

% Equivale a una cadena de caracteres de longitud comprendida entre 0 y n.


‘AB%‘ AB, ABCDE, AB 497

_ Equivale a un único carácter


‘A_B’ A B, A4B, AJB

EJ: Recuperar todos los vuelos pertenecientes a la compañía IBERIA.

SELECT *
FROM VUELOS
WHERE NUM_VUELOS LIKE ‘IB%‘

O también

SELECT *
FROM VUELOS
WHERE NUM_VUELOS LIKE ‘IB_ _ _ _‘

Expresiones aritméticas
+, -, *, /
Pueden ser utilizadas tanto después de SELECT como después de WHERE. En el primer caso trabajarían sobre
columnas y en el segundo sobre filas.

EJ: Visualizar la longitud y la envergadura de todos los aviones, expresando las magnitudes en pies (en la base
de datos está almacenado en metros, para pasar 1 metro a pies se ha de multiplicar por 3.28), y la velocidad
de crucero en mph (está en Km/h, habrá que dividir por 1.6).

SELECT LONGITUD*3.28, ENVERGADURA*3.28, VELO_CRUC/1.6


FROM AVIONES

Etiquetas ®
———— ———— ———-
———— ———— ———-
———— ———- ———

884
ACCESO A DATOS EN JAVA

En DB/2 de IBM las etiquetas toman los nombres de las columnas (col1, col2, col3)
En SQL-SERVER las etiquetas quedarían así (LONGITUD*3.28, ENVERGADURA*3.28, VELO_CRUC/1.6)

EJ: Relación entre la longitud y la envergadura de todos los aviones.

SELECT LONGITUD/ENVERGADURA
FROM AVIONES

EJ: Seleccionar aquellos aviones cuya longitud supere a su envergadura en más de un 10%.

SELECT *
FROM AVIONES
WHERE LONGITUD > ENVERGADURA*1.10

Funciones de columna

Son funciones que operan con todas las filas que cumplen la condición expuesta en la claúsula WHERE. Su
resultado es un único valor. Sintaxis:

1º) <f_columna> ([DISTINCT] <nombre_columna>)


2º) <f_columna> (<expresión>), donde <expresión> es una expresión aritmética en la cual debe
participar, al menos, una columna.
3º) COUNT(*)

Funciones

<f_columna>:

MIN: Calcula el valor mínimo de una columna.


MAX: Calcula el valor máximo de una columna.
AVG: Calcula la media aritmética de una columna.
SUM: Calcula la suma de todos los campos de una columna.
COUNT: Cuenta el nº de filas de una columna.

885
ACCESO A DATOS EN JAVA

COUNT(A)=COUNT(B)
COUNT(A)=4, COUNT(B)=4
El COUNT de dos columnas de una misma tabla es igual. COUNT(*) sirve para obtener el nº de filas.

EJ: Seleccionar los valores mínimo y máximo de la columna que almacena las velocidades de crucero.

SELECT MIN(VELO_CRUC), MAX(VELO_CRUC)


FROM AVIONES

EJ: Averiguar a qué hora parte el primer vuelo hacia Madrid.

SELECT MIN (HORA_SALIDA)


FROM VUELOS
WHERE DESTINO=’MADRID’

Regla que cumplen las funciones de columna

La función de columna sólo podrá especificarse detrás de la particula SELECT o en la claúsula HAVING, pero
nunca dentro de la claúsula WHERE.

EJ: Se desea saber cuál es el vuelo que tiene la mínima hora de salida.

SELECT *
FROM VUELOS
WHERE HORA_SALIDA=(SELECT MIN(HORA_SALIDA) FROM VUELOS)

Claúsula GROUP BY-HAVING

Sirve para dividir una tabla en grupos de filas que comparten características comunes. La sintaxis es:

SELECT <lista_columnas>, <funciones_de_columna>


FROM <lista_tablas>
[WHERE <predicado>]
[GROUP BY <lista_columnas>]
[HAVING <predicado>]

886
ACCESO A DATOS EN JAVA

EJ: Efectúese una SELECT que visualice el mínimo valor de hora de salida para cada uno de los diferentes
destinos.

SELECT DISTINCT DESTINO


FROM VUELOS

SELECT MIN(HORA_SALIDA)
FROM VUELOS
WHERE DESTINO LIKE ‘%‘

A continuación se muestra un ejemplo de lo que no se debe hacer:

SELECT MIN(HORA_SALIDA)
FROM VUELOS
WHERE DESTINO IN (SELECT DISTINCT DESTINO
FROM VUELOS)

Sentencia GROUP BY:

SELECT DESTINO, MIN(HORA_SALIDA)


FROM VUELOS
GROUP BY DESTINO

Tabla VUELOS ® Tabla auxiliar ® Tabla x ‘MADRID’


WHERE GROUP BY DESTINO Tabla y ‘BARCELONA’
Tabla z ‘SEVILLA’
<f_columna>

GROUP BY crea una serie de subtablas compuestas por filas con el mismo valor para la columna de
agrupamiento (en este ejemplo la columna DESTINO). Se aplicarán a continuación funciones de columna
sobre cada subtabla de forma independiente.

MADRID, x
BARCELONA, y
SEVILLA, z

887
ACCESO A DATOS EN JAVA

No se puede poner en GROUP BY un campo que no se haya incluido en la sentencia SELECT.

EJ: Obtener el origen del vuelo para cada uno de los vuelos que tienen la mínima hora de salida para cada
uno de los destinos.

EJ: Obtener el número de vuelos que existen para cada uno de los orígenes.

SELECT ORIGEN, COUNT(*)


FROM VUELOS
GROUP BY ORIGEN

Claúsula HAVING

Permite elegir aquellos grupos que se quieren visualizar.

EJ: Visualizar los grupos que tienen para cada uno de los orígenes la mínima hora de salida siendo anterior
a las 12 horas.

SELECT ORIGEN, MIN(HORA_SALIDA)


FROM VUELOS
GROUP BY ORIGEN
HAVING MIN(HORA_SALIDA) < ‘12.00’

HAVING no interferirá en la agrupación por filas de GROUP BY.

EJ: Se desea seleccionar la hora de salida más temprana para cada origen y destino.

SELECT ORIGEN, DESTINO, MIN(HORA_SALIDA)


FROM VUELOS
GROUP BY ORIGEN, DESTINO

EJ: Visualizar los orígenes que tengan más de dos vuelos.

SELECT ORIGEN
FROM VUELOS
GROUP BY ORIGEN
HAVING COUNT(*) > 2

888
ACCESO A DATOS EN JAVA

EJ: Visualizar los vuelos de IBERIA que tengan más de 150 plazas libres.

SELECT NUM_VUELO, SUM(PLAZAS_LIBRES)


FROM RESERVAS
GROUP BY NUM_VUELO
HAVING NUM_VUELO LIKE ‘IB%‘
AND SUM(PLAZAS_LIBRES)>150

O también

SELECT NUM_VUELO, SUM(PLAZAS_LIBRES)


FROM RESREVAS
WHERE NUM_VUELO LIKE ‘IB%‘
GROUP BY NUM_VUELO
HAVING NUM_VUELO ‘IB%‘
AND SUM(PLAZAS_LIBRES)>150

889
ACCESO A DATOS EN JAVA

TRATAMIENTO DE NULOS

Operaciones aritméticas

Cualquier operación aritmética sobre un campo nulo nos devolverá como resultado un valor nulo.
Tomemos como ejemplo la siguiente tabla:

NULOS

SELECT COL_A+COL_B
FROM NULOS

COL_A+COL_B
25
70
NULL
NULL
NULL
117
93
NULL
NULL

10

890
ACCESO A DATOS EN JAVA

Funciones de columna

Ignoran los campos NULL, exceptuando la función COUNT.

SELECT AVG(COL_A)
SELECT SUM(COL_A)/COUNT(*)

AVG(COL_A)=46
SUM(COL_A)/COUNT(*)=25.5

Comparaciones

Dos valores nulos no son iguales ni son distintos, sino indeterminados.

SELECT *
FROM NULOS
WHERE COL_A=COL_B

COL_A COL_B
35 35

SELECT *
FROM NULOS
WHERE COL_A<>COL_B

COL_A COL_B
15 10
140 NULL
NULL 100
7 110
33 60

SELECT *
FROM NULOS
WHERE COL_A IS NULL

Esta orden visualiza todas las filas en las que el campo perteneciente a la columna COL_A es nulo.

11

891
ACCESO A DATOS EN JAVA

Ordenación

Dependiendo del sistema gestor en uso los valores nulos serán los de mayor o los de menor peso.

DB/2 de IBM:

NULL ® Mayor peso. En ordenación ascendente serán los últimos.

SELECT COL_A
FROM NULOS
ORDER BY COL_A

COL_A
7
15
33
35
140
NULL
NULL
NULL
NULL

SQL-SERVER:

NULL ® Menor peso. En ordenación ascendente serán los primeros.

SELECT COL_A
FROM NULOS
ORDER BY COL_A

COL_A
NULL
NULL
NULL
NULL
7
15
33
33
140
12

892
ACCESO A DATOS EN JAVA

DISTINCT

No elimina los valores nulos repetidos.

SELECT DISTINCT COL_A


FROM NULOS

COL_A
15
35
140
NULL
NULL
7
33
NULL
NULL

Índices únicos

Sobre una columna de índice único sólo está permitida la existencia de un valor nulo.

CREATE UNIQUE INDEX IXNULOS


ON NULOS
(COL_A)

Devolvería un error, ya que existe más de un campo con NULL.


Para este caso los nulos se interpretan como valores iguales.

GROUP BY

Todos los nulos quedarán agrupados en el mismo grupo.

SELECT COL_A, COUNT(*)


FROM NULOS
GROUP BY COL_A

13

893
ACCESO A DATOS EN JAVA

COL_A COUNT(*)
15 1
35 1
140 1
NULL 4
7 1
33 1

Todos los valores NULL se agrupan y COUNT devuelve el número de filas que tenían NULL en COL_A.

SUBSELECT

Responde a la siguiente sintaxis:

SELECT <lista_columnas>
FROM <lista_tablas>
WHERE <nombre_columna> <CONCATENADOR> (SELECT <nombre_columna>
FROM <lista_tablas>
WHERE <Predicado>)
<CONCATENADOR>

Puede ser un operador de comparación o la claúsula IN


Operadores de comparación: >,<,>=,<=,=,<>

Restricciones: ha de exigirse que el resultado de la Subselect sea un único valor al usar como concatenador
un operador de comparación. Si usamos IN puede devolver más de un valor.

Cada Select se ejecuta una única vez, desde la más interna, hasta la más externa.

EJ: Se desea recuperar las plazas libres que hay en cada vuelo MADRID-LONDRES del día 20/02/92.

{Las plazas libres es un campo de la tabla de reservas. En la tabla de vuelos tenemos el origen y el destino
de cada vuelo.}

SELECT *
FROM RESERVAS
WHERE FECHA_SALIDA=’20.02.1992’
AND NUM_VUELO IN(SELECT NUM_VUELO
FROM VUELOS
WHERE ORIGEN=’MADRID’
AND DESTINO=’LONDRES’)
14

894
ACCESO A DATOS EN JAVA

ANY, ALL

Se usan para poder utilizar operadores de comparación con subselects que nos devuelvan más de un valor
único como resultado.

SELECT <lista_columna>
FROM <lista_tablas>
WHERE <nombre_columna> <CONCATENADOR> {ANY/ALL} (<Subselect>)

Una expresión ANY es cierta si lo es para algún valor de los que devuelve la Subselect.
Una expresión ALL es cierta si lo es para todos los valores que devuelve la Subselect.

3>ANY(2,5,7) ® Cierto
3=ANY(2,5,7) ® Falso
3>ALL(2,5,7) ® Falso
3<ALL(9,10,11) ® Cierto

EJ: Se quieren recuperar los aviones cuya longitud sea mayor que la envergadura de todos ellos.

SELECT *
FROM AVIONES
WHERE LONGITUD > ALL (SELECT ENVERGADURA
FROM AVIONES)

O también

SELECT *
FROM AVIONES
WHERE LONGITUD > (SELECT MAX(ENVERGADURA)
FROM AVIONES)

=ANY e IN tienen la misma función.

3=ANY(2,3,5) y 3 IN (2,3,5) devuelven ambos Cierto.

15

895
ACCESO A DATOS EN JAVA

Subselects correlacionadas

Son un tipo especial de subselect. La sintaxis es similar:

SELECT <lista_columnas>
FROM <nombre_tabla_externa>
WHERE <nombre_columna> <CONCATENADOR> (SELECT <nombre_columna>
FROM <nombre_tabla_interna>
WHERE <Predicado>)
En <Predicado> habrá una sentencia del tipo

<nombre_columna_tabla_interna> <operador> <nombre_columna_tabla_externa>

Las formas de ejecutar una subselect ordinaria y unas correlacionadas son diferentes. Las subselects
correlacionadas obedecen al siguiente algoritmo:

ALGORITMO Subselect_Correlacionada

1. Seleccionar fila de tabla externa


2. Ejecutar SELECT interno
3. Evaluar la condición del WHERE externo
- Cierto: la fila seleccionada en 1 será una fila de salida
4. Si existe alguna fila más en la tabla externa ir al paso 1

EJ: Se desea recuperar las reservas cuyo número de plazas libres sea mayor que la media para ese mismo
vuelo.

SELECT *
FROM RESERVAS, A
WHERE PLAZAS_LIBRES > (SELECT AVG(PLAZAS_LIBRES)
FROM RESERVAS
WHERE NUM_VUELO=A.NUM_VUELO)
RESERVAS

NUM_VUELO FECHA_SALIDA PLAZAS_LIBRES

IB740 20.02.92 5
IB740 25.02.92 15
IB740 03.03.92 10

AVG(PLAZAS_LIBRES)=10
16

896
ACCESO A DATOS EN JAVA

Alias

Es un sobrenombre que se le da a una tabla y que debe ser único para toda la consulta. Se escribe dejando
un blanco detrás del nombre de la tabla a la cual se va a calificar.

EJ: Se quiere recuperar los aviones que tienen menos de 1 hora y cuarto de recorrido como término medio.

VUELOS

NUM_VUELO ORIGEN DESTINO DISTANCIA

B747 MADRID LONDRES 10000


B747 MADRID PARIS 4000

AVIONES

NUM_VUELO VELO_CRUC

............ ............

v=e/t, t>e/v, 1.25>e/v, v*1.25 > AVG(DISTANCIA)


SELECT AVIONES SELECT VUELOS

SELECT *
FROM AVIONES
WHERE 1.25*VELO_CRUC > (SELECT AVG(DISTANCIA)
FROM VUELOS
WHERE NUM_VUELO=AVIONES.NUM_VUELO)

EXISTS-NOT EXISTS

Se define para comprobar la existencia o ausencia del valor devuelto por una Subselect. Una expresión con
EXIST devuelve Cierto si la Subselect nos devuelve al menos un valor.

WHERE EXISTS (<Subselect>) ¬ Cierto

17

897
ACCESO A DATOS EN JAVA

EJ: Seleccionar toda la información de vuelos para aquellos que tengan origen Madrid y en los que queden
plazas libres.

SELECT *
FROM VUELOS
WHERE ORIGEN=’MADRID’
AND EXISTS (SELECT *
FROM RESERVAS
WHERE PLAZAS_LIBRES > 0
AND NUM_VUELO=VUELOS.NUM_VUELO)

EJ: Obtener los tipos de avión y capacidades para aquellos en los que queden menos de 30 plazas libres
(JOIN).

ORDER BY

Se define para ordenar la salida de una consulta por los campos que se especifiquen a continuación.

Sintaxis:

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

ORDER BY <especificación de columna><orden>{,<especificación de columna><orden>}

<especificación de columna>=<nombre de columna>|<posición de columna>


<orden>=ASC|DESC

Ej: Obtener el número de plazas libres que quedan para cada vuelo y ordenar el resultado de más a menos
plazas libres. Para igual número de plazas ordénese por número de vuelo.

SELECT NUM_VUELO, SUM(PLAZAS-LIBRES)


FROM RESERVAS
GROUP BY NUM_VUELO
ORDER BY 2 DESC, NUM_VUELO

18

898
ACCESO A DATOS EN JAVA

UNION-UNION ALL

Se define para recuperar, usando una única consulta, información que se obtiene a partir de más de una
consulta.

Sintaxis:

<SELECT>
UNION [ALL]
<SELECT>
{UNION[ALL]
<SELECT>}

Características:

Cada SELECT devuelve un conjunto de filas. La unión será la tabla resultado.

Condiciones de cada estructura SELECT:

- Todas deben ser iguales o compatibles una a una. Esto supone que por cada columna tengamos un único tipo
de dato.

- Pueden ser completas (WHERE, GROUP BY,...), exceptuando la cláusula ORDER BY, que se ubicará al final
de la última SELECT.

UNION sin ALL proporciona un resultado sin filas duplicadas.

Ej: Sacar una lista de todas aquellas ciudades para las que haya vuelo, ordenadas alfabéticamente.

SELECT ORIGEN
FROM VUELOS
UNION
SELECT DESTINO
FROM VUELOS
ORDER BY 1

19

899
ACCESO A DATOS EN JAVA

Catálogo del sistema o diccionario de datos:

Es el alma de un sistema gestor. Se define como un conjunto de tablas que forman una base de datos, y son
definidas y mantenidas automáticamente por el sistema gestor. Sirven para almacenar información sobre los
objetos definidos por los usuarios.

SELECT *
FROM VUELOS

1- El sistema busca en el catálogo si existe la tabla VUELOS.


2- Verifica si el usuario tiene acceso a esa información.
3- Se pregunta cuáles y cuántas columnas tiene la tabla VUELOS.

DB2 IBM:

SYSTABLES: una fila por cada tabla definida en la instalación.


SYSCOLUMNS: una fila por cada columna definida.
SYSINDEXES: una fila por cada índice definido.
SYSVIEW: una fila por cada vista.
SYSTABAUTH: una fila por cada autorización definida.

Todas las tablas son directamente consultadas por usuarios autorizados.


ADM (Administrador): es la persona que concede autorizaciones a los usuarios.
Un usuario autorizado puede efectuar operaciones del tipo:

SELECT *
FROM SYSTABLES
WHERE NAME=’RESERVAS’

NAME DBNAME CARD


RESERVAS AEROPUERTO ..........

DBNAME: nombre de la BdD a la que pertenece la tabla.


CARD: nº de filas de la tabla.
OWNER: usuario creador de la tabla.

SELECT *
FROM SYSCOLUMNS
WHERE DBNAME=’RESERVAS’

20

900
ACCESO A DATOS EN JAVA

Nos da la información sobre todas las columnas que pertenecen a la tabla reservas.

NAME TBNAME COL_NO COL_TYPE LENGTHNULLS


NUM_VUELO RESERVAS 1 CHAR 6 N
FECHA_SALIDA RESERVAS 2 DATE 8 N

TBNAME: nombre de la tabla.


COL_NO: posición de la columna en la tabla.
COL_TYPE: tipo de dato
LENGTH: longitud del dato de la columna.
NULLS: indica si se permite valor nulo.

Ej: Obténgase la última hora de salida para cada destino de los vuelos realizados por aviones capaces de
almacenar más combustible que un tercio de la media que pueden almacenar los demás aviones.

SELECT DESTINO, MAX(HORA_SALIDA)


FROM VUELOS
WHERE TIPO_AVION IN (SELECT TIPO
FROM A
WHERE COMBUSTIBLE>1/3*(SELECT AVG(COMBUSTIBLE)
FROM AVIONES
WHERE TIPO<>A.TIPO)

Ej: Crear una vista sobre la tabla vuelos con las columnas ORIGEN y DESTINO para aquellos vuelos que no sean
de IBERIA. Visualizar el contenido de la lista para los vuelos que no partan de Madrid. Borrar la vista.

CREATE VIEW V_VUELOS


(V_ORIGEN, V_DESTINO)
AS SELECT ORIGEN, DESTINO
FROM VUELOS
WHERE NUM_VUELO NOT LIKE ‘IB%‘

SELECT *
FROM V_VUELOS
WHERE V_ORIGEN<>’MADRID’

DROP VIEW V_VUELOS

21

901
ACCESO A DATOS EN JAVA

Ej: Visualice los tipos de avión, el doble de su longitud y la mitad de su envergadura, para aquellos aviones
con envergadura mayor que la media y que realizan vuelos desde o hacia Barcelona, ordenándolos de mayor
a menor longitud.

SELECT TIPO_AVION, 2*LONGITUD, .5*ENVERGADURA


FROM AVIONES, VUELOS
WHERE ENVERGADURA>(SELECT AVG(ENVERGADURA)
FROM AVIONES)
AND
AVIONES.TIPO_AVION=VUELOS.TIPO_AVION
AND
(ORIGEN=’BARCELONA’ OR DESTINO=’BARCELONA)
ORDER BY 2 DESC

Ej: Visualice las tres primeras letras de los orígenes y destinos de los vuelos realizados por aviones con
longitud mayor con longitud mayor que la media y envergadura menor que 2/3 de la máxima envergadura,
ordenados alfabéticamente por destino.

SUBSTRING (SQL)
(SUBSTRNG), (DB2)

SUBSTRING (string, posición, nºcaracteres)


¯
nom_col / cadena con comillas (“)

SELECT SUBSTRING (ORIGEN, 1, 3), SUBSTRING (DESTINO, 1, 3)


FROM VUELOS
WHERE TIPO_AVION IN (SELECT TIPO
FROM AVIONES
WHERE LONGITUD > (SELECT AVG(LONGITUD)
FROM AVIONES)
AND ENVERGADURA*3/2 < (SELECT MAX(ENVERGADURA)
FROM AVIONES)
ORDER BY 2

22

902
ACCESO A DATOS EN JAVA

Ej: Visualice el total de plazas libres por número de vuelo para aquellos realizados desde Madrid a Barcelona
o Sevilla y que recorran una distancia mayor que la media de todos los vuelos que salen de Madrid,
ordenándolos de menor a mayor.

SELECT SUM(PLAZAS_LIBRES), NUM_VUELO


FROM RESERVAS, VUELOS
WHERE RESERVAS, NUM_VUELO=VUELOS.NUM_VUELO
AND ORIGEN=’MADRID’
AND DESTINO IN (‘BARCELONA’, ‘SEVILLA’)
AND DISTANCIA > (SELECT AVG(DISTANCIA)
FROM VUELOS
WHERE ORIGEN=’MADRID’)
ORDER BY 1

Ej: Obtener para cada número de vuelo el total de plazas libres de los vuelos que recorran distancias menores
que 2/3 de la media de las distancias recorridas por vuelos de otras compañías.

SELECT NUM_VUELOS, SUM(PLAZAS_LIBRES)


FROM RESERVAS, VUELOS ¬ V
WHERE RESERVAS.NUM_VUELO=VUELOS.NUM_VUELOS
AND DISTANCIA*3/2 < (SELECT AVG(DISTANCIA)
FROM VUELOS
WHERE SUBSTRING (NUM_VUELO, 1, 2) <>
SUBSTRING (VUELOS.NUM_VUELO, 1, 2)

23

903
ACCESO A DATOS EN JAVA

TEORIA DE LA NORMALIZACION

Introducción:

Nos basaremos en la siguiente tabla:

Bibliografía: Diseño y Gestión de Bases de Datos. Angle Lucas.

Se plantean una serie de problemas:

Redundancia: cuando un autor tiene varios libros, se repite la nacionalidad.

Anomalías de modificación: si Ad.Mig. y Ma.Piat. desean cambiar de editor, se modifica en los 2 lugares. A
priori no podemos saber cuántos autores tiene un libro. Los errores son frecuentes al olvidar la modificación
de un autor. Se pretende modificar en un sólo sitio.

Anomalías de inserción: se desea dar de alta un autor sin libros, en un principio. NOMBRE y COD_LIB son
campos clave, una clave no puede tomar valores nulos.

Teoría de la normalización: la teoría de la normalización ofrece una serie de reglas para efectuar una
modelización óptima.

24

904
ACCESO A DATOS EN JAVA

La tabla anterior debería dividirse en 3 tablas:

AUTORES (NOMBRE, NACION)


LIBROS (COD_LIB, TITULO, EDITOR)
ESCRIBE (NOMBRE, COD_LIB)

En los años 70 Codd creó las bases de la teoría de la normalización. A cada regla de la teoría la denominó
forma normal. Codd creó las formas normales 1ª, 2ª y 3ª. La 3ª forma normal originó problemas. Boyce ayudo
a solventarlos con la f.n. de Boyce-Codd (FNBC). A finales de los 70 Fagin creó las formas normales 4ª y 5ª.

Las formas normales se basan en el concepto de dependencia, que comprende las restricciones definidas
sobre los atributos de una relación. Existen diferentes tipos de dependencia:

- Dependencias funcionales (Formas normales 1ª, 2ª y 3ª y FNBC)


- Dependencias multivaluadas (4ª forma normal)
- Dependencia de JOIN (5ª forma normal)

Formas normales

1ª forma normal: es una restricción inherente del modelo relacional. Se dice que una tabla está en 1ª forma
normal si no existen en ella grupos repetitivos.

Una tabla no puede tener en un campo más de un valor.

TITULO AUTOR
CyD Ad.Mig.
Ma.Piat.

Hay un grupo repetitivo. De este modo la tabla no es plana y no está en 1ª forma normal. Para convertirla a
1ª forma normal:

TITULO AUTOR
CyD Ad.Mig.
CyD Ma.Piat.

25

905
ACCESO A DATOS EN JAVA

2ª forma normal: partimos de la idea de dependencia funcional: un atributo o conjunto de atributos B


depende funcionalmente de A sólo si a cada valor de A le corresponde un único valor de B:

A ® B <=> a cada valor de A le corresponde un único valor de B

A B
x1 y1
x2 y2
x3 y3

Ej: DNI depende funcionalmente de NOMBRE y NOMBRE de DNI

DNI ® NOMBRE
NOMBRE ® DNI

NOMBRE ¨ DNI

Ej: DIRECCION depende funcionalmente de DNI, pero DNI no depende funcionalmente de DIRECCION

DNI ® DIRECCION

DIRECCION -/® DNI

Ej: TITULO, LIBRO no dependen funcionalmente de DNI, AUTOR, porque un autor puede escribir varios libros

DNI, AUTOR -/® TITULO, LIBRO

Ej: Se tiene una base de datos de pluriempleados:

Atributos: DNI, EMPRESA, SUELDO

DNI -/® EMPRESA


DNI -/® SUELDO

Se puede concatenar atributos, obteniendo:

DNI, EMPRESA ® SUELDO

26

906
ACCESO A DATOS EN JAVA

Sueldo es el atributo implicado que depende de DNI y EMPRESA juntos, que son atributos implicantes.
También:

DNI ® NOMBRE, DIRECCION

Las 3 primeras formas normales más la forma normal de Boyce-Codd se basan en dependencias funcionales
obedeciendo al siguiente teorema:

Dada una relación R con un conjunto de atributos A que cumple R(A), x®y, es posible una descomposición en
dos tablas de la siguiente manera:

R(A), x®y

R(x,y) es una relación compuesta por los atributos que forman la dependencia funcional
R(A-y) es una relación compuesta por los atributos de R excluyendo el atributo implicado

R(A)=R(x, y) R(A-y) el JOIN de ambas forma la relación original.

Las relaciones a partir de ahora se definirán como un conjunto de atributos con dependencias funcionales
R(A, DF).

Para normalizar la tabla habrá que conocer todas las dependencias funcionales, pero en la relación que nos
den sólo tendremos algunas, a partir de las cuales podremos hallar el resto.

Aplicaremos las propiedades de las dependencias funcionales para obtener todo el conjunto de posibles
dependencias funcionales que puedan existir en la relación.

Al conjunto inicial de dependencias funcionales lo llamaremos F, conjunto a partir del cual obtendremos el
resto de dependencias funcionales. A cada nueva dependencia funcional obtenida a partir de F la llamaré f.
Al nuevo conjunto que contenga todas las dependencias funcionales que obtenga le llamaré F+. Una vez
hallado F+ podré aplicar las formas normales de la teoría de la normalización.

Dependencia funcional derivada

Dado un conjunto F de dependencias funcionales se dice que f deriva de F (F f) si f se obtiene a partir de


F.

Cierre de un conjunto de dependencias funcionales

Se define Cierre (F+) como el conjunto de todas las dependencias funcionales implicadas por F o
halladas a partir de F.
27

907
ACCESO A DATOS EN JAVA

Propiedades de las dependencias funcionales

a) Axiomas
b) Propiedades propiamente dichas

a) Axiomas

a.1) Axioma reflexivo

Si Y está incluido en X entonces X ® Y (Si Y c X => X ® Y)

Ej: CODPROV c CODPOSTAL

CODPOSTAL ® CODPROV

A un código postal le corresponde un único código de provincia.

a.2) Aumentatividad

Si X ® Y y Z c W => XW ® YZ

Se demuestra del siguiente modo: Z c W equivale a W ® Z. Si tenemos X ® Y y W ® Z podemos


z
afirmar que XW ® YZ

a.3) Transitividad

Si X ® Y y Y ® Z => X ® Z

b) Propiedades propiamente dichas

b.1) Unión

X ® Y y X ® Z => X ® YZ

Demostración:

Si X ® Y (aumentatividad con X) => X ® XY


Si X ® Z (aumentatividad con Y) => XY ® XZ
Si X ® XY y XY ® YZ (transitividad) => X ® YZ

28

908
ACCESO A DATOS EN JAVA

b.2) Pseudotransitividad

X ® Y y WY ® Z => WX ® Z

Demostración:

Si X ® Y (aumentatividad con W) => WX ® WY


Si WX ® WY y WY ® Z (transitividad) => WX ® Z

b.3) Descomposición

X ® Y y Z c Y => X ® Z

Demostración:

Si Z c Y (axioma reflexivo) => Y ® Z


Si X ® Y y Y ® Z (transitividad) => X ® Z

Dependencia funcional total

El conjunto de atributos Y tiene dependencia funcional total con X si Y tiene dependencia funcional con X (X
® Y) y además no existe ningún subconjunto Z de X (Z c X) con el cual Y tenga dependencia funcional
(Z -/® Y).

Diagramas de dependencias funcionales

Son una herramienta que sirve para tener una visión general de los datos y de las dependencias funcionales
entre ellos. S e representa en forma de grafo con los implicantes de las dependencias funcionales en un
rectángulo, de los que salen flechas hacia los implicados.

Ej: Dado: ABC ® MNS


M®N
BC ® OPR
O®P
C®Q , obtener el diagrama de dependencias funcionales.

A C AB ® C

B B®C

29

909
ACCESO A DATOS EN JAVA

Es una dependencia funcional total.

Ej: Hallar si las siguientes dependencias funcionales son totales:

a) DNI, EMPRESA ® SUELDO

b) DNI, EMPRESA ® NOMBRE

SUPERCLAVE Y CLAVE

Superclave (SK): es el atributo o conjunto de atributos tales que en una relación R(A, DF) se cumple que SK
® A. SK es el implicante capaz de implicar a la tabla completa.

Ej: En una tabla compuesta por X, Y, Z y W, si W es superclave se cumple que:

W®X
W®Y
W®Z

Clave (K): es el atributo o conjunto de atributos tales que en una relación R(A, DF) es superclave y además
no existe ningún subconjunto K’ c K tal que K’ ® A

K, R(A, DF), K SK /\ no existe K’ c K / K’ ® A

Debe tener una dependencia funcional total con los atributos de la tabla. Si tenemos:

WZ ® A
WZ ® B
WZ ® C

pero

Z -/® A
Z -/® B
Z -/® C

La clave es la mínima superclave, no descomponible en claves menores.

30

910
ACCESO A DATOS EN JAVA

2ª forma normal: se dice que una relación está en 2ª forma normal si cumple las siguientes condiciones:

1) Está en 1ª forma normal


2) Cada atributo no principal o secundario (no forma parte de la clave), tiene una dependencia funcional total
con la clave.

Ej: AB ® C
B®D

A C

B D

D depende funcionalmente de B sólo y debería depender de AB para estar en 2ª forma normal. Para
convertirlo en 2ª forma normal se descompone en 2 tablas:

Tabla 1: clave con dependencias totales

Tabla 2: parte de la clave implicante con dependencias parciales

A
C B D
B

Esto cumple el teorema 1º enunciado en el capítulo (Descomposición por JOIN)

Ej: Pasar a 2ª forma normal la siguiente tabla:

DNI NOMBRE

EMPLEADO SUELDO

DNI
SUELDO DNI NOMBRE EMPLEADO

31

911
ACCESO A DATOS EN JAVA

Dependencia funcional transitiva: se cumple si:

A ® B
B -/® A => A®C
B ® C

Gráficamente:

3ª forma normal: se dice que una tabla está en 3ª forma normal si está en 2ª forma normal y además cumple
que ningún atributo no principal depende transitivamente de la clave.

Ej: Pasar a 3ª forma normal:

A® B B ®A C®D
A® C B ®C C®E
A® D B ®D
A® E B ®E

A y B son claves candidatas a principales. Elegimos una de las 2, por ejemplo A.

B
A C
D
E

B
A D
C
E

No está en 3ª forma normal porque existen atributos no principales que dependen transitivamente de la
clave de la relación.

32

912
ACCESO A DATOS EN JAVA

Para pasarlo a 3ª forma normal lo descompongo en 2 tablas:

1ª tabla: clave con dependencias no transitivas.

B
A
C

2ª tabla: clave con dependencias transitivas.

D
C
E

Ej: Tenemos las siguientes dependencias de la tabla ALUMNOS:

NºMATRICULA ® AULA, GRUPO


GRUPO ® AULA

Pasarlo a 3ª forma normal.

Descomponemos en 2 tablas:

1ª tabla: clave con dependencias no transitivas.

B
A
C

2ª tabla: dependencias transitivas.

D
C
E

33

913
ACCESO A DATOS EN JAVA

Ej: Pasar a 3ª forma normal las siguientes dependencias de la tabla alumnos:

NºMATRICULA ® AULA, GRUPO


GRUPO ® AULA

Forma normal de Boyce-Codd: Trata de resolver los problemas que origina la 3ª forma normal. Se dice que
una relación R está en FNBC sólo si todo determinante o todo implicante (conjunto de atributos a la izquierda
de la relación) es clave.

Ej:

A
C
B

Está en 3ª forma normal, pero no en FNBC.

AB ® C
C®B
AB ® B

Para pasar a FNBC una relación R en la cual existe una dependencia del tipo X ® Y siendo X un atributo no
principal y siendo Y un atributo principal, descomponemos R en 2 proyecciones:

R1 formada por los atributos X e Y ® R1=(X, Y)


R2 formada por todos los atributos de R exceptuando Y ® R2=(A - Y)

Obtenemos:

C B

34

914
ACCESO A DATOS EN JAVA

Ej: Tenemos una tabla de un callejero:

CALLEJERO (DIRECCION, CIUDAD, C_POSTAL)

C_POSTAL ® CIUDAD
DIRECCION, CIUDAD ® C_POSTAL

C_POSTAL CIUDAD
DIRECCION
C_POSTAL
CIUDAD DIRECCION

C_POSTAL

Dependencia multivaluada:

Sean A y B dos subconjuntos distintos de atributos de una tabla T se dice que A tiene una dependencia
multivaluada con B ó que A multidetermina a B ó que B depende multivaluadamente de A (A ®® B) así para
cada valor de A tenemos un conjunto, bien sea de valores de B que son independientes de los demás atributos,
o la relación.

1. A <= B
2. Independientemente del resto de atributos de A

Ej:
Los profesores de una facultad imparten varias asignaturas y una asignatura es impartida por varios
profesores.
Una asignatura tiene varios textos y un texto puede utilizarse en varias asignaturas,
independientemente del profesor que las imparte.

35

915
ACCESO A DATOS EN JAVA

Asignatura ®® Profesor

a) Cada asignatura tiene definidos varios profesores


b) Se cumple

Asignatura ®® Texto

a) Cada asignatura tiene asignado más de un texto


b) Se cumple

Siempre que se dé una dependencia X ®® Y tiene que darse una dependencia X ®® A - (X U Y).
Para que se dé debe tener más de 2 atributos.

Profesor ®/® Texto

a) Para cada profesor hay definidos más de un texto


b) Depende de Asignatura

Profesor ®® Asignatura

a) Un profesor tiene asignadas varias asignaturas


b) No se puede dar por una serie de teoremas matemáticos

4ª Forma Normal: una tabla está en 4ªFN si está en 3ªFN y se cumple que las únicas dependencias
multivaluadas existentes son las existentes con los atributos secundarios.

Cuando no existen dependencias multivaluadas y la tabla está en 3ªFN para pasar a 4ªFN tendremos en cuenta
el teorema de FAGIN: “Una tabla T con los atributos A, B, C se puede descomponer sin pérdida de información
en 2 proyecciones: T1 con los atributos A y B y T2 con los atributos A y C, sólo si A multidetermina a B y C (A
®® B / C).

Para pasar a 4ªFN si existe una dependencia multivaluada X ®® Y la dividimos en 2 tablas.

1. R1 (x, y)
2. R2 (A - y)

R1 (x, y)
R: x ®® y
R2 (A - y)

36

916
ACCESO A DATOS EN JAVA

Ej:

Asignatura ®® Texto
Asignatura ®® Profesor

(asignatura, texto) (asignatura, profesor)

R (Asignatura, Texto, Profesor)

1. Asignatura ®® Texto, x
2. Asignatura ®® Profesor, y

R1 (Asignatura, Texto, x)
R2 (Asignatura, Profesor, y)

Dependencia de JOIN

Se dice que una relación T formada por los atributos A1, A2, ..., An tiene una dependencia con sus
proyecciones T1, T2, ..., Tn si T=T1 T2 T3 ... Tn

37

917
ACCESO A DATOS EN JAVA

La 4ª fila (a2, b1, c2) es una tupla intrusa o espuria.


Hay otra proyección que hace que se cumpla:

T=T1 T2 T3

5ª Forma Normal: se dice que una tabla está en 5ªFN si está en 4ªFN y además toda dependencia de JOIN está
implicada por las claves de la tabla. Las columnas de enlace deben ser los atributos que componen la clave.

En la siguiente tabla no existen dependencias funcionales. Bebida -/® Camarero.

Dependencias de JOIN:

T=T1 T2 T3

Columna enlace: T1 T2 = Cliente

Los tres atributos forman la clave. T no está en 5ª forma normal. Si las columnas de enlace son las columnas
de la clave entonces está en 5ª forma normal. Para pasarlo a 5ª forma normal habrá que descomponer T en
sus proyecciones.

38

918
ACCESO A DATOS EN JAVA

EMPLEADOS (DNI, NOMBRE, DIRECCION, NSS, FISS, CATEGORIA)

T1 (DNI, NOMBRE, DIRECCION)


T2 (DNI, NSS, FISS)
T3 (DNI, CATEGORIA)

EMPLEADO = T1 t2 t3

T está en 5ª forma normal, aún así es factible descomponerla en sus proyecciones.

Ej: Competiciones

En una prueba hay varios árbitros.


Un árbitro puede arbitrar en diferentes pruebas.
Un atleta puede competir en diferentes pruebas.
En un único país no pueden existir nº de pasaportes iguales, pero sí si son de países diferentes.
Pueden existir distintos atletas con el mismo nombre.

Atributos:

NPa: Nº de pasaporte del atleta


Na: Nombre del atleta
da: Dirección del atleta
dpa: Dirección postal del atleta
ca: Ciudad del atleta
Pra: Provincia del atleta
Pa: País del atleta
cpa: Código de país del atleta
Fn: Fecha de nacimiento del atleta
Sa: Sexo del atleta
cp: Código de la prueba
np: Nombre de la prueba
ma: Marca del atleta
NPar: Nº de pasaporte del árbitro
Nar: Nombre del árbitro

39

919
ACCESO A DATOS EN JAVA

Ej: Barco de pasajeros

Un barco pertenece a un propietario.


Se construye en un sólo astillero.
El código es único dentro del país.
Pueden existir barcos diferentes con el mismo código si son de distintos países.
Un barco es de un sólo tipo.
Los marineros del barco sólo tienen una dirección y un código dentro del barco.
Un marinero puede tener varios teléfonos.
No existen ciudades repetidas.
Dos pasajeros pueden tener el mismo camarote en un barco.
Un pasajero puede embarcar en varios barcos en distintas fechas.
Dos barcos pueden haber tenido a un mismo marinero, pero nunca al mismo tiempo.

Ej: Coleccionistas de sellos

El código de sello particular es único para la colección del propietario.


El código internacional es único para cada tipo de sello emitido, del cual pueden existir varios ejemplares.
Dos coleccionistas pueden tener ejemplares de un mismo tipo de sello, pero cada uno tendrá un código
particular del sello que podría ser el mismo.
No existen 2 DNIs, ciudades, provincias o países iguales.
Pueden existir nombres iguales.
Un propietario pude tener varios teléfonos.

Atributos:

CS: Código particular del sello para el propietario actual


CI: Código internacional del sello
PS: País del sello
CP: Código del país
VE: Valor de emisión del sello
AE: Año de emisión del sello
EP: Estado político del país en el año de emisión del sello
CE: Código del estado político
CLS: Clase de sello
CCL: Código de la clase de sello
EC: Estado de conservación del sello

40

920
ACCESO A DATOS EN JAVA

CC: Código del estado de conservación del sello


DNIP: DNI del propietario del sello
NP: Nombre del propietario del sello
DP: Dirección del propietario del sello
CiP: Ciudad del propietario del sello
CPP: Código postal del propietario del sello
PP: Provincia del propietario del sello
PaP: País del propietario del sello
TP: Teléfono del propietario del sello
DNIA: DNI del antiguo propietario del sello

SQL Embedido

1. SQL autocontenido
2. SQL embedido

SQL embedido:

Sentencia de SQL que se utiliza dentro de un programa llamado anfitrión, escrito en cualquier lenguaje.
Tendremos tablas con datos de entrada y de salida.
Las sentencias de SQL serán sentencias embebidas en el programa anfitrión.

Características:

* Todas las sentencias SQL van a estar enmarcadas por:

EXEC SQL
<sentencias>
END-EXEC

* Antes de utilizar un compilador para manejar SQL embebido es necesario pasar el programa fuente por un
precompilador:

PROG precompilador PROG FUENTE compilador PROG LINKER


FUENTE MODIFICADO OBJETO

- ® sintaxis sentencias SQL


- ® comentar sentencias SQL (para que las ignore el compilador)
- ® sustituir sentencias SQL por llamadas a rutinas de librerías

41

921
ACCESO A DATOS EN JAVA

* Manejo de variables de programa dentro de sentencias SQL:

Se pone dos puntos (:) delante del nombre de la variable.

Ej: Para un vuelo, visualizar plazas libres y nº de vuelo (datos de salida), sabiendo el origen, destino, hora
de salida y fecha de salida (datos de entrada).

INICIO
escribir ‘Introducir ORIGEN, DESTINO, FECHA, HORA’
leer ORIGEN, DESTINO, FECHA, HORA
EXEC SQL
SELECT RESERVAS.NUM_VUELO, PLAZAS_LIBRES
INTO :VUELO, :PLAZAS
FROM RESERVAS, VUELOS
WHERE RESERVAS.NUM_VUELO=VUELOS.NUM_VUELO
AND ORIGEN=:ORIGEN
AND DESTINO=:DESTINO
AND FECHA=:FECHA
AND HORA=:HORA
END-EXEC
escribir VUELO, PLAZAS
FIN

INTO sirve para determinar las variables de salida.


Devuelve en la salida una sola fila. En caso de que la salida devuelva más de una fila tendremos los cursores.

Cursor:
- Es una estructura de datos tabular (en forma de tabla) que sirve para almacenar un número
indeterminado de filas.
- Sólo permite manejar una única fila a la vez, mediante un puntero.
- Para manejar cursores en SQL embebido hay 4 etapas:

1) Definición del cursor

Se define junto a la declaración de variables del programa anfitrión:

EXEC SQL
DECLARE
<nom_cursor> CURSOR
FOR
<sent_select>
END-EXEC
42

922
ACCESO A DATOS EN JAVA

2) Abrir cursor

Rellena de filas la estructura del cursor:

EXEC SQL
OPEN <nom_cursor>
END-EXEC

3) Recuperar filas (1)

EXEC SQL
FETCH <nom_cursor> {avanza el puntero una posición}
INTO <lista_variables> {una sola variable por columna}
END-EXEC

Cuando se hace un OPEN se rellena la estructura y el puntero se posiciona anterior a la primera fila. El primer
FETCH posiciona el cursor en la primera fila.

4) Cerrar cursor

EXEC SQL
CLOSE <nom_cursor> {liberando memoria}
END-EXEC

Ej: Realizar un programa que presente todos aquellos vuelos existentes entre un origen y un destino
determinados.

Pasos:

1. Declaración de variables
2. Petición de información de origen y destino
3. Abrir cursor
4. Recuperar primera fila del cursor
5. Comprobar si existe alguna fila. Si no existe ir a 9
6. Escribir fila en pantalla
7. Recuperar siguiente fila
8. Ir a 5
9. Fin

43

923
ACCESO A DATOS EN JAVA

VARIABLES
ORIGEN, DESTINO, HORA, VUELO: STRING

EXEC SQL
DECLARE lista_vuelos CURSOR
FOR SELECT NUM_VUELO, HORA_SALIDA
FROM VUELOS
WHERE ORIGEN=:ORIGEN
AND DESTINO=:DESTINO
END-EXEC

INICIO
ESCRIBIR ‘INTRODUZCA ORIGEN Y DESTINO’
LEER ORIGEN, DESTINO
EXEC SQL
OPEN lista_vuelos
END-EXEC
EXEC SQL
FETCH lista_vuelos
INTO :VUELO, :HORA
END-EXEC

{Variable predefinida SQL-CODE: nos da información sobre la ejecución de cada sentencia en SQL:
SQL-CODE < 0 ® Error
SQL-CODE = 100 ® CURSOR vacío
SQL-CODE > 0 ® Warning}

MIENTRAS SQL-CODE <> 100


ESCRIBIR VUELO, HORA
EXEC SQL
FETCH lista_vuelos
INTO :VUELO, :HORA
END-EXEC
FIN_MIENTRAS
EXEC SQL
CLOSE lista_vuelos
END-EXEC
FIN

44

924
ACCESO A DATOS EN JAVA

INTEGRIDAD E INTEGRIDAD REFERENCIAL

1. Introducción
2. Integridad referencial
2.1 DDL
2.2 DML
3. Disparadores
4. Reglas semánticas

1. INTRODUCCION

Integridad: característica que nos permite tener coherencia y veracidad en la información.

Existen ciertas operaciones de SQL que pueden hacer peligrar la integridad de la operación:

- Inserción
- Borrado
- Modificación

T.PADREEMPLEADO DNI Clave Principal

depende
cod_fam
T.HIJA FAMILIARES DNI_EMP Clave Ajena

Puede que borremos un empleado y olvidemos eliminar los familiares.

Tipos de integridad:

Integridad de dominio: restringimos los valores que puede tomar un atributo respecto a su dominio, por
ejemplo EDAD ® 18 - 65.

Integridad de entidad: la clave primaria de una entidad no puede tener valores nulos y siempre deberá ser
única, por ejemplo DNI.

Integridad referencial: las claves ajenas de una tabla hija se tienen que corresponder con la clave primaria
de la tabla padre con la que se relaciona. Por ejemplo, en familiares necesitaremos el DNI de empleado, que
es la clave ajena de la tabla.

45

925
ACCESO A DATOS EN JAVA

2. INTEGRIDAD REFERENCIAL

Clave principal: conjunto de atributos capaz de diferenciar cada tupla de la tabla.


Clave ajena: Clave en la tabla padre.

2.1 DDL

Se basa en la definición de la clave principal y de la clave ajena de la tabla.

CREATE TABLE EMPLEADO


(PRIMARY KEY DNI,
DNI CHAR(8) NOT NULL,
NOMBRE VARCHAR(30) NOT NULL, {columnas de la tabla, clave incluida}
. . .
)

CREATE TABLE FAMILIARES


(PRIMARY KEY COD_FAMILIAR,
COD_FAMILIAR CHAR(4) NOT NULL,
NOM_FAMILIAR CHAR(30) NOT NULL,
DNI_EMPL CHAR(8) NOT NULL,
. . .
)

FOREIGN KEY REL_EMPL_FAM


DNI_EMPL REFERENCE EMPLEADO
RESTRICT
ON DELETE CASCADE
SET NULL

46

926
ACCESO A DATOS EN JAVA

2.2 DML

Tendremos una serie de reglas para:

2.2.1 Inserción
2.2.2 Actualización

Implícitas o determinadas por el sistema.

2.2.3 Borrado

Explícita o definida por el usuario de tres que proporciona el sistema.

2.2.4 Regla de inserción

Se ejecuta sobre la tabla hija.


Sólo se podrá insertar una fila en la tabla hija si el valor de clave ajena de esa fila es un valor nulo o un valor
de los existentes en la clave primaria de la tabla padre.

2.2.5 Regla de actualización

Se ejecuta sobre las tablas padre o hija.

Tabla padre: no se puede modificar el valor de clave primaria de la tabla padre si existe alguna fila en la tabla
hija que lo referencie en la clave ajena.

Tabla hija: el valor de clave ajena de la tabla hija sólo se puede modificar si el nuevo valor que va a adoptar
es un valor nulo o es igual a un valor de clave primaria de la tabla padre.

2.2.6 Regla de borrado

Esta regla se especifica al crear la tabla padre y se activará cuando se intente eliminar una fila de la tabla.

CREATE TABLE
...
FOREIGN KEY
...
RESTRICT

ON DELETE CASCADE

SET NULL
47

927
ACCESO A DATOS EN JAVA

Es una regla explícita, ya que el usuario puede elegir la regla de borrado que desee, a partir de 3 reglas que
nos va a proporcionar el sistema.

a) RESTRICT

No se puede borrar una fila de la tabla padre si existen filas en la tabla hija cuyos valores de clave ajena sean
iguales a valores de clave primaria de la fila que queremos borrar.

b) CASCADE

Cada vez que se borre una fila de la tabla padre se eliminarán aquellas filas de la tabla hija que tengan
como valor de clave ajena el mismo valor que el de la clave primaria de la fila que se quiere borrar.

c) SET NULL

Cada vez que se elimine una fila de la tabla padre se actualizarán los campos de la clave ajena de la tabla
hija a valores nulos para aquellas filas que tengan en el campo de la clave ajena el mismo valor que la clave
primaria de la fila de la tabla padre que se quiere borrar.

Casos específicos de integridad:

Integridad auto-referencial

Una tabla es al mismo tiempo padre e hija de si misma.

Ej: Dada la tabla T_EMP con las siguientes columnas:

COD_EMP NOMBRE COD_EMP_JEFE

Todos los valores que aparezcan en la última columna existirán también en la primera, por tanto
COD_EMP_JEFE se convierte en clave ajena de la tabla.

Ciclos de integridad referencial

Conjunto de tablas que funcionará como tablas padres e hijas unas de otras, formando un camino cerrado.

48

928
ACCESO A DATOS EN JAVA

Ej: Tenemos 3 tablas:

COCHES (MATRICULA, MARCA, COD_DIRECTOR)

DIRECTORES (COD_DIRECTOR, NOMBRE_DIR, COD_SECRETARIA)

SECRETARIAS(COD_SECRETARIA, NOMBRE_SEC, MATRICULA)

COCHES es tabla hija de DIRECTORES


DIRECTORES es tabla hija de SECRETARIAS
SECRETARIAS es tabla hija de COCHES

COCHES

DIRECTORES SECRETARIAS

Forma un ciclo de integridad referencial.

Por haber ciclos debemos incorporar restricciones de borrado, para un correcto funcionamiento de la
integridad referencial.

Restricciones de borrado

a) Integridad auto-referencial

Siempre que tengamos una tabla con integridad auto-referencial debemos definir un borrado en cascada.

Tabla EMPLEADO

49

929
ACCESO A DATOS EN JAVA

DELETE FROM EMPLEADO


WHERE COD_EMP_JEFE >= ‘B01’

Con RESTRICT no se puede borrar la 3ª fila, porque C02, clave primaria, está siendo referenciada en la fila
4ª como clave ajena. Salta a la 4 fila y la borra.

DELETE FROM EMPLEADO


WHERE COD_EMP_JEFE IS NULL

Con SET NULL borraría la primera fila, porque su clave ajena es NULL, pasaría a la 2ª y como su clave ajena
es igual a la clave primaria de la fila borrada pondría la clave ajena a NULL. Como le hemos dicho que borre
aquellas filas que tengan por clave ajena un valor nulo, ahora borraría esta fila y así sucesivamente hasta
eliminar la tabla completa.

b) Ciclos de integridad referencial

DELETE FROM T3
WHERE FKT2 IS NULL

Restricciones de borrado en ciclos:

CICLO DE 2 TABLAS: ninguna de ellas podrá tener definida la opción de borrado en cascada.
CICLO DE MAS DE 2 TABLAS: Sólo una de las tablas podrá tener la opción de borrado en cascada.

El esquema anterior no cumple las restricciones expuestas.

c) Tablas conectadas por múltiples caminos (con más de una tabla padre)

DELETE FROM T2
WHERE PKT2 = ‘T2A’

Restricciones de borrado en tablas conectadas por múltiples caminos:

Los dos caminos que llegan a una tabla deben tener definida siempre la misma regla de borrado, que debe
ser RESTRICT o CASCADE.

50

930
ACCESO A DATOS EN JAVA

En el ejemplo funcionaría bien por el primer camino, pero por el segundo hay restricción.

Ej. Pruébese qué ocurriría si entre T3 y T1 hay SET NULL y entre T2 y T1 hay SET NULL.

Ventajas del uso de las reglas de integridad referencial proporcionadas por el sistema frente a la
implementación de éstas por parte del usuario.

1. Al usar las proporcionadas por el sistema los analistas tienen menor responsabilidad.

2. Habrá un incremento en la productividad y un decremento en los costes de la aplicación, porque el


número de pruebas a realizar será menor si la integridad referencial es implementada por el propio
sistema, el cual nos garantizará el correcto funcionamiento de las reglas de integridad referencial.
El tiempo de desarrollo de la aplicación será menor.

3. La información será más coherente, ya que está garantizado que todas las filas de las tablas cumplen
las normas de integridad referencial.

3. DISPARADORES O ‘TRIGGERS’

Son un conjunto de sentencias que el sistema ejecuta a la hora de efectuar una inserción, actualización o
borrado en una tabla. Para definir un TRIGGER necesitamos:

- Nombre de la tabla sobre la que actuará el trigger


- Sentencia que activará el trigger (inserción, actualización o borrado)
- Acciones que realizará el trigger

DB2 no incorpora la posibilidad de definir triggers, pero SQL sí. Las reglas de integridad referencial se emulan
en SQL mediante la implementación de triggers.

Emulación de inserción en tabla hija mediante el uso de trigger en SQL:

Según la regla de integridad referencial, no se puede efectuar una inserción en una tabla hija a menos que
exista un valor de clave primaria igual al de clave ajena de la fila que se desea insertar.

51

931
ACCESO A DATOS EN JAVA

Definición del trigger:

DEFINE TRIGGER insercion


ON INSERT OF HIJA

El trigger comparará el valor de clave ajena de la fila a insertar con el valor de clave primaria de la tabla
hija cada vez que se intente insertar una fila.

Implementación del trigger:

(if (SELECT COUNT (#)


FROM PADRE, INSERTED
WHERE PADRE.CL_PRIMARIA = INSERTED.CL_AJENA) = 0) Condición que activa el trigger
begin
PRINT ‘ERROR’
ROLLBACK TRANSACTION Acciones que ejecuta el trigger si se activa
end

SELECT COUNT devuelve el número de filas de la tabla padre con un valor de clave primaria igual a la clave
ajena de la fila a insertar.
El sistema proporciona una tabla de almacenamiento temporal (INSERTED) donde se guardarán las filas a
insertar.

Si CL_AJENA = CL_PRIMARIA, permite la inserción, en caso contrario deshace la operación con ROLLBACK
TRANSACTION.

El trigger correspondiente a la operación de actualización sería similar.

52

932
ACCESO A DATOS
EN JAVA
La tecnología JDBC

933
ÍNDICE
ACCESO A DATOS EN JAVA

1. Drivers JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3
2. El API JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8
3. Ejecutar sentencias SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11
4. Sentencias SQL Precompiladas (PREPARED STATEMENT) . . . . . . . . . . . . . . . . . . . . . . . . . . . .16
5. Uso de transacciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19
6. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30

934
ACCESO A DATOS EN JAVA

1. Drivers JDBC
Objetivos

1. Conocer los DriversJDBC de bases de datos


2. Identificar las clases para establecer la conexión con la base de
datos: API JDBC
3. Saber cómo ejecutar sentencias SQL
4. Reconocer sentencias SQL precompiladas (PREPARED STATEMENT)
5. Saber cómo se realiza el Uso de transacciones

Drivers de bases de datos

Existen varios drivers de bases de datos:

- BDE (Borland Database Engine)


- ODBC (Open Database Connectivity)

Para JAVA se tiene el JDBC, el cual está escrito en JAVA. Para programar con el JDBC se utilizarán los métodos
propios para acceder a la base de datos.

Javasoft ha definido cuatro tipos de drivers:

i
3

935
ACCESO A DATOS EN JAVA

JDBC-ODBC bridge driver

Esta solución lo que hace es pasar por ODBC para acceder a la base de datos.

PROGRAMA Driver nativo SQLServer


JAVA Tipo 1 ODBC nativo Access
(JDBC) nativo dBase

Ventajas:

- Viene ya con JDK.

Inconvenientes:

- ODBC debe estar instalado y configurado en la máquina del cliente.

- El driver está escrito parte en JAVA y parte en una DLL. Esto quiere decir que como parte está en DLL
no se puede enviar por la red. Por lo tanto no sirve para construir APPLETS

Native API partly Java driver


Se conectan con el servidor de base de datos utilizando el protocolo nativo de la base de datos.

PROGRAMA Driver
JAVA Tipo nativo Oracle
Oracle

Driver
Tipo nativo SQLServer
SQLServer

i
4

936
ACCESO A DATOS EN JAVA

Ventajas:

- Es más rápido que el Tipo 1, ya que se habla el protocolo nativo de la base de datos.

Inconvenientes:

- Igual que el primero está escrito parte en JAVA y en parte en DDL por lo cual no se puede utilizar en
la red y no se pueden construir con el APPLETS.

JDBC-Net pure Java driver


Se utiliza un driver totalmente escrito en JAVA. El driver se va a conectar con lo que se denomina un servidor
de acceso a la base de datos.

El servidor de acceso a la base de datos es un programa (en cualquier lenguaje) que se encarga de recibir
las peticiones del driver y de trasladarlas a la base de datos.

PROGRAMA Driver Servidor de acceso odbc Sybase


JAVA Tipo 3 a la base de datos odbc Access
Odbc Interbase
Ventajas:

- Se puede utilizar para diseñar APPLETS

Native protocol pure Java driver


Son drivers totalmente diseñados en Java y que se comunican con la base de datos utilizando el protocolo
nativo de la base de datos.

Driver
PROGRAMA Oracle nativo Oracle
JAVA Tipo 4

i
5

937
ACCESO A DATOS EN JAVA

Ventajas:

- Es más rápido que el Tipo 3 ya que se utiliza el protocolo nativo de la base de datos.

Inconvenientes:

- Se necesita el driver del fabricante de la base de datos.

Configuración del cliente y el servidor

Ahora veremos cómo se puede conectar cada uno de los 4 tipos de driver:

JDBC-ODBC bridge driver

Sólo se sabe conectar en local, aunque luego el ODBC del cliente puede saber conectarse a una base de
datos remota (no en Access pero si por ejemplo en Oracle).

CLIENTE Programa Driver ODBC BDD


Tipo1

i
6

938
ACCESO A DATOS EN JAVA

En este caso la base de datos puede estar en otro servidor solamente si ODBC sabe conectarse:

CLIENTE Programa Driver ODBC


Tipo1
SERVIDOR BDD Remota
-------------------------------------

Native API partly java driver

Se podrá conectar a una base de datos local o a una base de datos remota, dependiendo lo que sepa hacer
el driver.

CLIENTE Driver Programa Driver


Oracle java Access nativo Access
Tipo 2 Tipo 2

SERVIDOR Oracle
------------------------------------

JDBC-Net pure Java driver

CLIENTE Programa Driver Servidor de acceso BDD


java Tipo 3 de la base de datos

SERVIDOR (LAN) BDD

SERVIDOR (LAN) Servidor de acceso BDD


de la base de datos

SERVIDOR (WAN) Servidor de acceso BDD


de la base de datos
------------------------------------
Native protocol pure Java driver
La base de datos puede ser local o remota.

i 7

939
ACCESO A DATOS EN JAVA

2. El API JDBC

Clases para establecer la conexión con la base de datos

Hay dos versiones para establecer la conexión con la base de datos

- JDBC 1.0 (JDK 1.1)


- JDBC 2.0 (JDK 1.2)

En JDK 1.0 no existe JDBC.

El paquete se denomina java.sql.* (import java.sql.*).

Para acceder a una base de datos habrá que conectarse primeramente a ella, los pasos son los siguientes:

- Cargar el driver de la base de datos.

static Class <Class>.forName (String className)


throws ClassNotFoundException

Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");

Lo que hace esta función es registrar el driver en un subsistema de la JVM denominado DriverManager.

i
8

940
ACCESO A DATOS EN JAVA

Interface Connection

Obtener una conexión a la base de datos. Están representadas por la interface Connection:

Connection

Access Connection Oracle Connection

Normalmente se tendrá una referencia del interface Connection para acceder a los objetos que deriven.

Para obtener el método Connection se utiliza el siguiente método:

static Connection <DriverManager> getConnection


(String url) throws SQLException

El parámetro url determina la cadena de conexión que indica qué driver vamos a utilizar y qué parámetros
se les va a pasar. La cadena de conexión es un texto con tres partes:

"jdbc:<driver>:<parametros>"

Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conexion = DriverManager.getConnection
("jdbc:odbc:DSNBanco");

i
9

941
ACCESO A DATOS EN JAVA

Configuración de una conexión odbc

Para crear conexiones en la base de datos habrá que crear lo que se denomina DSN (Data Source Name).

Un DSN es un conjunto de parámetros que configuran la conexión a la base de datos y a los que se da un
nombre.

Los DSN son de tres tipos:

- DSN de usuarios, sólo existen cuando se entra con un determinado nombre de usuario.

- DSN de sistema, existen independientemente del usuario con que se entre.

- DSN de ficheros, que son DSN donde la información de configuración se almacena en un fichero.DSN

Los dos primeros guardan la información de configuración en el registro de Windows.

i
10

942
ACCESO A DATOS EN JAVA

3. Ejecutar sentencias SQL


Sentencias SQL

Para ejecutar setencias SQL se va a necesitar un objeto Statement que es un interface.

Para obtener una Statement habrá que pedirlo a Connection, se tiene el siguiente método:

Statement <Connection>.createStatement() throws SQLException

Una vez que se tenga el Statement se podrá utilizar ejecutando las instrucciones SQL que se quiera.

Con Statement se pueden ejecutar dos tipos de sentencias SQL:

1. Sentencias de actualización

2. Sentencias de consulta

Sentencias de actualización

Las sentencias de actualización SQL son:

CREATE TABLE Clientes


(CodCliente INTEGER,
Nombre CHAR(20),
Direccion CHAR(30),
Saldo NUMBER)

INSERT INTO Clientes (1, 'Pedro Perez', 'Gibraltar 32', 28000)

INSERT INTO Clientes (CodCliente, Nombre) VALUES (2, 'Juan Martínez')

DELETE FROM Clientes WHERE Saldo > 25000

DROP TABLE Clientes

11

943
ACCESO A DATOS EN JAVA

Para ejecutar las sentencias anteriores se utiliza el siguiente método:

int <Statement>.executeUpdate (String sql)


throws SQLException

El método devuelve el número de registros actualizados. Si se produce un fallo se lanza la Excepción.

Devuelve -1 si afecta a toda la tabla.


Devuelve 0 cuando ningún registro se ha visto afectado por la modificación.

Sentencias de consulta I

Las sentencias de consulta SQL son:

SELECT Nombre, Direccion FROM Clientes


WHERE (Saldo > 25000)

Para ejecutar las sentencias de consulta se tiene el siguiente método:

ResultSet <Statement>.excuteQuery (String sql)


throws SQLException

i
12

944
ACCESO A DATOS EN JAVA

Un ResultSet es el resultado de la consulta compuesto por filas y columnas.

Tras obtener el Resultset habrá que tratar la información contenida en él. Para ello se tienen los siguiente
métodos:

boolean <ResultSet>.next()

Se mueve al siguiente registro del Resultset

Devuelve true cuando encuentra el siguiente registro.


Cuando devuelve false se ha llegado al final de la consulta.

boolean <ResultSet>.getBoolean(int columnIndex)


boolean <ResultSet>.getBoolean(String columnName)
int <ResultSet>.getInt (int columnindex)
int <ResultSet>.getInt (String columnName)
String <ResultSet>.getString (int columnindex)
String <ResultSet>.getString (String columnName)

Sentencias de consulta II

Estos métodos sirven para recuperar la información contenida dentro de las columnas, bien por el índice
(columnIndex) o bien por el nombre de la columna (columnName). El índice de la primera columna tiene el
valor 1.

i
13

945
ACCESO A DATOS EN JAVA

También se pueden recoger los Metadatos del Resultset. Los Metadatos es la información de la estructura del
sistema de almacenamiento. Se tienen los siguientes métodos:

<Resultset>.findColumn(String columnName)
muestra el texto inferior (sin negrita) en casilla lateral, como modelo
Devuelve la posición de la columna cuyo nombre se indica en el parámetro columnName.

ResultSetMetaData <ResultSet>.getMetaData()
muestra el texto inferior (sin negrita) en casilla lateral, como modelo
Devuelve los metadatos del ResultSet.

int <ResultSetMetaData>.getColumnCount()
muestra el texto inferior (sin negrita) en casilla lateral, como modelo
Devuelve el número de columnas.

String <ResultSetMetaData>.getColumnName(int col)


muestra el texto inferior (sin negrita) en casilla lateral, como modelo
Devuelve el nombre de la columna a partir del índice de la columna.

i
14

946
ACCESO A DATOS EN JAVA

int <ResultSetMetaData>.getColumnType(int col)


muestra el texto inferior (sin negrita) en casilla lateral, como modelo
Devuelve el tipo de la columna a partir del índice de la columna. Se encuentra dentro de Types.

boolean <Statement>execute(String sql)


throws SQLException
muestra el texto inferior (sin negrita) en casilla lateral, como modelo
Devuelve true si la sentencia SQL es consulta y false si es una sentencia de actualización.

Resultset <Statement>.getResultSet()
muestra el texto inferior (sin negrita) en casilla lateral, como modelo
Devuelve los datos obtenidos tras ejecutar la sentencia con el método execute.

<Statement>.getUpdateCount()
muestra el texto inferior (sin negrita) en casilla lateral, como modelo
Devuelve el número de registros actualizados tras ejecutar la sentencia con el método execute.

i
15

947
ACCESO A DATOS EN JAVA

4. Sentencias SQL Precompiladas (PREPARED STATEMENT)


Sentencias SQL precompiladas

Las sentencias SQL Precompiladas (PREPARED STATEMENT) son:

CLIENTE SELECT * FROM Clientes) SERVIDOR BD


------------------------------------> Compilar
<----------------------------------- Ejecutar

En caso de ejecutar varias veces una misma sentencia SQL si el SERVIDOR las tiene que compilar baja el
rendimiento en la aplicación. Para que esto no ocurra se utilizan las sentencias precompiladas de SQL.

CLIENTE (SELECT * FROM Clientes) SERVIDOR BD


------------------------------------> Compilar
Codigo = 27
<----------------------------------- Ejecutar

Codigo = 27
------------------------------------>
<----------------------------------- Ejecutar

Codigo = 27
------------------------------------>
<----------------------------------- Ejecutar

i
16

948
ACCESO A DATOS EN JAVA

Parámetros de las sentencias SQL precompiladas

En vez de mandar la sentencia de nuevo se enviará sólo el código. Éste es devuelto por la base de datos.

Todas las sentencias pueden ser sentencias precompiladas y además se podrán paremetrizar:

INSERT INTO CLIENTES VALUE (?,?,?,?)

De esta forma se podrá repetir la instrucción INSERT las veces necesarias. La primera vez enviando la propia
sentencia y las restantes veces se enviará el código devuelto por la base de datos.

Las sentencias precompiladas se representan mediante el interface PreparedStament el cual deriva de


Statement. Para las sentencias precompiladas se le dirá a la conexión que se quiere una Prepared Statement.

Statement <Connection>.createStatement()
throws SQLException
PreparedStatement <Connection>.prepareStatement(String sql)
throws SQLException
void <PreparedStatement>.setString (int paramIndex,
String value) throws SQLException
void <PreparedStatement>.setFloat (int paramIndex,
float value) throws SQLException

i
17

949
ACCESO A DATOS EN JAVA

Ambas sentencias sirven para fijar los parámetros de la sentencia precompilada.

Todas estas sentencias sirven para la ejecución de las sentencias SQL precompiladas.

Estos métodos se diferencian de los métodos de Statement en que en estas sentencias no se les pasa la
sentencia SQL ya que se le ha pasado anteriormente en el método prepareStatement

ResultSet <PreparedStatement>.executeQuery()
throws SQLException
int <PreparedStatement>.excuteUpdate() throws SQLException
boolean <PreparedStatement>.execute() throws SQLException

i
18

950
ACCESO A DATOS EN JAVA

5. Uso de transacciones
La transacción y sus propiedades

Una transacción es un conjunto de operaciones que se quiere enviar a la base de datos de forma que se
ejecute toda la transacción o que no se ejecute nada.

Una transacción se puede definir como un cambio de estado de la base de datos.

Este cambio de estado no se puede realizar ya que no existe ninguna instrucción de SQL para realizarla sino
que hay que usar varias instrucciones.

Las transacciones tienen tres propiedades:

Atomicidad
Consiste en que la transacción se realiza completamente o no se realiza en absoluto.

Serialización
Dos transacciones concurrentes se ejecutan de forma de que el resultado es el mismo que si se hubiera
realizado primero una y luego la otra.

Persistencia
El sistema debe ser lo bastante seguro como para que no se produzcan pérdidas de información.

i
19

951
ACCESO A DATOS EN JAVA

El auto commit mode

En Java, cuando se realiza la conexión con la base de datos, el sistema se encuentra en auto commit mode,
esto quiere decir que cada sentencia que se envíe se considera una transacción.

Para realizar varias sentencias en SQL como una sola transacción habrá que desactivar el auto commit mode.
Esto se realiza con el siguiente método:

void <Connection>.setAutoCommit (boolean autoCommit)

Cuando se quieran ejecutar todas las sentencias SQL lanzadas contra la base de datos habrá que ejecutar el
siguiente método:

void <Connection>.commit() throws SQLException

Si no se confirma la transacción se deshace la transacción.

Si se quiere deshacer la transacción se tiene el siguiente método.

void <Connection>.rollback() throws SQLException

Las excepciones que lanza rollback no tienen que ver con las transacciones que se han realizado. La excepción
nos informan sobre otro tipo de problemas que se puedan dar durante la operación de rollback (caída de la
red, etc)

i
20

952
ACCESO A DATOS EN JAVA

Cuando se abre una transacción se bloquean registros de la base de datos, esto hay que tenerlo en cuenta.
Siempre es aconsejable que el ordenador realice todas las operaciones de la transacción.

setAutoCommit

El auto commit mode no se activa tras realizar el método comit sino que habrá que activarlo mediante el
método setAutoCommit.

Ejemplo de programa con transacciones:

conexion.setAutoCommit (false);
try {
Statement stmt = conexion.createStatement();
stmt.executeUpdate ("INSERT INTO Clientes VALUES
(1,'Luis',"Principe de Vergara 44',4000000)");
stmt.executeUpdate ("INSERT INTO Clientes VALUES
(1,'Jose',"O'Donell 10',7000000)");
conexion.commit();
}

catch (Exception ex) {


System.out.println("Transacción deshecha "+ex);
}

conexion.setAutoCommit (true);

i
21

953
ACCESO A DATOS EN JAVA

Niveles de aislamiento I

Las bases de datos tienen lo que se llaman niveles de aislamiento (Isolation Levels). Los niveles de aislamiento
informan de cuánto tiempo está una transacción aislada del resto de transacciones.

Para trabajar con el nivel de aislamiento se tienen los siguientes métodos:

int <Connection>.getTransactionIsolation()
Devuelve el código de nivel de aislamiento
void <Connection>.setTransactionIsolation(int level)
throws SQLException
Fija el nivel de aislamiento.

Para fijar el nivel de aislamiento de la base de datos se siguen tres criterios:

- Si se evitan los dirty read. Esto quiere decir, que hasta que otra transacción no se confirma no se
pueden leer los cambios de dicha transacción.

- Si se establece el valor del registro durante toda la transacción (repeatable read). Es decir, aunque
otra transacción confirme, en la consulta se tiene el valor original por si el algoritmo lo volviese a
leer hasta que esta última transacción se cierre.

- Si la transacción es serializable. No se suele aconsejar este tipo de transacciones a no ser que sean
estrictamente necesarias.

i
22

954
ACCESO A DATOS EN JAVA

Niveles de aislamiento II

A continuación se muestran los niveles de aislamiento:

1. TRANSACTION_NONE
no se soporta nada.

2. TRANSACTION_READ_UNCOMMITED
es un nivel poco aislado, se pueden producir diry read y no se garantiza repeatable read ni serialización.

3. TRANSACTION_READ_COMMITED
evita los dirty read pero no garantiza los repeatable read ni la serialización.

4. TRANSACTION_REPEATABLE_READ
esta opción evita los dirty read y garantiza los repeatable read.

5. TRANSACTION_SERIALIZABLE
evita dirty read, garantiza repeteable read y serialización.

IDS SERVER (Driver de Tipo 3)

Programa Driver Servidor de acceso Base de Datos


Java Tipo3 a la base de datos
CLIENTE (Browser) SERVIDOR

Existe la restricción de que un Applet solamente puede conectarse con la máquina de la que procede. Es decir,
el Applet sólo puede comunicarse con el Servidor de Web, es decir el Servidor de la base de datos debe estar
en la misma máquina que el Servidor de Web.

i
23

955
ACCESO A DATOS EN JAVA

Esta restricción se da por seguridad ya que el Applet entonces podría acceder al cliente y aprovechar por
ejemplo su dirección IP.

www.idsoftware.com (IDSS321.EXE)

El driver de tipo 3 (todo Java), como el servidor de acceso a datos, debe estar hecho por la misma empresa.

Clases del driver: applet o un programa

Las clases del driver dependen de que lo que se realice sea un Applet o un programa:

Si es un programa, se deberá introducir en el Classpath: \classes\jdk12drv.zip

SET CLASSPATH= %CLASSPATH%;c:\IDSServer\classes\jdk12drv.zip

Si es un Applet, se deberá descomprimir el fichero \classes\jdk12drv.zip en el mismo directorio donde esté


el Applet. Si las clases no están en la máquina virtual buscará en el servidor, por eso debe estar
descomprimido el fichero.

1. Se carga el driver de la base de datos:

Class.forName("ids.sql.IDSDriver");

i
24

956
ACCESO A DATOS EN JAVA

2. Se monta la cadena de conexión:

String url = "jdbc:ids://localhost:12/conn?dbtype=odbc&dsn='DSNxxx'";


Connection conexion = DriverManager.getConnection(url);

- localhost, se corresponde a la máquina donde se va a conectar. Se puede poner también la


dirección IP.

- 12 corresponde al puerto que también es configurable.

INTERBASE (Driver de Tipo 4)

Es de arquitectura Cliente-Servidor.

Existe para Windows y Unix.

Partes de InterBase:

- InterBase, es el motor de la base de datos.


- InterClient, es un driver de tipo 4 que viene dentro del fichero interbase.jar.
- InterServer, es un servidor de acceso a la base de datos.

Programa Driver de Servidor de acceso


Java Tipo 4 a la base de datos InterBase
InterClient InterServer

i
25

957
ACCESO A DATOS EN JAVA

Procedimientos almacenados (Stored Procedures)

Los procedimientos almacenados son un conjunto de instrucciones de base de datos que se van a ejecutar
en la base de datos del servidor. Con esto se gana CPU en el cliente pero se pierde CPU en el servidor.

- Una ventaja importante es que al ejecutarse todo en el servidor no hay que realizar transporte de
información por lo tanto se acelera el proceso ya que sólo se realiza una petición por el cliente y el
resultado producido por el servidor.

- Los procedimientos almacenados son funciones de java que van a tener parámetros de entrada (IN)
y parámetros de salida (OUT).

- También existen parámetros INOUT, donde se les pasa un parámetro de entrada y en el mismo
parámetro se produce la salida.

La única diferencia que existe con las funciones es que los procedimientos almacenados pueden tener varios
parámetros de salida.

Los procedimientos almacenados varían dependiendo el uso de la base de datos.

i
26

958
ACCESO A DATOS EN JAVA

Ejecución de procedimientos almacenados

Para realizar la ejecución de procedimientos almacenados desde Java se necesitará un objeto del tipo
CallableStatement (interface).

Para preparar el procedimiento almacenado a ejecutar.

Satement <---- PreparedStatement <---- CallableStatement

CallableStatemnt <Connection>.prepareCall (String sql)


throws SQLException

Formato de SQL:

"{call Anade Cliente (?,?,?,?)}" --> IN

"{? call SumaSaldos()}" -->OUT

Tras haber preparado el procedimiento almacenado se cargarán los parámetros de entrada, si existen, con
los métodos set (setInt, setString, ...) :

c.SetInt (1,8);
c.SetString (2,"Pedro Perez");
c.SetString (3,"C/ Alcantara S/N");
c SetInt (4,80000);

i
27

959
ACCESO A DATOS EN JAVA

Procedimientos Almacenados : Parámetros de salida

En el caso de que el procedimiento almacenado tenga parámetros de salida habrá que registrarlos antes de
ejecutar el procedimiento almacenado. Se tiene el siguiente método:

void <CallableStatement>.registerOutParameter
(int parameterIndex, int sqlType) throws SQLException

El parámetro parameterIndex comenzará por 1.


El parámetro sqlType se corresponde con los Types de java.sql.Types.

Para realizar la ejecución de un procedimiento almacenado.

ResultSet <CallableStatement>.executeQuery()
int <CallableStatement>.executeUpdate()
boolean <CallableStatement>execute()

Para recoger lo que ha devuelto el procedimiento almacenado tras su ejecución, se tienen los siguientes
métodos:

boolean <CallableStatement>.getBoolean(int parIndex)


String <CallableStatement>.getString(int parIndex)
Int <CallableStatement>.getInt(int parIndex) . . .

Se le pasa el índice del parámetro de entrada.

i
28

960
ACCESO A DATOS EN JAVA

Fichero interclient.jar

Para abrir la conexión con la base de datos se debe utilizar el fichero interclient.jar (driver de tipo 4).
Dependiendo de si es un Applet o un programa, la ejecución será distinta.

Si es un programa se introducirá dentro del CLASSPATH:

SET CLASSPATH= %CLASSPATH%;c:\....\interclient.jar

Si es un Applet, se deberá descomprimir en el directorio donde está el Applet.

Para cargar los drivers de INTERBASE:

Class.forName("interbase.interclient.Driver");
Connection conexion = DriverManager.getConnection
("jdbc:interbase://localhost/c:\xxx\xxx\xxx.gdb",
user,password);

i
29

961
ACCESO A DATOS EN JAVA

6. Resumen

Has llegado al final de este recurso formativo que denominamos “La tecnología JDBC”
En esta lección hemos estudiado los siguientes contenidos:

i
30

962
ACCESO A DATOS
EN JAVA

963
ACCESO A DATOS EN JAVA

XML como almacenamiento de datos


Nacimiento del XML

XML es un lenguaje de Marcado, tal como lo es HTML. Los dos comparten un mismo origen, el SGML, el SGML
(Standard Generalized Markup Language o Lenguaje estandarizado y generalizado de Marcado) es un estándar
internacional (ISO 8879) que nació con la necesidad de publicar documentos extensos, originalmente
manuales de mantenimiento de aeronaves, su inventor fue Charles F. Goldfarb en 1974. La principal
característica del lenguaje SGML era y es la de crear elementos personalizados y desarrollar vocabularios que
pueden ser utilizados por otras aplicaciones. En definitiva, lo que SGML permite es crear otros lenguajes de
marcado personalizados. Esto es lo que Tim Berners-Lee hizo al crear el lenguaje HTML (Hipertext Markup
Language), a partir de SGML creó su propio lenguaje de Marcado.

Esto nos lleva a la primera conclusión, que probablemente destierre alguna de las ideas que podamos tener
acerca del lenguaje XML. El lenguaje XML no es una evolución de HTML ni es una versión extendida de éste.
HTML y XML comparten el mismo origen, puesto que los dos están basados en SGML.

Cuando el W3C (World Wide Web Consortium), pensó que era hora de poner orden en el galimatías que
representaba el sinfín de tecnologías derivadas de HTML, que los distintos fabricantes de software para la
red habían realizado a partir de sus interpretaciones personales y objetivos empresariales de distinto signo,
decide que va ha realizar un nuevo lenguaje que dé soporte a la red tanto en el presente como en el futuro.
Para ello, una de las primeras premisas que se fijó en W3C fue la escalabilidad.

El W3C en esta ocasión jugaba con ventaja, ya que disponía de la suficiente información y experiencia basada
en lo que actualmente representaba, para lo bueno y para lo malo, el lenguaje de marcado HTML. Es por esto
que también se plantearon los problemas que presentaba el lenguaje HTML para darles una solución. Entre
otros, y a grandes rasgos, el lenguaje HTML presentaba y presenta problemas como que es un lenguaje que
está basado más en la definición de la presentación que en el contenido. HTML, además, presenta problemas
significativos de internacionalización, posee una estructura caótica (más adelante veremos por qué, al definir
la estructura de los documentos XML en comparación con HTML). La interpretación del HTML también es
ambigua, dependiendo del software que se utilice. Además, el lenguaje HTML no es fácilmente procesable,
y sólo posee un uso, el de las páginas Web.

964
ACCESO A DATOS EN JAVA

NOTA: El W3C es el organismo universal que regula el funcionamiento desde el punto de vista
técnico de la World Wide Web. La principal función del W3C es la de crear estándares aceptados
universalmente, para que los estándares que se creen no favorezcan a ningún fabricante, u
organismo en particular. Otra de sus obligaciones es la de mantener al día las tecnologías de la
WWW para que éstas respondan a las necesidades crecientes de los usuarios de la WWW. Entre
otros, el W3C controla los estándares de html y xml. El W3C fue constituido en 1994 con el
objetivo del desarrollo de protocolos comunes para la evolución de Internet. El W3C es un
consorcio de industrias internacionales y organismos, como el mit (EEUU), inria (Francia) y keio
university (Japón). El W3C cuenta con el apoyo oficial de darpa (EEUU) y de la Comisión Europea.

Llegados a este punto, el W3C decide poner manos a la obra y comienza a plantearse un nuevo lenguaje, que
ante todo, y como hemos apuntado anteriormente, fuera muy escalable. Para ello, en un primer momento
el W3C pensó directamente en el lenguaje SGML, que poseía todas las características técnicas para garantizar
los objetivos que el W3C perseguía con el nuevo lenguaje, pero SGML era un lenguaje bastante complicado,
y precisamente lo que había hecho popular al lenguaje HTML era la sencillez de su uso. Para ello, se marcaron
un objetivo de crear un nuevo lenguaje de marcado, que pudiese ser tan escalable como SGML, pero que
conservase la sencillez como base del mismo para que éste se hiciese popular.

XML nace entonces (1996) como una parte de SGML, y es adoptado como estándar en Febrero de 1998 por el
W3C.

XML son las siglas de eXtended Markup Language o lenguaje de marcado extendido.

XML

Aunque en su nombre se hace referencia a él, seguramente estamos confundidos acerca de si XML es un
lenguaje de Marcado. A simple vista, podríamos decir que sí, ya que XML está basado en un lenguaje de
Marcado SGML y además tiene un primo que es un conocido lenguaje de Marcado HTML.

XML debería ser también un lenguaje de Marcado, sin embargo, no lo es, XML es más un lenguaje de lenguajes
de marcado, o más concretamente un meta-lenguaje de marcado. Para explicar esto en palabras llanas,
podríamos decir que a partir de XML podemos crear nuestro propio lenguaje de Marcado. Además, aunque
está basado en SGML está adaptado para su uso en Internet, y se ha simplificado de cara a su sencillez de
uso y aprendizaje.

965
ACCESO A DATOS EN JAVA

La diferencia con un lenguaje de marcado es que su principal función es la de la descripción del contenido
de un documento, mientras que XML se encarga del formato de ese contenido. XML, además, puede ser
ejecutado desde cualquier sistema operativo o plataforma. Describe información, por ello, es ideal para el
intercambio de datos en la red o fuera de ella, por ejemplo entre aplicaciones, éste es el caso de la suite
de Microsoft Office que utiliza XML para intercambiar datos entre las distintas aplicaciones, como por ejemplo
entre Word, Excel y Access, así como la transformación de documentos entre distintos formatos, por ejemplo
de RTF (Rich Text Format) a HTML.

NOTA: Microsoft ha sido y es desde siempre un acérrimo defensor de XML, tanto es así que
podemos encontrar mucha información acerca de XML en su Web site:

www.microsoft.com.

Además, el primer navegador capaz de soportar XML fue Exlorer 4 de Microsoft, que de esta
manera se adelantaba a su más directo competidor, Netscape.

XML es suficientemente potente para ser usado no sólo para describir documentos, sino también para
describir Meta datos (Conjunto de información que describe a otra).

Información

XML nació para la red, pero la red no constituye la única funcionalidad de XML. Borland utiliza en sus
herramientas de programación DELPHI y C++ BUILDER, así como en KYLIX, XML como lenguaje de definición
de tablas de bases de datos, además de la información contenida en ellas.

Los documentos XML son procesados mediante aplicaciones que analizan XML (analizadores o Parsers). Estos
analizadores generan una salida basada en los contenidos del documento y en la marca que el documento
XML utiliza para describir los contenidos. XML a diferencia de su primo el HTML, separa drásticamente el
contenido de la visualización, aunque esto también es posible ahora con HTML, utilizando hojas de estilo
(CSS Cascade Style Sheets, hojas de estilo en cascada).

966
ACCESO A DATOS EN JAVA

XML versus HTML

XML no sustituirá a HTML, más bien XML complementará a HTML, permitiendo de esta manera poder realizar
aplicaciones para la red más robustas y escalables. Esto no quiere decir que XML hipotéticamente podría
sustituir a HTML en un futuro, incluso el W3C ha definido el modelo de objeto de documento (DOM Document
Object Model) de HTML en el que están basados los navegadores de acuerdo al lenguaje XML (con estructura
XML), pero la implantación de DOM HTML en los navegadores es opcional.

Pero, sin duda, el mayor freno que tiene la sustitución de HTML por XML está basado en el éxito que HTML
tiene y ha tenido, que hace prácticamente imposible y económicamente inviable la migración de millones y
millones de páginas WEB, que actualmente están en la red, además HTML seguirá siendo un lenguaje fácil y
asequible para todas aquellas personas que desean publicar páginas web sencillas, y que no justifican la
necesidad de aprender otro lenguaje más potente, como XML.

Soporte XML

En un futuro no muy lejano los navegadores soportarán nativamente XML, de hecho, a día de hoy Microsoft
Explorer y Netscape lo soportan. Pero, la forma de interpretarlo en el lado del cliente puede ser distinta
dependiendo del navegador, es por ello que hoy en día la utilización de XML en la red se restringe a su uso
de lado del servidor, y a corto plazo es donde tiene un mayor éxito, y lo tendrá sin duda pero, no olvidemos
que día a día se encuentran nuevos usos y funcionalidades para el lenguaje XML, por lo que seguramente en
un futuro próximo podremos encontrar XML por todas partes.

En XML se separa, como se dijo anteriormente, la presentación del contenido, hablando en este caso de la
creación de documentos para la red. Por ejemplo, de un mismo documento XML podríamos crear diferentes
interpretaciones de visualización, como por ejemplo la ya conocida de HTML, WML (Wireless Markup
Language, lenguaje de marcado, que utiliza la tecnología WAP para las telecomunicaciones móviles), RTF o
PDF (formato utilizado para documentos por Adobe Acrobat), etc. y en todos ellos podríamos ver la misma
información.

Además, XML está diseñado para ser utilizado con cualquier tipo de conjunto de caracteres y, por
consiguiente, cualquier tipo de lenguaje o idioma. XML se presenta como el formato ideal para el intercambio
de documentos, a través de la red o a través de cualquier otro método. Algunas de las utilidades que se ven
beneficiadas por el uso de XML son, entre otras, las transacciones entre empresas en la red, las técnicas de
extracción de datos, como DATAMINING o DATAMARK y, por supuesto, la creación de nuestros propios lenguajes
de marcado para dotar a nuestras aplicaciones de herramientas que permitan el intercambio de datos entre
distintas aplicaciones.

967
ACCESO A DATOS EN JAVA

En XML las reglas de composición de un documento son estrictas, no pueden ser dejadas al libre albedrío tal
y como sucede en HTML, más adelante ampliaremos esta característica.

Partes que forman un documento XML

Los documentos XML están formados por varias partes, que son:

El elemento

Es la parte fundamental de la estructura del documento XML. Se identifica mediante el nombre del elemento.
Se corresponde con la etiqueta (tag) que podemos encontrar en HTML

HTML XML

<HEAD> <VEHICULO>

En el ejemplo anterior, el nombre del elemento se corresponde con VEHÍCULO.


Sin embargo, en HTML es opcional la etiqueta de cierre, y no pasa nada si se omite, pero en XML es
completamente imprescindible la etiqueta de fin.

HTML XML

<HEAD> <VEHICULO> </VEHICULO>

El contenido del elemento

Es la parte del documento XML que contiene, valga la redundancia, el valor que representa el elemento.

<VEHICULO> M-9999-ZZ </VEHICULO>

968
ACCESO A DATOS EN JAVA

El atributo

Forma parte del elemento, su función es la de aportar mayor información acerca del elemento.

<VEHICULO MARCA=”OPEL”> M-9999-ZZ </VEHICULO>

Un elemento puede contener más de un atributo, o ninguno.

<VEHICULO MARCA=”OPEL” MODELO=”CORSA”>


M-9999-ZZ
</VEHICULO>

Dentro del atributo encontramos dos partes, el nombre del atributo y el valor del atributo. En los ejemplos
anteriores:

El nombre del atributo sería

MARCA
MODELO

Y el valor de los mismos

OPEL
CORSA

Reglas de composición de documentos XML

Las reglas de composición de documentos XML son muy sencillas, pero inflexibles, es decir, no puede saltarse
ninguna de estas reglas.

Seguidamente, veremos cada una de ellas:

Estructura jerárquica de los elementos

Los elementos deben seguir una estructura jerárquica o en árbol, es decir, cada elemento debe estar
contenido dentro de otro elemento.

969
ACCESO A DATOS EN JAVA

La excepción a esta regla es el elemento raíz, del que parten todos los demás elementos.

<VEHICULO>

</VEHICULO>

Los elementos además deben estar anidados.

<VEHICULO>
<PROPIETARIO>
<NOMBRE>

</NOMBRE>
</PROPIETARIO>
</VEHICULO>

Orden de los elementos

Los elementos no pueden estar superpuestos

INCORRECTO CORRECTO

<VEHICULO> <VEHICULO>

<PROPIETARIO> <PROPIETARIO>

</VEHICULO> </PROPIETARIO>

</PROPIETARIO> </VEHICULO>

Los elementos, obligatoriamente, deben estar “cerrados”

INCORRECTO CORRECTO

<VEHICULO> <VEHICULO>

<PROPIETARIO> <PROPIETARIO>

</PROPIETARIO>

</VEHICULO> </VEHICULO>

970
ACCESO A DATOS EN JAVA

Sólo puede existir un elemento raíz del que parten los demás

INCORRECTO CORRECTO

<VEHICULO> <VEHICULO>

</VEHICULO> <PROPIETARIO>
<PROPIETARIO> </PROPIETARIO>

</PROPIETARIO> </VEHICULO>

Nombre de los elementos

El nombre de los elementos debe empezar siempre con una letra, y puede ser seguido por otros caracteres
alfanuméricos. El nombre de un elemento nunca puede comenzar por XML, xml, xML o cualquier variación
de éste.

XML es case sensitive

Debemos recordar siempre que XML es Case Sensitive (distingue entre mayúsculas y minúsculas), por lo que
para el analizador el elemento <Elemento> no será igual que <elemento>. Veamos el siguiente ejemplo:

INCORRECTO CORRECTO

<Elemento> <elemento>

<elemento2> <elemento2>

</elemento2> </elemento2>

</elemento> </elemento>

Uso de espacios y retorno de carro

El espacio y el retorno de carro sólo son tenidos en cuenta si aparecen en el valor de un atributo o, como en
HTML si se indica su significado.

971
ACCESO A DATOS EN JAVA

Marcado y datos

Las marcas se corresponden con las que comienzan por < y terminan con >. Evidentemente, los elementos
que anteriormente hemos visto son marcas o “mark-up”.
El texto que encontramos entre las marcas o etiquetas son los datos del documento propiamente dicho.

En las referencias de entidad se utiliza el carácter ampersand (&), y finalmente el punto y coma (;).

Prólogo

El prólogo es opcional, pero generalmente comienza especificando que se trata de un documento XML y la
versión de XML que contiene. También, a veces, encontramos referencia a la codificación de caracteres con
la que está realizada el documento.

<?xml version = “1.0”?>


ó
<?xml version = “1.0” encoding = “UTF-7”?>

En la segunda línea del prólogo, generalmente encontramos la referencia a los documentos de definición
(DTD), que más adelante veremos.

<!DOCTYPE documento SYSTEM “documento.dtd”>

Entidades predefinidas

Son aquellas que no son interpretadas como marcado por el analizador de XML. Es decir, si queremos utilizar
alguno de estos caracteres no podemos hacerlo directamente, y, si lo hiciésemos, el analizador lo
interpretaría como marca y no como valor. Son cinco:

CARÁCTER ENTIDAD

& &Amp;

> &gt;

< &lt;

‘ &apos;

“ &quot;
10

972
ACCESO A DATOS EN JAVA

Documentos XML bien formados (well formed)

Los documentos XML “bien formados” son aquellos que cumplen las reglas arriba descritas. Para que un
documento sea un documento XML tiene obligatoriamente que ser un documento bien formado.

Además de las reglas arriba escritas existen caracteres que no pueden ser utilizados para formar parte del
nombre de elementos o atributos. Tampoco se pueden utilizar acentos, ni otros elementos de puntuación.

Que un documento XML esté bien formado no significa que sea un documento válido, tal como veremos más
adelante.

Un ejemplo xml

En el siguiente ejemplo se muestra un documento XML.

<?xml: version=”1.0”?>

<!—Ejemplo 1—>

<libro>

<titulo>Un titulo cualquiera</titulo>

<capitulos>

<capitulo>
<titulo> Capitulo 1 </titulo>

<párrafo número = 1>

Un párrafo

</párrafo>

</capitulo>

<capitulo>

<titulo> Capitulo 2 </titulo>

</capitulo>

</capitulos>

</libro>

11

973
ACCESO A DATOS EN JAVA

Comencemos a describir el documento por la primera línea.

<?xml: version=”1.0”?>

Todos los documentos XML deben comenzar con una línea como la anterior, donde especificamos que el
documento es un documento XML y que se corresponde con la versión 1.0.
Esta línea es necesaria en los documentos XML y sirve para que los navegadores o analizadores XML detecten
que el fichero que están leyendo es un documento XML, y que se corresponden con la versión 1.0 de las
especificaciones propuestas por el consorcio w3c.

<!—Ejemplo 1—>

En el caso de la segunda línea, si conoce algo de HTML reconocerá fácilmente que se trata de un comentario,
todos los comentarios en XML deben comenzar con <!— y finalizar con —>.

<!— Esto es un comentario XML —>

Si el texto que forma parte del comentario tiene más de una línea no supone ningún problema, siempre que
empecemos y terminemos el comentario con los caracteres de comienzo y fin, respectivamente.

<!— Esto es un comentario XML que


ocupa más de una línea —>

Se pueden utilizar los comentarios en cualquier parte del documento, excepto dentro de las etiquetas,
declaraciones o dentro de otros comentarios.

<libro>

Es el primer elemento que encontramos en el documento XML, por esto se corresponde con el elemento raíz
del documento, lo que quiere decir que todos los demás elementos estarán contenidos en el elemento raíz
“<libro>”.

<titulo>Un título cualquiera</titulo>

Un nuevo elemento que parte directamente de la raíz del documento, el elemento <titulo> título tiene como
valor “Un título cualquiera” y, finalmente, está cerrado “</titulo>”, lo que quiere decir que el elemento
título no tiene ningún otro subelemento o elemento que dependa de él.

<capitulos>

12

974
ACCESO A DATOS EN JAVA

Un nuevo elemento que parte directamente de la raíz del documento.

<capitulo>

Un elemento que depende del elemento <capitulos>

<titulo> Capítulo 1 </titulo>

<titulo> es un nuevo elemento, pero se diferencia del elemento <titulo>, que vimos anteriormente, en que
éste no depende de la raíz, sino que en este caso depende del elemento <capitulo>, se trata de dos elementos
totalmente diferentes. “Capítulo 1” es el valor del elemento y </titulo> se corresponde con el cierre del
elemento.

<párrafo número = 1>


Un párrafo
</párrafo>

<párrafo> es un nuevo elemento, que al igual que el anterior parte o está incluido dentro del elemento
<capitulo>, también se diferencia del anterior en que este elemento posee un atributo “número” y se le
asigna un valor a ese atributo “1”; por lo demás, es igual al anterior, el elemento tiene un valor “Un párrafo”,
y finalmente encontramos una etiqueta de cierre </parrafo>.

</capitulo>

Cerramos el elemento <capitulo> con la etiqueta de cierre </capitulo>.

<capitulo>

Abrimos nuevamente un elemento <parrafo>, como en el caso del anterior elemento párrafo éste se
encuentra dependiente de la raíz, y por tanto se encuentra al mismo nivel que el anterior, por lo que el
analizador lo detectará como el segundo valor correspondiente al elemento <capitulo>. Este caso es
completamente diferente del que veíamos anteriormente con <titulo>, ya que como veíamos antes el
elemento título no se encontraba en el mismo nivel que el otro elemento <titulo>, que dependía del elemento
raíz del documento.

<titulo> Capítulo 2 </titulo>

13

975
ACCESO A DATOS EN JAVA

Segundo valor de la etiqueta <titulo> dependiente de <capitulo>.

<capitulo>

Abrimos un nuevo elemento <capitulo>.

</capitulos>

Cerramos el elemento <capitulos>

</libro>

Cerramos el elemento raíz. Al cerrar este elemento (el raíz) el documento se da por finalizado, a partir de
este momento no podemos abrir o cerrar ningún otro elemento, sí podríamos, por supuesto, incluir
comentarios; en caso de que abriésemos un nuevo elemento no nos daría como resultado un documento bien
formado, y como consecuencia un error.

Este otro ejemplo sería incorrecto (no estaría bien formado).


<?xml: version=”1.0”?>
<!—Ejemplo 1—>
<libro>
<titulo>Un titulo cualquiera</titulo>
<capitulos>
<capitulo>
<titulo> Capitulo 1 </titulo>
<párrafo número = 1>
Un párrafo
</párrafo>
</capitulo>
<capitulo>
<titulo> Capitulo 2 </titulo>
</capitulo>
</capitulos>
</libro>
<autor>
el autor del libro
</autor>

14

976
ACCESO A DATOS EN JAVA

La incorrección de este ejemplo está fundamentada en que no existe elemento raíz. Para que el ejemplo
estuviese bien formado debería escribirse de esta otra manera:

<?xml: version=”1.0”?>
<!—Ejemplo 1—>
<libro>
<titulo>Un titulo cualquiera</titulo>
<capitulos>
<capitulo>
<titulo> Capitulo 1 </titulo>
<párrafo número = 1>
Un párrafo
</párrafo>
</capitulo>
<capitulo>
<titulo> Capitulo 2 </titulo>
</capitulo>
</capitulos>
<autor>
el autor del libro
</autor>
</libro>

Atributos

Se puede dar el caso de que nos decidamos por elementos que no tengan valor ni subelementos, pero que
asignen distintos valores a atributos que pertenezcan al elemento.

<elemento atributo=”valor del atributo”> </elemento>

Aunque un elemento no contenga ningún valor, tal como hemos visto, tiene obligatoriamente que ser cerrado
como cualquier otro elemento, pero en un caso como éste podemos abrir la etiqueta del elemento y cerrar
el elemento dentro de la misma etiqueta de esta otra manera:

<elemento atributo=”valor del atributo”/>

Recordemos que el valor de los atributos siempre debe encerrase entre comillas simples (‘) o comillas
dobles (“).

15

977
ACCESO A DATOS EN JAVA

Esto es correcto:

<elemento atributo = “valor del atributo”/>

Esto no es correcto

<elemento atributo = valor del atributo />

Secciones CDATA

Hay ocasiones en las que el autor del documento XML debe incorporar texto como valor y que este texto
contenga caracteres no permitidos, ya que podrían ser confundidos con marcado del documento XML tal
como vimos en las entidades predefinidas (&,>,<,’,”). Para que el analizador XML tome el texto como “simple
texto” y no intente analizarlo, para ello encerramos el texto en lo que llamamos una sección CDATA
(Character Data).

En este ejemplo, el contenido de la etiqueta <etiqueta1> es código HTML, que como sabemos también utiliza
los caracteres < y > para señalar las etiquetas o tags HTML.

Sin sección CDATA:

<etiqueta1>
&lt;HTML&gt;
&lt;HEAD&gt;
&lt;TITLE&gt;
Esta es la Cabecera del Documento HTML
&lt;/TITLE&gt;
&lt;/HEAD&gt;
</etiqueta1>
Con Sección CDATA:
<etiqueta1>
<![CDATA[
<HTML>
<HEAD>
<TITLE>
Esta es la Cabecera del Documento HTML
</TITLE>
</HEAD>
]]>
</etiqueta1>
16

978
ACCESO A DATOS EN JAVA

Evidentemente, existe una excepción que se corresponde con el final de la sección CDATA ]]>, al utilizarse
estos caracteres para señalar el final de la sección CDATA no pueden ser utilizados dentro de la sección
CDATA. Si los utilizáramos el analizador de XML los confundiría con el final de la sección.

Definición de documentos y documentos válidos

No es suficiente para que un documento sea un documento XML que esté bien formado, además el documento
tiene que ser válido. Pero, ¿qué significa que un documento sea válido? Si tuviésemos que hacer una
definición, diríamos que un documento XML es válido cuando está bien formado, y además cumple las
definiciones propuestas en su definición de documento o DTD (Document Type Definition).

La DTD de un documento XML no es ni más ni menos que la definición de cada uno de los elementos y atributos
que forman parte del documento XML. Como veremos más adelante esta DTD puede estar incluida (a nivel
físico) en un fichero aparte con la extensión DTD o en el mismo fichero del XML. Realmente, lo que hacemos
al crear la DTD es definir las etiquetas y atributos de nuestro lenguaje de marcado, especificando qué
elementos forman parte de él, qué atributos, de qué tipo son, etc...

Si nos paramos a pensar, hay un paralelismo entre esto y el código HTML, ya que el HTML procede del SGML,
pero tiene sus etiquetas específicas que han sido propuestas en una “DTD”, en la DTD del lenguaje HTML.
Así las etiquetas <HTML> o <HEAD> o <B> están incluidas dentro de esa DTD del lenguaje HTML.
La DTD no sólo se limita a presentar o definir los elementos y atributos del documento XML, también puede
definir reglas de combinación de éstos.
Evidentemente, podemos crear documentos XML sin DTD, y probablemente funcionen correctamente, pero
en este caso, como dijimos anteriormente, no son documentos válidos, en este caso serían tan sólo
documentos bien formados.

Pasamos ahora a ver un pequeño ejemplo:

<?xml versión = “1.0”?>

<!DOCTYPE midocumento [
<!ELEMENT midocumento (elemento1, elemento2)>
<!ELEMENT elemento1 (#PCDATA)>
<!ELEMENT elemento2 (#PCDATA)>
]>

<midocumento>

<elemento1> contenido del elemento1 </elemento1>


<elemento2> contenido del elemento2 </elemento2>

</midocumento> 17

979
ACCESO A DATOS EN JAVA

En este ejemplo, podemos ver un documento XML con su DTD definida incluida en el propio documento. La
DTD define la estructura del documento “midocumento”, que coincide con el elemento raíz del documento:

<!DOCTYPE midocumento [

Después de declarar, el documento pasa a definir los elementos del mismo:

<!ELEMENT midocumento (elemento1, elemento2)>

Define el elemento mi documento, y señala que está formado por dos subelementos, elemento1 y elemento2.

<!ELEMENT elemento1 (#PCHAR)>

Define el elemento 1, y como no está formado por ningún otro subelemento, directamente señala el tipo de
información que contendrá el elemento, en este caso caracteres (#PCHAR).

<!ELEMENT elemento2 (#PCHAR)>

Define el elemento2 tal como lo hemos hecho con el elemento1.

]>

Cierra la declaración de tipo de documento (DTD).

En el caso en el que la DTD no esté incluida en el propio documento XML, debemos hacer referencia a ella
desde el documento XML. Quedaría de esta manera, tomando el ejemplo anterior:

<?xml versión = “1.0”?>

<!DOCTYPE midocumento SYSTEM “c:\midocumento.dtd”>

<midocumento>

<elemento1> contenido del elemento1 </elemento1>


<elemento2> contenido del elemento2 </elemento2>

</midocumento>

18

980
ACCESO A DATOS EN JAVA

LA DTD externa tendría este aspecto (fichero c:\midocumento.dtd):

<!ELEMENT midocumento (elemento1, elemento2)>


<!ELEMENT elemento1 (#PCDATA)>
<!ELEMENT elemento2 (#PCDATA)>

Declaración de elementos en la dtd

Como los elementos son la base de los documentos XML, éstos deben estar definidos de manera correcta para
que el documento XML pueda ser válido. Como hemos visto anteriormente en el ejemplo, los elementos se
declaran con la etiqueta <!ELEMENT.
Al declarar los elementos debemos declarar también su contenido. Tal como vimos en el ejemplo anterior si
el elemento contiene otros elementos o subelementos, éstos deben estar definidos en la declaración del
elemento, de esta manera, definimos la estructura en árbol del documento XML.

<!ELEMENT midocumento (elemento1, elemento2)>

En el ejemplo, declaramos un elemento midocumento y definimos su contenido, en este caso el contenido


de “midocumento” es otro elemento el “elemento1” y el “elemento2”.
Según esta declaración del elemento “midocumento”, el siguiente documento XML sería válido:

<midocumento>

<elemento1> contenido del elemento1 </elemento1>


<elemento2> contenido del elemento2 </elemento2>

</midocumento>

Sin embargo, este otro no lo sería:

<midocumento>

<elemento1> contenido del elemento1 </elemento1>


<elemento2> contenido del elemento2 </elemento2>
<elemento3> contenido del elemento3 </elemento3>

</midocumento>

19

981
ACCESO A DATOS EN JAVA

Para que este documento XML fuese válido tendría que tener una declaración como esta:

<!ELEMENT midocumento (elemento1, elemento2, elemento3)>

Al hacer la declaración del elemento “midocumento” no hemos definido los elementos “elemento1” y
“elemento2”, sólo hemos dicho que el contenido de “midocumento” está formado por “elemento1” y
“elemento2”, es por esto que tenemos que declarar también los elementos que forman parte de
“midocumento”:

<!ELEMENT elemento1 (#PCDATA)>


<!ELEMENT elemento2 (#PCDATA)>

Esta vez el contenido de los elementos “elemento1” y “elemento2” no son elementos, en este caso el
contenido es una cadena de texto que define el tipo (#PCDATA).

Al definir el contenido de un elemento este puede ser de varios tipos:

Empty
Es un tipo de contenido para el que el elemento puede no tener contenido, generalmente este tipo es
utilizado para declarar atributos.

<!ELEMENT elementovacio EMPTY>

Any
Con este tipo, señalamos que nuestro elemento puede contener cualquier tipo de información, generalmente
no se usa, ya que es conveniente poseer una perfecta definición de nuestro documento.

<!ELEMENT cualquiera ANY>

Mixed
El tipo mixed señala que el elemento puede contener caracteres de texto, pero también elementos.

<!ELEMENT elementoN (#PCDATA | elementoN1)*>

Element
El elemento en cuestión sólo puede contener elementos:

<!ELEMENT midocumento (elemento1, elemento2)>

20

982
ACCESO A DATOS EN JAVA

Modelos de contenido en la declaración de elementos

El modelo de contenido dentro de la declaración de elementos, va a definir la forma en la que debemos


encontrar los elementos dentro de nuestro documento XML.
Con el modelo de contenido definimos el orden de los elementos, la obligatoriedad o no de ellos, elementos
opcionales, etc....
Comenzamos con el más básico:

<!ELEMENT midocumento (elemento1)>

El ejemplo muestra la declaración del elemento “midocumento”, y señala que “midocumento” debe incluir
el elemento “elemento1” en su interior.

<!ELEMENT midocumento (elemento1, elemento2)>

Esta otra declaración señala que el elemento “midocumento” está formado por elemento1, seguido de
elemento2, lo que denota el orden de los elementos. El orden de los elementos se define por medio de la
“,”.

(elemento1, elemento2, elemento3)

“elemento1”, seguido de “elemento2” y “elemento2” seguido de “elemento3”.

<!ELEMENT midocumento (elemento1 | elemento2)>

En este caso, hemos sustituido la “,” por “|”, con esta declaración estamos indicando opción. El elemento
“midocumento” puede estar formado por “elemento1” o por “elemento2”.

También se pueden combinar:

<!ELEMENT midocumento (elementoN, (elemento1 | elemento2))>

El elemento “midocumento” está formado por el elemento “elementoN”, seguido por un “elemento1” o un
“elemento2”. Las combinaciones también pueden ser agrupadas:

<!ELEMENT

midocumento

(elementoN, (elemento1|(elemento2,elemento2-1)))>

21

983
ACCESO A DATOS EN JAVA

El elemento “midocumento” está formado por un elemento “elementoN”, seguido por un “elemento1” o, un
“elemento2”, seguido por un “elemento2-1”. También, mediante el modelo de contenido podemos hacer
referencia a la frecuencia con la que deben aparecer los elementos.

<!ELEMENT midocumento (elemento1?)>

Esta declaración utiliza símbolo “?” para indicar que el elemento es opcional, el elemento “elemento1” se
puede repetir 0 ó 1 veces.

<!ELEMENT midocumento (elemento1+)>

Esta otra utiliza el símbolo “+” para indicar que el elemento es obligatorio, y que se puede repetir más de
una vez. El elemento “elemento1” es obligatorio y puede ser repetido tantas veces como queramos.

<!ELEMENT midocumento (elemento1*)>

El símbolo “*” indica que el elemento es opcional y repetible, el elemento “elemento1” puede existir una o
más veces o no existir. Como en los ejemplos anteriores, podemos hacer distintas combinaciones con la
frecuencia de los elementos, como en el siguiente ejemplo:

<!ELEMENT

midocumento

(elementoN?,(elemento1|(elemento2,elemento2-1))*)>

Esta declaración indica que “midocumento” puede estar formado o no por “elementoN”, seguido de 0 o “n”
combinaciones de “elemento1” o “elemento2”, seguido de “elemento2-1”.

Declaración de atributos

La declaración de los atributos se diferencia de la declaración de los elementos, sobre todo, en que los
atributos no pueden contener a su vez “sub-atributos”.

Como vimos en la unidad en la que presentábamos las diferentes partes de un documento XML, los atributos
se usan para complementar o añadir información a un elemento. Generalmente, la información que se incluye
en los atributos suele ser una información corta y que no está estructurada.

22

984
ACCESO A DATOS EN JAVA

Otra de las reglas a la hora de declarar Atributos es que los atributos sólo pueden ser declarados una sola
vez, y en el orden que queramos.

Las declaraciones de los atributos en la DTD se realizan con <!ATTLIST, seguido por el nombre del elemento
al que pertenece el atributo, el nombre del atributo y, por último, el tipo del atributo y el valor por defecto
del mismo.

Veamos un ejemplo:

<?xml version=”1.0”?>

<monitores>

<monitor marca=”Fujitsu”> 23456723 </monitor>

<monitor marca=”SONY”> 15556723 </monitor>

</monitores>

La DTD de este ejemplo será:

<!ELEMENT monitores (monitor)+>


<!ELEMENT monitor (#PCDATA)>
<!ATTLIST monitor marca CDATA #REQUIRED>

En el ejemplo, el atributo monitor puede contener texto, esto es lo que especificamos con CDATA, y además
especificamos que no tiene valor por defecto y que es obligatorio especificar el valor del atributo.
De otra manera, podríamos haber incluido un valor por defecto en el atributo marca.

<!ATTLIST monitor marca SONY>

También podemos especificar varios valores alternativos de esta otra forma:

<!ATTLIST monitor marca (SONY | FUJITSU)>

Con esta declaración, estamos especificando que el valor del atributo marca del elemento monitor será o bien
SONY o bien FUJITSU, pero no otro. Es posible añadir a la declaración anterior un valor por defecto:

<!ATTLIST monitor marca (SONY | FUJITSU) SONY>

23

985
ACCESO A DATOS EN JAVA

En este caso como en el anterior, el valor del atributo “marca” que pertenece al elemento “monitor” puede
ser o bien SONY o bien FUJITSU, y por defecto es SONY, si no especificamos el valor del atributo. Se puede
dar el caso de que no especifiquemos el valor del atributo, pero no queramos que el atributo adopte el valor
por defecto, para ello utilizamos #IMPLIED.

<!ATTLIST monitor marca CDATA #IMPLIED>

Tipos de atributos

Podemos definir atributos con diferentes tipos, para así disponer de un perfecta esquematización de la
información que nuestro documento XML contiene. Los tipos de atributos son:

CDATA
NMTOKEN
ENUMERADOS
ID
IDREF

Los atributos CDATA más comunes, son aquellos que pueden contener cualquier cosa (exceptuando los
caracteres y palabras reservadas de XML). Son los que se usan con mayor asiduidad dentro de los ficheros XML
para contener valores de tipo alfanumérico.

<!ATTLIST monitor marca CDATA #REQUIRED>

Los atributos NMTOKEN son parecidos a los CDATA, pero sólo pueden contener letras, números, puntos,
guiones, subrayados, y los dos puntos.

<|ATTLIST monitor marca NMTOKEN #REQUIRED>

Los atributos ENUMERADOS son aquellos en los que definimos los posibles valores que el atributo puede tener,
tal como vimos en un ejemplo anterior.

<!ATTLIST monitor marca (SONY | FUJITSU) SONY>

<!ATTLIST monitor marca (SONY | FUJITSU | PHILIPS)>

24

986
ACCESO A DATOS EN JAVA

Los atributos ID son aquellos que tienen como función servir de identificador de referencia, para que sea
llamado desde otro elemento que posea un atributo de tipo IDREF y, por lo tanto, debe contener un valor
único.

<!ATTLIST monitor marca ID #REQUIRED>

El atributo IDREF es el atributo con el que definimos que el valor del atributo es utilizado para localizar un
elemento con un atributo de tipo IDREF.

<!ATTLIST monitor marca IDREF #REQUIRED>

Veamos un ejemplo del uso conjunto de atributos de tipo ID e IDREF:

<!ELEMENT monitor EMPTY>

<!ATTLIST monitor marca ID #REQUIRED>

<!ELEMENT repuesto EMPTY>

<!ATTLIST repuesto marca IDREF #REQUIRED>

En el ejemplo vemos cómo el atributo marca del elemento repuesto tiene un valor para hacer referencia al
atributo marca del elemento monitor.

Declaración de entidades

Por medio de la declaración de entidades obtenemos la posibilidad de que el analizador XML no analice
determinados contenidos, siguiendo las reglas sintácticas del lenguaje XML. La declaración de entidades se
utiliza a menudo, por ejemplo, para declarar ficheros o direcciones de páginas web, no puede ser mas que
una abreviatura utilizada para hacer referencia a determinado valor, al hacer referencia dentro del
documento XML a la entidad, entonces el analizador la sustituye por el valor declarado en la DTD.
En el caso de que un documento haga referencia a un fichero de imágenes externo, la localización de la
imagen puede ser declarada como entidad y hacer referencia sólo al nombre dado a la entidad, para que el
analizador de XML sustituya el nombre de la entidad por el valor de ésta, en este caso la localización exacta
del fichero de imágenes.

25

987
ACCESO A DATOS EN JAVA

Las entidades en la DTD se declaran con <!ENTITY


Las entidades se agrupan en:

INTERNAS / EXTERNAS
ANALIZADAS / NO ANALIZADAS
GENERALES / PARÁMETRO

Entidades generales internas

Son abreviaturas que se usan dentro del documento XML, y son siempre analizadas, es decir, por medio de
la declaración de la entidad declaramos una abreviatura y por medio del nombre de la entidad hacemos
referencia al contenido de la entidad, el analizador entonces sustituye el nombre de la entidad o abreviatura
con el valor de la entidad, y una vez sustituida por el analizador, lo analiza sintácticamente como cualquier
otro texto.

Veamos un ejemplo completo:

<?xml version=”1.0”?>

<!DOCTYPE [

<!ELEMENT monitores (monitor)*>

<!ELEMENT monitor (#PCDATA)>

<!ATTLIST monitor marca CDATA #REQUIRED>

<!ENTITY VGA “Visual Graphics Adapter”>

]>

<monitores>

<monitor marca=”Fujitsu”>
23456723 &VGA
</monitor>

</monitores>

26

988
ACCESO A DATOS EN JAVA

Este ejemplo sería interpretado por el analizador como:

<?xml version=”1.0”?>

<!DOCTYPE [

<!ELEMENT monitores (monitor)*>

<!ELEMENT monitor (#PCDATA)>

<!ATTLIST monitor marca CDATA #REQUIRED>

]>

<monitores>

<monitor marca=”Fujitsu”>
23456723 Visual Graphics Adapter
</monitor>

</monitores>

Entidades generales externas analizadas

Las entidades externas generales analizadas funcionan de igual manera que las anteriores, con la excepción
de que obtienen el valor de la entidad fuera del documento.

Si hacemos referencia desde nuestro documento XML a una entidad externa analizada, el analizador extraerá
el contenido del fichero o link al que hacemos referencia por medio de la entidad, sustituirá al nombre de
la entidad por el contenido del fichero externo y lo analizará.

<?xml version=”1.0”?>

<!DOCTYPE [

<!ELEMENT monitores (monitor)*>

<!ELEMENT monitor (#PCDATA)>

<!ATTLIST monitor marca CDATA #REQUIRED>

27

989
ACCESO A DATOS EN JAVA

<!ENTITY MANUAL SYSTEM “c:\manual.doc”>

]>

<monitores>

<monitor marca=”Fujitsu”>
23456723 &MANUAL
</monitor>

</monitores>

En la declaración de la entidad podemos observar la utilización de la palabra reservada SYSTEM, que es la


que indica que el contenido de la entidad va ha ser obtenido fuera del documento.
Después de la palabra clave SYSTEM debemos hacer referencia al documento por medio de una URI (Universal
Resource Identifier), que puede hacer referencia a un documento dentro de la máquina, o bien, entre otras,
a través de la red.

<!ENTITY MANUAL SYSTEM “http//:www.miwebsite.com/manual.doc”>

Tal como hemos visto en los tipos anteriores de entidades, en este caso, después de ser sustituido el valor
de la entidad, éste es analizado por el analizador XML de manera transparente, luego es ANALIZADA.

Entidades no analizadas

Imaginemos el caso en el que la declaración de la entidad haga referencia a un fichero externo, cuyo
contenido sea una imagen o un sonido, en este caso, el analizador de XML intentará analizarlo de manera
transparente, tal como hemos visto en los tipos anteriores, pero la diferencia es que si el tipo de recurso al
que hace referencia la entidad no puede ser analizado, entonces el analizador no intentará analizarlo.
La forma de declarar entidades no analizadas es exactamente igual que para las analizadas.

<!ENTITY IMAGEN SYSTEM “http//:www.miwebsite.com/miimagen.gif”>

Entidades parámetro internas

Este tipo de entidades sólo se declaran para ser utilizadas exclusivamente dentro de la DTD, y no en el
documento XML. Para hacer referencia a ellas no utilizamos el símbolo “&”, sino “%”, también utilizamos el
símbolo “%” para declararlas.

28

990
ACCESO A DATOS EN JAVA

<?xml version=”1.0”?>
<!DOCTYPE [
<!ELEMENT monitores (monitor)*>
<!ELEMENT monitor (#PCDATA)>
<!ATTLIST monitor marca CDATA #REQUIRED>
<!ENTITY % mielemento “<!ELEMENT elemento1 (#PCDATA)”>
%mielemento;
]>

En este ejemplo, hemos declarado una entidad de tipo parámetro llamada “mielemento”, que se corresponde
con la declaración de un elemento, por ello, cada vez que tengamos que declarar un elemento como
“elemento1”, bastará con hacer referencia a la entidad mielemento para que sea sustituida por la
declaración del elemento.
Sin utilizar la entidad el ejemplo anterior quedaría de la siguiente manera:

<!DOCTYPE [

<!ELEMENT monitores (monitor)*>

<!ELEMENT monitor (#PCDATA)>

<!ATTLIST monitor marca CDATA #REQUIRED>

<!ELEMENT elemento1 (#PCDATA)”>


]>

Entidades parámetro externas

De igual manera que los otros tipos de entidades, las entidades de tipo parámetro pueden ser externas, y
para hacer referencia a ellas utilizaremos la palabra clave SYSTEM, como en la declaración de las otras
entidades externas.

<?xml version=”1.0”?>

<!DOCTYPE [
<!ELEMENT monitores (monitor)*>
<!ELEMENT monitor (#PCDATA)>
<!ATTLIST monitor marca CDATA #REQUIRED>
<!ENTITY % mielemento SYSTEM “c:\elemento1.dat”>
%mielemento;
]>
29

991
ACCESO A DATOS EN JAVA

Lenguaje de estilo extendido XSL

XSL es un lenguaje para realizar hojas de estilo. El conjunto del lenguaje XSL está formado por tres partes:

- XLST (XSL Transformations): un lenguaje para transformar documentos XML.


- XPATH (XML Path Language): un lenguaje de expresiones para acceder a las diferentes partes de un
documento XML.

- Un vocabulario XML para el formateo semántico de expresiones. (XSL Formating Objects)


Una hoja de estilo XSL especifica las reglas de presentación de un determinado documento XML.

XPATH

El lenguaje XPATH es una sintaxis, que nos ayuda a construir cadenas de texto para localizar determinados
recursos dentro de documentos XML.

Usamos el lenguaje XPATH cuando queremos hacer referencia a determinado contenido de un elemento en
un documento XML. La base de la utilización del lenguaje XPATH se centra en la estructura en árbol de los
elementos de un documento XML, y cómo estos elementos mantienen entre sí una relación jerárquica. Cada
elemento representa una estructura jerárquica de elementos por sí mismo.

XPATH no es ni más ni menos que un conjunto de reglas semánticas para representar la estructura jerárquica
de un determinado elemento. XPATH puede recordarnos a la manera de moverse por los directorios que se
utiliza en UNÍX o MSDOS.

Veamos un ejemplo:

Select=”monitor”

En este ejemplo se indica al analizador que seleccione el elemento, o elementos “monitor”, pero tenemos
que tener en cuenta que sólo seleccionará el elemento “monitor” que dependa directamente del elemento
en el que estamos situados en este mismo momento.

30

992
ACCESO A DATOS EN JAVA

En el siguiente documento:

<?xml version=”1.0”?>

<!DOCTYPE [

<!ELEMENT monitores (monitor)*>

<!ELEMENT monitor (#PCDATA)>

<!ATTLIST monitor marca CDATA #REQUIRED>

]>

<monitores>

<monitor marca=”Fujitsu”> 23456723 </monitor>

</monitores>

Si estamos situados en el elemento raíz “monitores”, entonces sí encontrará el elemento “monitor”, pero si
estamos situados en el elemento “monitor” no encontrará ningún elemento “monitor”, ya que el elemento
monitor no posee ningún subelemento.

Como señalamos anteriormente el XPATH es un lenguaje que guarda un gran parecido con el URI (Universal
Resource Identifier), así si queremos hacer referencia a un elemento contenido dentro de otro elemento
utilizaremos la “/”, tal como lo hacemos en URI.

<?xml version=”1.0”?>

<!DOCTYPE [

<!ELEMENT perif (monitores,impresoras)>


<!ELEMENT monitores (monitor)*>
<!ELEMENT monitor (#PCDATA)>
<!ATTLIST monitor marca CDATA #REQUIRED>
<!ELEMENT impresoras (impresora)*>
<!ELEMENT impresora (#PCDATA)>
<!ATTLIST impresora marca CDATA #REQUIRED>
]>

31

993
ACCESO A DATOS EN JAVA

<perif>
<monitores>
<monitor marca=”Fujitsu”>
23456723
</monitor>
</monitores>
<impresoras>
<impresora marca=”Epson”>
2345674423
</impresora>
</impresoras>
</perif>

Así en el ejemplo mostrado, si estamos situados en la raíz del documento XML y queremos referirnos al
contenido de impresora lo haremos de la siguiente manera:

Select=”impresoras/impresora”

Pero, XPATH además nos brinda la posibilidad de referirnos a determinada repetición de un elemento concreto
de un documento XML. Así, si el documento XML fuera como el que sigue:

<?xml version=”1.0”?>

<!DOCTYPE [

<!ELEMENT perif (monitores+,impresoras+)>


<!ELEMENT monitores (monitor)*>
<!ELEMENT monitor (#PCDATA)>
<!ATTLIST monitor marca CDATA #REQUIRED>
<!ELEMENT impresoras (impresora)*>
<!ELEMENT impresora (#PCDATA)>
<!ATTLIST impresora marca CDATA #REQUIRED>
]>

32

994
ACCESO A DATOS EN JAVA

<perif>
<monitores>
<monitor marca=”Fujitsu”>
23456723
</monitor>
</monitores>
<impresoras>
<impresora marca=”Epson”>
2345674423
</impresora>
</impresoras>
<impresoras>
<impresora marca=”Nec”>
234474423
</impresora>
<impresora marca=”Hp”>
23456785674423
</impresora>
</impresoras>
<impresoras>
<impresora marca=”Epson”>
25674423
</impresora>
<impresora marca=”Nec”>
234114423
</impresora>
<impresora marca=”HP”>
234567113
</impresora>
<impresora marca=”Lexmark”>
5674423
</impresora>
</impresoras>
</perif>

33

995
ACCESO A DATOS EN JAVA

Con esta sentencia XPATH

Select=”impresoras[3]/impresora[2]”

Estaríamos haciendo referencia al segundo elemento impresora contenido en el tercer elemento impresoras,
y el contenido resultante sería: “234114423”.
Debemos tener en cuenta que XPATH no es un lenguaje para efectuar consultas (querys), XPATH es un lenguaje
que permite al procesador de XSLT obtener los contenidos de los diferentes elementos de un documento
XML.
Por último, no olvidemos nunca que nos movemos por una estructura jerárquica de elementos.
A continuación, definiremos los distintos patrones que pueden ser utilizados en XPATH:

/ Especifica el hijo inmediato, también puede ser utilizado para referirse al elemento raíz.
// Selecciona a cualquier nivel dentro de la estructura de árbol.
. Selecciona el nodo actual.
* Selecciona todos los elementos del nodo actual.
@ Selecciona un atributo específico.
@* Selecciona todos los atributos del nodo actual.

XSLT (XSL Transformations)

El lenguaje de estilo extendido conocido como XSLT (Extensible Stylesheet Language Transformations), es un
lenguaje que nos permite definir un formato de presentación para un documento XML.

XSLT está diseñado para ser usado de manera independiente de XSL. De cualquier manera, XSLT no está
diseñado para ser un lenguaje de transformación para cualquier propósito. Internet Explorer utiliza como
lenguaje de transformación de XML, XSLT.

Un documento XSLT que defina una transformación de un documento XML, también está expresado en sí
mismo como un documento XML bien formado. Un documento XSLT define las reglas para transformar un
árbol origen (documento XML) en un árbol de resultado. La transformación se realiza asociando las distintas
plantillas con sus correspondientes valores. La estructura resultante (árbol de resultado) puede ser

34

996
ACCESO A DATOS EN JAVA

completamente diferente de la estructura de origen (árbol origen). Durante la construcción de la estructura


resultante los elementos de la estructura origen pueden ser reordenados, filtrados, además de añadir otro
tipo de estructuras arbitrarias en la construcción.

A la transformación expresada en el lenguaje XSLT es a lo que llamamos hoja de estilo.

Estructura de la hoja de estilo XSLT

El elemento stylesheet.

<xsl:stylesheet version=”1.0”

xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”>

</xsl:stylesheet>

El elemento “stylesheet” es el elemento raíz de una hoja de estilo XSLT, es decir, todas las hojas de estilo
XSLT deben comenzar con <xsl:stylesheet> y terminar con </xsl:stylesheet>. Dentro del elemento
“stylesheet” también definimos mediante atributos la versión de XSL con la que estamos trabajando, así
como la URI de lo que llamamos “namespace” (definición de las reglas semánticas y sintácticas redactadas
por el consorcio a las que hace referencia el analizador de XSL). De todas maneras, es opcional hacer
referencia al “namespace”.

Al igual que cualquier documento XML todos los elementos que formen parte de la hoja de estilo deben partir
de su elemento raíz, en este caso <xsl:stylesheet>.

También podremos encontrar el ejemplo anterior de esta otra forma:

<xsl:transform version=”1.0”

xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”>

</xsl:transform>

35

997
ACCESO A DATOS EN JAVA

En este caso, los dos ejemplos son iguales y perfectamente válidos, ya que <xsl:stylesheet> tiene el mismo
significado que <xsl:transform> para el analizador.

El elemento xsl:stylesheet puede contener cualquiera de los siguientes elementos:


- xsl:import

- xsl:include

- xsl:strip-space

- xsl:preserve-space

- xsl:output

- xsl:key

- xsl:decimal-format

- xsl:namespace-alias

- xsl:attribute-set

- xsl:variable

- xsl:param

- xsl:template
Estos elementos son también llamados elementos “top-level”. Veamos un ejemplo donde se declaran todos
estos elementos:
<xsl:stylesheet version=”1.0” xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”>

<xsl:import href=”...”/>

<xsl:include href=”...”/>

<xsl:strip-space elements=”...”/>

<xsl:preserve-space elements=”...”/>

<xsl:output method=”...”/>

<xsl:key name=”...” match=”...” use=”...”/>

<xsl:decimal-format name=”...”/>

<xsl:namespace-alias stylesheet-prefix=”...” result-prefix=”...”/>

<xsl:attribute-set name=”...”>

36

998
ACCESO A DATOS EN JAVA

...

</xsl:attribute-set>

<xsl:variable name=”...”>...</xsl:variable>

<xsl:param name=”...”>...</xsl:param>

<xsl:template match=”...”>

...

</xsl:template>

<xsl:template name=”...”>

...

</xsl:template>

</xsl:stylesheet>

El orden en el que los elementos “top_level” sean declarados no es significante, y es transparente para los
analizadores.

Existe también una sintaxis simplificada para aquellas hojas de estilo que tengan como función extraer
valores a partir del elemento raíz del documento XML. Para ello, utilizamos la etiqueta <xsl:value-of select>,
tal como podemos ver en el ejemplo:

<xsl:version=”1.0”

xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”

xmlns=”http://www.w3.org/TR/xhtml1/strict”>

<html>

<head>

<title>Informe Resumen de Gastos</title>

</head>

<body>

<p>Total Amount:

<xsl:value-of select=”informe-gastos/total”/></p>

</body>

</html>
37

999
ACCESO A DATOS EN JAVA

En el ejemplo podemos observar, en primer lugar, cómo estamos ya insertando HTML dentro de la hoja de
estilo, y cómo entre el código HTML podemos encontrar los elementos XSL, como el elemento <xsl:value-of
select=”informe-gastos/total”/>, que es el encargado de extraer del documento XML el valor correspondiente
al elemento “informe-gastos/total”. Por supuesto, hacemos referencia a determinado valor, utilizando las
reglas semánticas del lenguaje XPATH.

El ejemplo anterior también podríamos haberlo realizado de esta otra forma:

<xsl:stylesheet version=”1.0”

xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”

xmlns=”http://www.w3.org/TR/xhtml1/strict”>

<xsl:template match=”/“>

<html>

<head>

<title> Informe Resumen de Gastos </title>

</head>

<body>

<p>Total Amount: <xsl:value-of select=”informe-gastos/total”/></p>

</body>

</html>

</xsl:template>

</xsl:stylesheet>

La principal diferencia entre los dos ejemplos se centra, como puede verse, en la existencia del segundo del
elemento <xsl:template>, que tiene como función situarse en un determinado nodo de la estructura del
documento XML, mediante el atributo “match”, en el ejemplo <xsl:template match=”/“>, el analizador se
situará en el nodo raíz del documento XML, para a partir de ahí, mediante el elemento <xsl:value-of select=
“....”/> extraer los valores de los elementos.

38

1000
ACCESO A DATOS EN JAVA

Veamos ahora un sencillo ejemplo completo:

El documento XML:

<?xml version=”1.0”?>

<?xml-stylesheet href=”sitios.xsl” type=”text/xsl”?>

<sitiosweb>

<sitioweb> www.disney.com </sitioweb>

<sitioweb> www.sony.com </sitioweb>

<sitioweb> www.fox.com </sitioweb>

<sitioweb> www.dreamworks.com </sitioweb>

</sitiosweb>

El documento XSL:

<?xml version=”1.0”?>
<xsl:stylesheet xmlns:xsl=”http://www.w3.org/TR/WD-xsl”>
<xsl:template match=”/“>
<HTML>
<HEAD>
<TITLE> Sitios de Cine </TITLE>
</HEAD>
<BODY>
<xsl:for-each select=”sitiosweb/sitioweb”>
<b>
<xsl:value-of />
</b><br/>
</xsl:for-each>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
39

1001
ACCESO A DATOS EN JAVA

Lo primero que tenemos que tener en cuenta es que siempre llamamos al fichero XML, y que es éste el que
se encarga de realizar la llamada a la hoja de estilo, tal como vimos en el ejemplo anterior:
<?xml version=”1.0”?>

<?xml-stylesheet href=”sitios.xsl” type=”text/xsl”?>

En el documento XML nos encontramos con varios elementos “sitioweb”, que se repiten, y que contienen
distintos valores. Si lo que pretendemos es que la hoja de estilo muestre los distintos valores, hemos de
realizar un bucle para que el navegador lea los distintos valores del elemento, tal como vemos:

<xsl:for-each select=”sitiosweb/sitioweb”>

<b>

<xsl:value-of />

</b><br/>

</xsl:for-each>

En el ejemplo podemos ver cómo creamos un bucle con la sentencia “for-each” del elemento
“sitiosweb/sitioweb”, recordemos el uso de XPATH en XSL. En la sentencia anterior habíamos hecho un
“template match=/”, que nos situaba en la raíz del árbol del documento XML, por tanto, al realizar el bucle
debemos situarnos en el nodo correcto del árbol.

Veamos ahora otro ejemplo:

El documento XML:
<?xml version=”1.0”?>

<?xml-stylesheet href=”sitios2.xsl” type=”text/xsl”?>

<sitiosweb>

<sitioweb href=”http://www.disney.com”

titulo=”Disney”/>

<sitioweb href=”http://www.sony.com”

titulo=”Sony pictures”/>

<sitioweb href=”http://www.fox.com”

titulo=”Twenty Century Fox”/>

<sitioweb href=”http://www.dreamworks.com”

titulo=”Dreamworks”/>

</sitiosweb>
40

1002
ACCESO A DATOS EN JAVA

El documento XSL:
<?xml version=”1.0”?>

<xsl:stylesheet xmlns:xsl=”http://www.w3.org/TR/WD-xsl”>

<xsl:template match=”/“>

<HTML>

<HEAD>

<TITLE> </TITLE>

</HEAD>

<BODY>

<xsl:for-each select=”/sitiosweb/sitioweb”>

<A>

<xsl:attribute name=”href”>

<xsl:value-of select=”./@href” />

</xsl:attribute>

<xsl:value-of select=”./@titulo” />

</A><br/>

</xsl:for-each>

</BODY>

</HTML>

</xsl:template>

</xsl:stylesheet

En este otro ejemplo hemos utilizado los atributos “href” y “titulo” para hacer referencia a los sitios web
que se almacenan en nuestro documento XML. Tal como vemos en el ejemplo, para hacer referencia al valor
de un atributo utilizamos la “@”.

<xsl:value-of select=”./@href” />

Recordemos siempre el uso del lenguaje XPATH en XSL “./”, que en este caso indica el nodo actual.
41

1003
ACCESO A DATOS EN JAVA

Elementos XSL

Veamos ahora los elementos más importantes del lenguaje XSL:

<xsl:stylesheet> </xsl:stylesheet>
Como hemos visto con anterioridad, es el elemento raíz de cualquier hoja de estilo XSL.

<xsl:template match=”....”> </xsl:template>


Tiene como función la definición de un patrón de búsqueda para un elemento determinado o conjunto de
ellos.

<xsl:apply-template select=”.....”> </xsl:apply-template>


Hace que el procesador XML busque la plantilla adecuada para el nodo seleccionado.

<xsl:value-of select=”....”> </xsl:value-of>


Recoge el valor como texto del nodo seleccionado.

<xsl:attribute name=”...”> </xsl:attribute>


Crea un atributo dentro del documento XSL.

<xsl:element name=”....”> </xsl:element>


Crea un elemento dentro del documento XSL.

<xsl:for-each order-by=”....” select=”...”> </xsl:for-each>


Crea un bucle de repetición del nodo seleccionado. Tomemos como ejemplo el siguiente documento XML:

<clientes>
<cliente>
<nombre>...</nombre>
<pedido>...</pedido>
<pedido>...</pedido>
</cliente>
<cliente>
<nombre>...</nombre>
<pedido>...</pedido>
<pedido>...</pedido>
</cliente>
</clientes>
42

1004
ACCESO A DATOS EN JAVA

El siguiente documento XSL transformaría la información contenida en el documento XML en un documento


HTML formateado, donde la información se incluiría en filas de una tabla.

<xsl:template match=”/“>
<html>
<head>
<title>Clientes</title>
</head>

<body>
<table>
<tbody>
<xsl:for-each select=”clientes/cliente”>
<tr>
<th>
<xsl:apply-templates select=”nombre”/>
</th>
<xsl:for-each select=”pedido”>
<td>
<xsl:apply-templates/>
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</tbody>
</table>
</body>
</html>
</xsl:template>

<xsl:if test=”.....”> </xsl:if>

43

1005
ACCESO A DATOS EN JAVA

Crea un condicional (la condición se sitúa en el valor del atributo “test”). El siguiente ejemplo pondría color
a una tabla, fila sí, fila no, con el color amarillo.

<xsl:template match=”elemento1”>

<tr>

<xsl:if test=”position() mod 2 = 0”>

<xsl:attribute

name=”bgcolor”>yellow</xsl:attribute>

</xsl:if>

<xsl:apply-templates/>

</tr>

</xsl:template>

<xsl:choose> </xsl:choose>

Crea un condicional del tipo “Case”, donde mediante la sentencia <xsl:when test=”....”> </xsl:when>
establecemos las distintas opciones de la sentencia condicional.

<xsl:choose>

<xsl:when test=”...”> </xsl:when>

<xsl:when test=”...”> </xsl:when>

<xsl:when test=”...”> </xsl:when>

</xsl:choose>

44

1006
ACCESO A DATOS EN JAVA

También, dentro del elemento choose podemos encontrar el elemento <xsl:otherwise> </xsl:otherwise> para
referirnos a las opciones que no coincidan con ninguna de las condiciones contenidas en el elemento
“choose”.
<xsl:choose>

<xsl:when test=”...”> </xsl:when>

<xsl:when test=”...”> </xsl:when>

<xsl:when test=”...”> </xsl:when>

<xsl:otherwise> </xsl:otherwise>

</xsl:choose>

El siguiente ejemplo muestra cómo enumerar diferentes elementos en una lista ordenada, usando números,
letras o números romanos, dependiendo de la profundidad a la que se encuentre el nodo.

<xsl:template match=”listaordenada/elementosimple”>

<fo:list-item indent-start=’2pi’>

<fo:list-item-label>

<xsl:variable name=”level” select=

“count(ancestor::listaordenada) mod 3”/>

<xsl:choose>

<xsl:when test=’$level=1’>

<xsl:number format=”i”/>

</xsl:when>

<xsl:when test=’$level=2’>

<xsl:number format=”a”/>

</xsl:when>

<xsl:otherwise>

<xsl:number format=”1”/>

</xsl:otherwise>

</xsl:choose>

<xsl:text>. </xsl:text>

</fo:list-item-label>
45

1007
ACCESO A DATOS EN JAVA

<fo:list-item-body>

<xsl:apply-templates/>

</fo:list-item-body>

</fo:list-item>

</xsl:template>

<xsl:copy> </xsl:copy>

El elemento “xsl:copy” constituye una manera sencilla para copiar el nodo actual. Simplemente, haciendo
una llamada al elemento, el nodo actual es copiado, así como el nombre del nodo actual, pero los atributos
y subelementos del nodo actual no son copiados automáticamente.

<xsl:template match=”@*|elemento1()“>

<xsl:copy>

<xsl:apply-templates select=”@*|elemento1()“/>

</xsl:copy>

</xsl:template>

<xsl:number/>

El elemento “xsl:number” se utiliza para insertar un valor numérico formateado dentro del árbol de
resultados. El número que insertemos debe ser introducido como una expresión de cadena de caracteres, es
el analizador el encargado de evaluar la expresión y de efectuar su conversión para, finalmente, ser incluido
dentro del árbol de resultados.
<xsl:template match=”elemento1”>

<xsl:for-each select=”elemento1”>

<xsl:sort select=”.”/>

<p>

<xsl:number value=”position()“ format=”1. “/>

<xsl:value-of select=”.”/>

</p>

</xsl:for-each>

</xsl:template>

46

1008
ACCESO A DATOS EN JAVA

En el caso de que no especifiquemos una posición mediante el atributo value=”posición()”, entonces el


resultado será introducido en la posición actual del nodo del árbol de resultados.
El elemento “xsl:number” tiene además otros atributos, como “level”, “count” y “from”.
El ejemplo siguiente numerará todos los elementos H4 con una etiqueta de texto dividida en tres partes:

<xsl:template match=”H4”>

<fo:block>

<xsl:number level=”any” from=”H1” count=”H2”/>

<xsl:text>.</xsl:text>

<xsl:number level=”any” from=”H2” count=”H3”/>

<xsl:text>.</xsl:text>

<xsl:number level=”any” from=”H3” count=”H4”/>

<xsl:text> </xsl:text>

<xsl:apply-templates/>

</fo:block>

</xsl:template>

El siguiente ejemplo numerará los elementos “titulo”. Este ejemplo muestra cómo numerar los elementos
de un documento, como si se tratase de una secuencia de capítulos, seguida de una secuencia de apéndices,
donde tanto los capítulos como los apéndices contienen secciones que, a su vez, contienen subsecciones. Los
capítulos estarán numerados de la forma 1, 2, 3, ..., los apéndices A, B, C, ... Las secciones en los capítulos
serán numeradas de esta manera 1.1, 1.2, 1.3, ..., y las secciones en los apéndices serán numeradas A.1, a.2,
a.3, ...

<xsl:template match=”titulo”>

<fo:block>

<xsl:number level=”multiple”

count=”capitulo|seccion|subseccion”

format=”1.1 “/>

47

1009
ACCESO A DATOS EN JAVA

<xsl:apply-templates/>

</fo:block>

</xsl:template>

<xsl:template match=”apendice//titulo”>

<fo:block>

<xsl:number level=”multiple”

count=”apendice|seccion|subseccion”

format=”A.1 “/>

<xsl:apply-templates/>

</fo:block>

</xsl:template>

<xsl:sort> </xsl:sort>

El elemento “xsl:sort” procesa los elementos pertenecientes al nodo actual de manera ordenada, esta
ordenación puede ser ascendente o descendente. Supongamos, por ejemplo, el siguiente documento XML,
conteniendo datos acerca de los empleados de una compañía:

<empleados>

<empleado>

<nombre>

<nombredepila>Juan</nombredepila>

<apellido>Perez</apellido>

</nombre>

...
</empleado>

</empleados>

48

1010
ACCESO A DATOS EN JAVA

Para obtener como salida una lista de empleados ordenada por nombre:

<xsl:template match=”empleados”>

<ul>

<xsl:apply-templates select=”empleado”>

<xsl:sort select=”nombre/apellido”/>

<xsl:sort select=”nombre/nombredepila”/>

</xsl:apply-templates>

</ul>

</xsl:template>

<xsl:template match=”empleado”>

<li>

<xsl:value-of select=”nombre/nombredepila”/>

<xsl:text> </xsl:text>

<xsl:value-of select=”nombre/apellido”/>

</li>

</xsl:template>

Funciones adicionales

XSLT dispone de una serie de funciones adicionales que, a continuación, señalamos:

- document(object, node-set?)
Permite acceder a otros documentos XML, que no sean el documento XML origen de la plantilla. Ejemplo:
generate-id

(document(“foo.xml”))=generateid(document(“foo.xml”))

49

1011
ACCESO A DATOS EN JAVA

- key(string, object)

Permite a los documentos XML, que contienen atributos del tipo ID, IDREF, IDREFS realizar referencias
cruzadas.
<xsl:key name=”idkey” match=”div” use=”@id”/>

- format-number(number, string, string?)

Realiza la conversión de un número a una cadena, utilizando un formato dado.


<xsl:decimal-format
name = qname
decimal-separator = char
grouping-separator = char
infinity = string
minus-sign = char
NaN = string
percent = char
per-mille = char
zero-digit = char
digit = char
pattern-separator = char />

- current()

Devuelve el nodo actual donde estamos situados. Este ejemplo:


<xsl:value-of select=”current()“/>

Es igual a este otro:

<xsl:value-of select=”.”/>

- unparsed-entity-uri(string)

Devuelve el URI de una determinada entidad dentro del nodo actual.

generate-id(node-set?)

Devuelve una cadena de texto, que identifica el nodo actual de manera única.

- system-property(string)
Devuelve un valor coincidente con el valor de la propiedad del sistema a la que se hace referencia.
Si la propiedad a la que se hace referencia no existe, entonces devuelve una cadena vacía.

50

1012
ACCESO A DATOS EN JAVA

Mensajes

<xsl:message
terminate = “yes” | “no”>

<!— Content: template —>

</xsl:message>

La instrucción “xsl:message” envía un mensaje para que sea interpretado por el analizador de XSLT.
Generalmente, el procesador XSLT lanzará una pantalla de alerta al recibir la instrucción “xsl:message”.

<xsl:template name=”mensajepuntual”>

<xsl:param name=”nombremensaje”/>

<xsl:message>

<xsl:value-of select=

“$mensajes/mensaje[@name=$nombremensaje]“/>

</xsl:message>

</xsl:template>

51

1013
ACCESO A DATOS EN JAVA
Caso práctico
MÓDULO: ACCESO A DATOS EN JAVA – Caso práctico
Realiza un programa Java que va a consistir en la realización de una Aplicación de Base de Datos. La
interfaz gráfica de usuario principal será la siguiente:

Habrá que implementar las siguientes opciones:

Opciones del menú:

Base Datos:

Cargar Driver: Carga el DRV de tipo 1 (odbc)


Conectar: Conecta a la Base de Datos ARTICULOS.MDB
Desconectar: Cierra la conexión
Salir: Sale de la aplicación

La estructura de la Base de Datos contendrá la tabla Articulos con los campos:

Codigo: alfanumérico
Nombre: alfanumérico
Precio: float

1014
ACCESO A DATOS EN JAVA
Caso práctico
MÓDULO: ACCESO A DATOS EN JAVA – Caso práctico
Implementar las opciones del menú principal:

Consultas:

Actualizar: abrirá una ventana Swing con el siguiente formato:

El botón Guardar, almacena un registro en la tabla.

Query: realiza una consulta de la tabla y la vuelca en un TextArea

1015
ACCESO A DATOS EN JAVA
Caso práctico
Transacciones:

Commit: realiza la inserción de un registro (el que tu quieras) sobre la tabla Articulos (usando el
comando commit)

Sentencias Precompiladas:

Precompiladas: abre una ventana Swing con el siguiente formato:

Se introducirá un código de Articulo en la caja de texto, y al hacer intro ¿mostrará en el TextArea el


registro con ese código, en caso de que exista.

1016
ACCESO A DATOS EN JAVA
Caso práctico
Dado el siguiente documento XML, determina los elementos que forman parte del mismo.

<coches>

<coche marca=”Mercedes” modelo=”C320” color=”verde”>


M-9999-XU
</coche>

<coche marca=”Opel” modelo=”Vectra” color=”Blanco”>


M-8888-VO
</coche>

</coches>

1017
ACCESO A DATOS EN JAVA
Caso práctico
Dado el siguiente documento XML, determina los atributos que forman parte del elemento coche.

<coches>
<usados>

<coche marca=”Mercedes” modelo=”C320” color=”verde”>


M-9999-XU
</coche>
<coche marca=”Opel” modelo=”Vectra” color=”Blanco”>
M-8888-VO
</coche>
</usados>
<nuevos>
<coche marca=”Renault” modelo=”Clio” color=”azul”>
Sin Matricular
</coche>
<coche marca=”Renault” modelo=”Megane”>
Sin Matricular
</coche>
</nuevos>
</coches>

1018
ACCESO A DATOS EN JAVA
Caso práctico
Dados los siguientes documentos XML, determina las diferencias que existen entre ellos.

Documento 1:

<coches>
<usados>
<coche marca=”Mercedes” modelo=”C320” color=”verde”>
M-9999-XU
</coche>
<coche marca=”Opel” modelo=”Vectra” color=”Blanco”>
M-8888-VO
</coche>
</usados>
<nuevos>
<coche marca=”Renault” modelo=”Clio” color=”azul”>
</coche>
<coche marca=”Renault” modelo=”Megane” color=”gris”>
</coche>
</nuevos>
</coches>

Documento 2:

<coches>
<usados>
<coche marca=”Mercedes” modelo=”C320” color=”verde”>
M-9999-XU
</coche>
<coche marca=”Opel” modelo=”Vectra” color=”Blanco”>
M-8888-VO
</coche>
</usados>
<nuevos>
<coche marca=”Renault” modelo=”Clio” color=”azul”/>
<coche marca=”Renault” modelo=”Megane” color=”gris”/>
</nuevos>
</coches>

1019
ACCESO A DATOS EN JAVA
Caso práctico
Realiza el documento XML que coincida con la estructura que se detalla a continuación.

1020
ACCESO A DATOS EN JAVA
Caso práctico
Representa las siguientes entidades y sus valores en un documento XML.

Entidad discos/disco/titulo
Valor: One

Entidad discos/disco/autor
Valor: The beatles

Entidad discos/disco/titulo
Valor: 1000 & 2000 > 500

Entidad discos/disco/autor
Valor: Desconocido

1021
ACCESO A DATOS EN JAVA
Caso práctico
Dado el siguiente documento XML, escribe su correspondiente DTD.

<coches>
<usados>
<coche marca=”Mercedes” modelo=”C320” color=”verde”>
M-9999-XU
</coche>
<coche marca=”Opel” modelo=”Vectra” color=”Blanco”>
M-8888-VO
</coche>
</usados>
<nuevos>
<coche marca=”Renault” modelo=”Clio” color=”azul”>
</coche>
<coche marca=”Renault” modelo=”Megane” color=”gris”>
</coche>
</nuevos>
</coches>

1022
ACCESO A DATOS EN JAVA
Caso práctico
Dada la siguiente DTD escribe un documento XML válido y bien formado, que coincida con la DTD.

<?xml version=”1.0”?>

<!DOCTYPE prensa [

<!ELEMENT prensa (diarios | revistas)*>

<!ELEMENT diarios (diario)*>

<!ELEMENT diario (#PCDATA)>

<!ELEMENT revistas (revista)*>

<!ELEMENT revista (#PCDATA)>

<!ATTLIST diario nombre CDATA #REQUIRED>

<!ATTLIST diario editorial CDATA #IMPLIED>

<!ATTLIST diario distribuidora NMTOKEN #REQUIRED>

<!ATTLIST revista nombre CDATA #REQUIRED>

<!ATTLIST revista editorial CDATA #IMPLIED>

<!ATTLIST revista distribuidora CDATA #REQUIRED>

<!ATTLIST revista color NMTOKEN #REQUIRED>

]>

1023
ACCESO A DATOS EN JAVA
Caso práctico
Dado el siguiente documento XML escribe su DTD.

<beatles>

<canciones>

<cancion id= “a1” titulo=”Two of us” agno=”1970” autor=”Lennon”/>

<cancion id= “a2” titulo=”Dig a pony” agno=”1970” autor=”Mcartney”/>

<cancion id= “a3” titulo=”Across the Universe” agno=”1970” autor=”Lennon”/>

<cancion id= “a4” titulo=”I Me Mine” agno=”1970” autor=”Harrison”/>

<cancion id= “a5” titulo=”Dig It” agno=”1970” autor=”Lennon”/>

<cancion id= “a6” titulo=”Let it Be” agno=”1970” autor=”Lennon”/>

<cancion id= “a7” titulo=”Maggie Mae” agno=”1970” autor=”Lennon”/>

<cancion id= “a8” titulo=”I’ve got a feeling” agno=”1970” autor=”Mcartney”/>

<cancion id= “a9” titulo=”The long and widing road” agno=”1970” autor=”Lennon”/>

</canciones>

<discos>LET IT BE</discos>

</beatles>

1024
ACCESO A DATOS
EN JAVA
Acceso a ficheros

1025
ÍNDICE
ACCESO A DATOS EN JAVA

1. Manejo de Ficheros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3
2. Filtro de Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10
3. Serialización de Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16
4. Clases para trabajar con array de caracteres y objetos String . . . . . . . . . . . . . . . . . . . . . . . .22
5. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .26

1026
ACCESO A DATOS EN JAVA

1. Manejo de Ficheros
Objetivos

- Conocer cómo se realiza el manejo de ficheros.


- Identificar en qué consiste el Filtro de Streams y las clases para
construir filtros.
- Conocer cómo serializar objetos.

File

La clase que define los ficheros es File. Esta clase representa un fichero o directorio dentro del sistema de
ficheros.

1: File f1 = new File (“c:\\windows\\win.exe”);


2: File dir = new File (“c:\\windows”);
3: File f2 = new File (dir,”win.exe”);

Los constructores de File son los siguientes:

i
3

1027
ACCESO A DATOS EN JAVA

Tiene las siguientes constantes a nivel de clase y contienen respectivamente los símbolos que se utilizan
para separar los paths dependiendo de la plataforma en que se está.

static final String <File>.pathSeparator > (;)


static final String <File>.separator > (\)
File f2 = new File (“c:\\windows\\win.exe”); // path absoluto
File f3 = new File (“.\\datos\\bd.dat”); // path relativo

Métodos File

Con los métodos de la clase File se obtiene información relativa al archivo o ruta con que se ha inicializado
el objeto. Así antes de crear un flujo para leer de un archivo es conveniente determinar si el archivo existe,
en caso contrario no se puede crear el flujo.

Los métodos más importantes que describen esta clase son los siguientes:

String <File>.getPath()
Devuelve el texto del path que anteriormente se le ha pasado al constructor de File.

String <File>.getAbsolutePath()
Devuelve el path completo
File f1 = new File (“.\\windows\\win.exe”);
System.out.println(f1.getAbsolutePath());
// c:\java\..\windows\win.exe

String <File>.GetCanonicalPath() throws IOException


Devuelve el path normalizado. Lanza excepciones ya que comprueba la existencia del fichero o directorio
dentro del sistema de ficheros.

i
4

1028
ACCESO A DATOS EN JAVA

boolean <File>.isFile()
Devuelve true si es fichero.

boolean <File>.isDirectory()
Devuelve true si es directorio.

boolean <File>.exists()
Devuelve true si existe el fichero o directorio.

boolean <File>.canRead()
Si permite la lectura del fichero.

boolean <File>.canWrite()
Si permite la escritura del fichero.

long <File>.length()
Tamaño del fichero en bytes.

boolean <File>.mkDir()
Intenta crear un directorio con el nombre que se le pasa en el constructor. Si lo crea correctamente devuelve
true.

boolean <File>.renameTo (String name)


Renombra el fichero o directorio.

boolean <File>.delete()
Elimina el fichero o directorio.

i
5

1029
ACCESO A DATOS EN JAVA

FileInputStream

La clase FileInputStream sirve para acceder al contenido de los ficheros. Se crea a partir del nombre del
fichero que se va a tratar. Realiza la lectura del fichero.

Los constructores son los siguientes:

1: FileInputStream (String Filename) throws FileNotFoundException


2: FileInputStream (File Filename) throws FileNotFoundException

Los métodos más importantes que describen esta clase son los siguientes:

int <InputStream>.read() throws IOException:


Realiza la lectura del fichero.

Protected <FileInputStream>.finalize() throws IOException:


redefine este método que procede de la clase Object. Este método realiza una llamada a close() antes de
hacer la recogida de basura. De todas formas es mejor utilizar close() cuando se ha terminando de trabajar
con el fichero.

i
6

1030
ACCESO A DATOS EN JAVA

FileOutputStream

La clase FileOutputStream también sirve para acceder al contenido de los ficheros. Realiza la escritura de
los datos del fichero.

Los constructores son los siguientes:

1: FileOutputStream (String Filename) throws IOException.


Con este constructor se empieza desde el principio en el fichero, aunque el fichero tenga datos.

2: FileOutputStream(String Filename, boolean append) throws IOException.


Con este constructor se añadirá información en el fichero. Para ello se pondrá a true la variable append. Si
se pone false funcionará como el anterior constructor

i
7

1031
ACCESO A DATOS EN JAVA

Ejemplo

import java.io.*;
public class AccesoFichero {
public static void main (String [] args) throws IOException {
// se crea el fichero de salida.
FileOutputStream fos = new FileOutputStream("c:\\vem\\text.txt");
// Cadena a escribir en el fichero.
String str = "Texto de prueba";
//Proceso de escritura.
for (int i = 0; i < str.length(); i ++)
fos.write(str.charAt((i)));
fos.close(); // Se cierra el fichero de salida.
// se crea el fichero de entrada.
FileInputStream fis = new FileInputStream("c:\\vem\\text.txt");
int tamano = fis.available();/Longitud del fichero.
System.out.println("Hay un tamaño de "+tamano+"bytes disponibles");
byte [] B = new byte [tamano];
fis.read(B); // Lectura del fichero.
System.out.println ("Se leyó el texto: "+new String(B));
fis.close(); // Se cierra el fichero de entrada.
} // fin de main.
} // fin de clase.

i
8

1032
ACCESO A DATOS EN JAVA

SequenceInputStream

La clase SequenceInputStream permite concatenar varios Streams en uno solo, de forma que cuando
recorremos el Stream resultante, se leerá consecutivamente uno detrás de otro.

Para concatenar tienen dos constructores:

1: SequenceInputStream (InputStream s1, InputStream s2):


Concatena dos cadenas.

2: SequenceInputStream (Enumeration):
Concatena a partir de una lista de objetos InputStream.

Ejemplo:

Interface Enumeration {
public boolean hasMoreElements(); //Controla si hay más elementos
public Object nextElement();
}

i
9

1033
ACCESO A DATOS EN JAVA

2. Filtro de Streams

Los Filtros de Streams permiten modificar los datos que están dentro del Stream. Para construir filtros se
tienen las siguientes clases:

Estas clases no trabajan con dispositivos finales sino que trabajan sobre Streams ya creados. En el constructor
de cada una de las clases reciben un Stream de la clase base (InputStream / OutputStream).

i
10

1034
ACCESO A DATOS EN JAVA

Para realizar el acceso de estas clases se utilizan los siguientes atributos que apuntan al Stream ya creado:

- protected InputStream <FileInputStream> in;


- protected OutputStream <FileOutputStream> out;

Los atributos son protected para que sólo puedan acceder las clases FilterOutputStream y FilterInputStream
y sus derivadas.

BufferedInputStream y BufferedOutputStream

Las clases BufferedInputStream y BufferedOutputStream sirven para poner un buffer (memoria RAM) tanto
para los Streams de entrada como para los de salida, antes de pasarlo al dispositivo final.

En el constructor de estas clases se pasa el Stream y al Stream se le añade un buffer:

- protected byte [] <BufferedOutputStream> buf; Array de datos a cargar en el buffer.


- protected int <BufferedOutputStream> count;Indica hasta dónde está cargado el buffer.

Cuando el buffer está lleno se envían automáticamente los datos cargados, al fichero.

i
11

1035
ACCESO A DATOS EN JAVA

Utilización de buffers

Para forzar que se vacíe de información el buffer se tiene el método flush() de la clase base.

- protected [] byte <BufferedInputStream> buf; Array de datos del buffer.


- protected int <BufferedInputStream> count; Indica hasta dónde está cargado el buffer.
- protected int <BufferedInputStream> pos; Indica la siguiente posición a liberar del buffer.

Utilizar un buffer implica una optimización en el tiempo de acceso al fichero.

FileInputStream f1 = new FileInputStream (“datos.txt”);


BufferedInputStream bf1 = new BufferedInputStream (f1);
// Primeramente se crea el Stream y luego el buffer asociado.

En teoría está bien aplicarlo, pero en la práctica los Sistema Operativos ya tienen buffers implementados,
entonces el rendimiento casi es el mismo.

De todas formas habrá casos en los que utilizar buffers sea interesante.

i
12

1036
ACCESO A DATOS EN JAVA

DataInputStream y DataOutputStream

DataInputStream y DataOutputStream son filtros que permiten solucionar el problema de escribir y leer datos
que no sean del tipo fundamental byte.

1:
Interface DataInput {
boolean readBoolean() throws IOException;
int readInt() throws IOException;
...
}

2:
Interface DataOutput {
boolean writeBoolean() throws IOException;
int writeInt() throws IOException;
...
}

Ambas clases implementan los interfaces DataInput y DataOutput respectivamente.

Ambos interfaces tienen implementadas todos los métodos para los tipos de datos fundamentales.

i
13

1037
ACCESO A DATOS EN JAVA

Pipes de Streams

Pipes de Streams es una forma de comunicar hilos. Para la comunicación con pipes existen 2 tipos de hilos:

1. Hilo productor que envía datos al pipe.


2. Hilo consumidor que recibe datos del pipe.

Constructores de la Pipes de Streams

Los Pipes de Stream tienen los siguientes constructores:

Con estos constructores se puede enlazar de la siguiente forma:

PipedInputStream pis = new PipedInputStream();


PipedOutputStream pos = new PipedOutputStream(pis);
// Quedan enlazados y se puede enviar y recibir datos.

Existe otra forma de realizar el enlace de dos Stream. Primeramente se crearán con el constructor por
defecto para posteriormente conectarlos con los siguientes métodos:

void <PipedOutputStream> connect (PipedInputStream sink)


void <PipedInputStream> connect (PipedOutputStream src

14

1038
ACCESO A DATOS EN JAVA

Ejemplo

public class Conexion {


static PipedOutputStream sumidero = new PipedOutputStream();
static PipedInputStream fuente = new PipedInputStream();
static { // Inicio de Bloque Estático.
try {
fuente.connect(sumidero);
}
catch (IOException ex) {
System.out.println (“No se pueden conectar los pipes”);
}
} // fin de Bloque Estático.
} // fin de clase.

Esta clase conecta dos pipes con el segundo método explicado.

Bloque estático: Conjunto de instrucciones que se quiere que la máquina virtual ejecute en el momento que
se carga la clase, es decir, la primera vez que se referencia o se nombra la clase en el programa.

La clase Conexion no se instanciará pero en el momento que aparezca en el programa Conexion.sumidero o


Conexion.fuente se ejecutará el bloque estático.

i
15

1039
ACCESO A DATOS EN JAVA

3. Serialización de Objetos

Como hemos visto anteriormente, en un flujo se pueden escribir datos fundamentales. Ahora también se
podrán enviar y recoger objetos de un Stream. Para hacer esto, habrá que serializar el objeto, es decir,
convertir el objeto en una serie de bytes. Posteriormente se podrá introducir en el Stream.

Se tienen dos clases de persistencias:

Persistencia temporal:
Consiste en hacer que la vida de un objeto supere el tiempo de ejecución de un programa. Para realizarlo
antes de cerrar el programa se guardará el objeto en un fichero y la próxima vez que se ejecute el programa
se podrá recuperar el objeto guardado.

Persistencia espacial:
Consiste en que un objeto pase a vivir a una zona de memoria distinta a la zona de memoria donde fue
creado. Un objeto que se crea en una máquina se irá a otra máquina (Sistemas Distribuidos).

interface ObjectInput extends DataInput {


Object ReadObject();
}
interface ObjectOutput extends DataOutput {
void writeObject(Object ob);
}

En ambos casos se necesita serializar el objeto.

i 16

1040
ACCESO A DATOS EN JAVA

NotSerializableException

No se permite por defecto serializar los objetos ya que cualquiera puede serializarlos. Para que un objeto
se pueda serializar tiene que implementar el interface Serializable.

Interface Serializable {}
Actúa únicamente como un flag para comprobar si un objeto se quiere o no serializar.
Class Punto implements Serializable { // Objeto Serializable.
...
}

Si el objeto no es serializable y se intenta serializar en ejecución se lanza la siguiente excepción:

NotSerializableException

ObjectOutputStream oos = new ObjectOutputStream


(new FileOutputStream (“datos.dat”));
Punto p = new Punto (2,3);
oos.writeObject(p);
// El objeto Punto se serializa dentro del fichero datos.dat.
ObjectInputStream ois = new ObjectInputStream
(new FileInputStream (“datos.dat”));
Punto p = (Punto) in.readObject();
// El objeto Punto serializado se saca del fichero datos.dat.

i
17

1041
ACCESO A DATOS EN JAVA

Se puede comprobar que se utiliza el operador cast con el método readObject ya que este método devuelve
un objeto tipo Object.

NotSerializableException

Si una clase contenedora está Serializable y tiene objetos contenidos, los objetos contenidos deben
implementar también Serializable (Composición). Si no se hace así se lanza la excepción:

Razones para serializar un atributo

Cuando se serializa un objeto, sus atributos se serializan pero no sus métodos. Los atributos estáticos (static)
no se serializan ya que pertenecen a la clase y no al objeto. Los atributos con el modificador transient
tampoco se serializan.

Las razones para serializar un atributo son dos básicamente:

1. Por seguridad.

2. Para mantener la consistencia, por ejemplo, FileInputStream no es igual en dos máquinas ya que el
sistema de ficheros en cada una de ellas es diferente.

- Métodos con los que se pueden serializar los objetos con encriptación.

private void writeObject(ObjectOutputStream oos)throws IOException


private void readObject(ObjectInputStream ois) throws IOException

class numero implements Serializable {


int numero;
private void writeObject (ObjectOutputStream oos)
throws IOException {
oos.writeInt(numero);
}
private void readObject(ObjectInputStream ois)
throws IOException {
numero = ois.readInt();

18

1042
ACCESO A DATOS EN JAVA

- Métodos para serializar y deserializar de forma estándar: recogen los atributos


de la clase y operan con ellas.

void <ObjectOutputStream>.defaultWriteObject() throws IOException


void <ObjectInputStream>.defaultReadObject() throws IOException

class Cuenta implements Serializable {


String nombre, direccion, telefono;
int codpostal;
transient int pin;
private void writeObject(ObjectOutputStream oos)
throws IOException {
oos.defaultWriteObject();
int numero = pin ^ pin; //Operación XOR.
oos.writeInt(numero);
}
private void readObject(ObjectInputStream ois)
throws IOException {
ois.defaultReadObject();
pin ^= ois.readInt(pin);
}
} // fin de clase

i
19

1043
ACCESO A DATOS EN JAVA

Cuando se serializa un objeto de clase derivada, primero se serializan los atributos de la base y
posteriormente los atributos de la derivada.

Cuando se deserializa un objeto de clase derivada, primero se hace con los atributos de la base y
seguidamente con los atributos de la derivada.

Cuando hay una clase base que implementa Serializable todas las derivadas implementarán Serializable
(Agregación). Si la derivada implementa Serializable la base puede implementarla o no.

Gestión de Versiones

En Java, por defecto, si la clase de serialización y la clase de deserialización no coinciden no se puede


recoger el objeto. La excepción que se lanza cuando se produce este error es la siguiente:

InvalidCastException

Ejemplo

class Prueba implements Serializable {


int numero = 0;
...
}
. . . se modifica la clase . . .
class Prueba implements Serializable {
int numero = 0;
void NoHaceNada () {};
}

A pesar de que el número de atributos no ha cambiado, las clases se consideran incompatibles.

i
20

1044
ACCESO A DATOS EN JAVA

Para comprobar las versiones de las clases en Java, Java dispone del número SUID (Serial Unique ID) que es
diferente para cada una de las clases que se crean.

Este número SUID lo genera a partir de los bytecode de la clase utilizando la función hash(). Si se modifica
algo en una clase ya generada la función hash() genera un nuevo número SUID para la clase modificada.

C:\> serialver <Clase> Devuelve el número SUID de una clase

Para mantener la compatibilidad entre las distintas versiones de una clase, habrá que declarar la siguiente
constante dentro de la clase:

static final long serialVersionUID = 6290341731103L; // serialver

El valor de serialVersionUID se corresponderá con la primera versión de la clase. Normalmente el número SUID
se pone desde la primera clase generada.

Las clases Reader y Write

Las clases Reader y Write sirven para trabajar con Streams de UNICODE. Normalmente se utilizan para
Streams de texto. Todos los anteriores sirven para flujo binario.

Características:

- Reader y Writer son clases abstractas.


- Reader se corresponde con InputStream, tiene todos los métodos descritos anteriormente en
InputStream.
Además tiene el siguiente método:
boolean <Reader>.ready()
- Devuelve true en caso de que la próxima lectura de un solo byte se quede bloqueada.
- Writer se corresponde a OutputStream.

i
21

1045
ACCESO A DATOS EN JAVA

4. Clases para trabajar con array de caracteres y objetos String


CharArrayReader y CharArrayWriter

CharArrayReader y CharArrayWriter sirven para trabajar con array de caracteres.

char[] letras = new char[10];


CharArrayReader ch = new CharArrayReader(letras);
// Busca el carácter ‘c’ en un array.
int c = ch.read();
while (c ¡= -1 && c ¡= ‘c’)
c=ch.read(); //Lee hasta al final del array o encuentre ‘c’.

i
22

1046
ACCESO A DATOS EN JAVA

StringReader y StringWriter

StringReader y StringWriter son igual que los anteriores sólo que trabajan con objetos String.

String letras = “Federico”;


StringReader sr = new StringReader (letras);
int pos = 0;
int c = sr.read();
while (c ¡= -1 && c ¡= ‘c’) {
pos++;
c = sr.read();
}

StringWriter introduce los datos en un objeto de tipo StringBuffer mediante las operaciones write y no sobre
el objeto String que como se sabe es constante. StringWriter tiene los siguientes constructores:

StringWriter()
El objeto StringBuffer se crea con un tamaño de 32 bytes y se redimensiona si se necesita más espacio.

StringWriter(int size)
Se le indica el tamaño. Con esto se hace que la operación sea más rápida.

StringBuffer <StringWriter>.getBuffer()
Se saca lo que se ha escrito.

String <StringWriter>.toString()
Lo que está contenido se guarda en un String.

i
23

1047
ACCESO A DATOS EN JAVA

InputStreamReader y OutputStreamReader

En la conversión de código UNICODE a ASCII y viceversa, las clases InputStreamReader y OutputStreamReader,


actúan como filtro para la traducción.

InputStreamReader

InputStreamReader (InputStream is) De ASCII a UNICODE

El problema que surge es cómo traducir de ASCII a UNICODE los caracteres nacionales (0..127 Mundiales /
128..255 Nacionales). Este problema se resuelve con el siguiente constructor.

InputStreamReader (InputStream is, String encode)

El segundo parámetro representa el código ISO que se quiere utilizar. En el caso de España es “8859-1”. En
el primer constructor como se recibe el encode se utiliza la propiedad fileencoding.

System.out.println (System.getProperty(“fileencoding”);

i
24

1048
ACCESO A DATOS EN JAVA

OutputStreamReader

Realiza la conversión de UNICODE a ASCII.

- OutputStreamWriter (OutputStream os)


- OutputStreamWriter (OutputStream os, String encode)

Igual que lo definido en InputStreamReader.

FileInputStream f_binario = new FileInputStream (“prueba.dat”);


InputStreamReader f_tex = new InputStreamReader
(f_binario,”8859-1”);

Las clases FileReader y FileWriter

Las clases FileReader y FileWriter son derivadas de las anteriores que sólo valen para ficheros.

- FileReader (String filename)


- FileReader (File f)
- FileWriter (String filename)
- FileWriter (File f)
-FileWriter (String Filename, boolean append).

25

1049
ACCESO A DATOS EN JAVA

5. Resumen

Has llegado al final de este recurso formativo que denominamos “Acceso a Ficheros”
En esta lección hemos estudiado los siguientes contenidos:

i
26

1050
ACCESO A DATOS EN JAVA
Caso práctico
A través del siguiente documento realiza su correspondiente documento XSL, de manera que la salida
en el navegador sea una tabla en la que la primera columna se corresponda con el título de la canción,
y la segunda columna con el autor de la canción, para todas las canciones contenidas en el documento
XML.

<?xml version=”1.0” encoding=”UTF-8”?>

<!DOCTYPE beatles [
<!ELEMENT beatles (canciones, discos) >
<!ELEMENT canciones (cancion)*>
<!ELEMENT discos (#PCDATA)>
<!ELEMENT cancion (#PCDATA)>
<!ATTLIST cancion
id ID #IMPLIED
titulo CDATA #REQUIRED
agno CDATA #IMPLIED
autor (Lennon | Mcartney | Harrison | Star) “Lennon”>
]>

<beatles>
<canciones>
<cancion id= “a1” titulo=”Two of us” agno=”1970” autor=”Lennon”/>
<cancion id= “a2” titulo=”Dig a pony” agno=”1970” autor=”Mcartney”/>
<cancion id= “a3” titulo=”Across the Universe” agno=”1970” autor=”Lennon”/>
<cancion id= “a4” titulo=”I Me Mine” agno=”1970” autor=”Harrison”/>
<cancion id= “a5” titulo=”Dig It” agno=”1970” autor=”Lennon”/>
<cancion id= “a6” titulo=”Let it Be” agno=”1970” autor=”Lennon”/>
<cancion id= “a7” titulo=”Maggie Mae” agno=”1970” autor=”Lennon”/>
<cancion id= “a8” titulo=”I’ve got a feeling” agno=”1970” autor=”Mcartney”/>
<cancion id= “a9” titulo=”The long and widing road” agno=”1970” autor=”Lennon”/>
</canciones>
<discos>LET IT BE</discos>
</beatles>

1051
ACCESO A DATOS EN JAVA
Caso práctico
Para el siguiente documento XML escribe su correspondiente hoja de estilo, de manera que se pueda
visualizar en el navegador una tabla con el título de la canción, el autor y el año por cada uno de los
discos incluidos en el documento XML.

<?xml version=”1.0” encoding=”UTF-8”?>

<!DOCTYPE beatles [
<!ELEMENT beatles (discos)*>
<!ELEMENT discos (canciones)*>
<!ELEMENT canciones (cancion)*>
<!ELEMENT cancion (#PCDATA)>
<!ATTLIST discos
titulo CDATA #REQUIRED
discografica CDATA #IMPLIED
agno CDATA #IMPLIED>
<!ATTLIST cancion
id ID #IMPLIED
titulo CDATA #REQUIRED
agno CDATA #IMPLIED
autor (Lennon | Mcartney | Harrison | Star) “Lennon”>
]>

<beatles>

<discos titulo=”LET IT BE” discografica=”EMI” agno=”1970”>


<canciones>

<cancion id= “a1” titulo=”Two of us” agno=”1970” autor=”Lennon”/>

<cancion id= “a2” titulo=”Dig a pony” agno=”1970” autor=”Mcartney”/>

<cancion id= “a3” titulo=”Across the Universe” agno=”1970” autor=”Lennon”/>

<cancion id= “a4” titulo=”I Me Mine” agno=”1970” autor=”Harrison”/>

<cancion id= “a5” titulo=”Dig It” agno=”1970” autor=”Lennon”/>

1052
ACCESO A DATOS EN JAVA
Caso práctico

<cancion id= “a6” titulo=”Let it Be” agno=”1970” autor=”Lennon”/>

<cancion id= “a7” titulo=”Maggie Mae” agno=”1970” autor=”Lennon”/>

<cancion id= “a8” titulo=”I’ve got a feeling” agno=”1970” autor=”Mcartney”/>

<cancion id= “a9” titulo=”The long and widing road” agno=”1970” autor=”Lennon”/>
</canciones>
</discos>

<discos titulo=”MAGICAL MISTERY TOUR” discografica=”EMI” agno=”1967”>


<canciones>
<cancion id= “b1” titulo=”Magical Mistery Tour” agno=”1967” autor=”Lennon”/>

<cancion id= “b2” titulo=”The fool on the hill” agno=”1967” autor=”Mcartney”/>

<cancion id= “b3” titulo=”Flying” agno=”1967” autor=”Lennon”/>

<cancion id= “b4” titulo=”Blue Jay Way” agno=”1967” autor=”Harrison”/>

<cancion id= “b5” titulo=”Your Mother should know” agno=”1967” autor=”Lennon”/>

<cancion id= “b6” titulo=”I am the walrus” agno=”1967” autor=”Lennon”/>

<cancion id= “b7” titulo=”Hellow Goodbye” agno=”1967” autor=”Lennon”/>

<cancion id= “b8” titulo=”Strawberry Fields Forever” agno=”1967” autor=”Mcartney”/>

<cancion id= “b9” titulo=”Penny Lane” agno=”1967” autor=”Lennon”/>

<cancion id= “b10” titulo=”Baby you’re a rich man” agno=”1967” autor=”Mcartney”/>

<cancion id= “b11” titulo=”All you need is love” agno=”1967” autor=”Mcartney”/>


</canciones>
</discos>
</beatles>

1053
Este libro fue distribuido por cortesía de:

Para obtener tu propio acceso a lecturas y libros electrónicos ilimitados GRATIS


hoy mismo, visita:
http://espanol.Free-eBooks.net

Comparte este libro con todos y cada uno de tus amigos de forma automática,
mediante la selección de cualquiera de las opciones de abajo:

Para mostrar tu agradecimiento al autor y ayudar a otros para tener


agradables experiencias de lectura y encontrar información valiosa,
estaremos muy agradecidos si
"publicas un comentario para este libro aquí".

INFORMACIÓN DE LOS DERECHOS DEL AUTOR

Free-eBooks.net respeta la propiedad intelectual de otros. Cuando los propietarios de los derechos de un libro envían su trabajo a Free-eBooks.net, nos están dando permiso para distribuir dicho
material. A menos que se indique lo contrario en este libro, este permiso no se transmite a los demás. Por lo tanto, la redistribución de este libro sín el permiso del propietario de los derechos, puede
constituir una infracción a las leyes de propiedad intelectual. Si usted cree que su trabajo se ha utilizado de una manera que constituya una violación a los derechos de autor, por favor, siga nuestras
Recomendaciones y Procedimiento de Reclamos de Violación a Derechos de Autor como se ve en nuestras Condiciones de Servicio aquí:

http://espanol.free-ebooks.net/tos.html

Das könnte Ihnen auch gefallen