You are on page 1of 308

Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

e to
e n s
elic
a b l
fer
a n s
t r
on- Java SE 7
Programacin
s an
) ha uide
c o m t IIG Gua del alumno
i l n
Volumen
e
g ma Stud
a v i@ this
m ar use
v i (e
Mara
w i n
Ed

D67238CS20
Edicin 2.0
Noviembre de 2011
D81764
Authors Copyright 2011, Oracle y/o sus filiales. Todos los derechos reservados.

Michael Williams Exencin de responsabilidad

Tom McGinn Este documento contiene informacin propiedad de Oracle Corporation y se


Matt Heimer encuentra protegido por el copyright y otras leyes sobre la propiedad intelectual.
Usted solo podr realizar copias o imprimir este documento para uso exclusivo por
usted en los cursos de formacin de Oracle. Este documento no podr ser
Technical Contributors modificado ni alterado en modo alguno. Salvo que la legislacin del copyright lo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

considere un uso excusable o legal o "fair use", no podr utilizar, compartir,


and Reviewers descargar, cargar, copiar, imprimir, mostrar, representar, reproducir, publicar,
Lee Klement conceder licencias, enviar, transmitir ni distribuir este documento total ni parcialmente
sin autorizacin expresa por parte de Oracle.
Steve Watts
La informacin contenida en este documento puede someterse a modificaciones sin
Brian Earl previo aviso. Si detecta cualquier problema en el documento, le agradeceremos que
Vasily Strelnikov nos lo comunique por escrito a: Oracle University, 500 Oracle Parkway, Redwood
Shores, California 94065 EE. UU. No se garantiza que este documento se encuentre
Andy Smith libre de errores.
Nancy K.A.N
Aviso sobre restriccin de derechos e to
Chris Lamb
e n s
Todd Lowry
el
Si este software o la documentacin relacionada se entrega al Gobierno de EE. UU. ic
aplicar la siguiente disposicin:
a b l
o a cualquier entidad que adquiera licencias en nombre del Gobierno de EE. UU. se
Ionut Radu
fe r
Joe Darcy U.S. GOVERNMENT RIGHTS
a n s
Brian Goetz - tr
The U.S. Governments rights to use, modify, reproduce, release, perform, display, or
n
o
disclose these training materials are restricted by the terms of the applicable Oracle

an
Alan Bateman license agreement and/or the applicable U.S. Government contract.
David Holmes s
ha uide
Disposicin de marca comercial registrada
)
m tG
Editors
o
Oracle y Java son marcas comerciales registradas de Oracle y/o sus filiales. Todos
c n
il e
los dems nombres pueden ser marcas comerciales de sus respectivos propietarios.
a d
gm s Stu
Richard Wallis
Daniel Milne @
vi e thi
a r
Vijayalakshmi Narasimhana s
e m u
i(
GraphicvDesigner
a
M arHans
James
w in
Ed Publishers
Syed Imtiaz Ali
Sumesh Koshy
Contenido
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

1 Introduccin
Metas del curso 1-2
Metas del curso 1-3
Asistentes 1-5
Requisitos 1-6
Presentaciones a la clase 1-7
e to
Entorno del curso 1-8
e n s
Los programas Java son independientes de la plataforma 1-9
elic
Grupos de productos de tecnologa Java 1-10 a b l
fer
Versiones de la plataforma Java SE 1-11
a n s
Descarga e instalacin del JDK 1-12
n - tr
o
Java en entornos de servidor 1-13
s an
Comunidad Java 1-14
) ha uide
Java Community Process (JCP) 1-15
c o m tG
OpenJDK 1-16
a il d e n
gm s Stu
Soporte de Oracle Java SE 1-17
@
r a vi e thi
Recursos adicionales 1-18
a
Resumen 1-19
m u s
( e
r a vi Java y revisin de clases
2
Ma Sintaxis

w i n Objetivos 2-2
Ed Revisin del lenguaje Java 2-3
Estructura de la clase 2-4
Clase simple 2-5
Bloques de cdigo 2-6
Tipos de datos primitivos 2-7
Literales numricas de Java SE 7 2-9
Literales binarios de Java SE 7 2-10
Operadores 2-11
Cadenas 2-12
Operaciones de cadenas 2-13
if else 2-14
Operadores lgicos 2-15
Matrices y bucle for-each 2-16
Bucle for 2-17

iii
Bucle while 2-18
Sentencia switch de cadena 2-19
Convenciones de nomenclatura Java 2-20
Una clase Java simple: Employee 2-21
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Mtodos de la clase Employee 2-22


Creacin de una instancia de un objeto 2-23
Constructores 2-24
Sentencia package 2-25
Sentencias import 2-26
Ms informacin sobre import 2-27
Java se transfiere por valor 2-28
e to
Transferencia por valor para referencias de objetos 2-29
e n s
Objetos transferidos como parmetros 2-30
elic
a b l
Cmo compilar y ejecutar 2-31
fer
Compilacin y ejecucin: ejemplo 2-32
a n s
Cargador de clase Java 2-33
n - tr
o
Recoleccin de basura 2-34
s an
Resumen 2-35
) ha uide
Prueba 2-36
c o m tG
a il d e n
Visin general de la prctica 2-1: Creacin de clases Java 2-39

@ gm s Stu
3 Encapsulacin y v
r a i
creacin
e t
dehisubclases
Objetivos m a
3-2 u s
i( e
Encapsulacin 3-3
a v
M arEncapsulacin: ejemplo 3-4
win Encapsulacin: datos privados, mtodos pblicos 3-5
Ed Modificadores de acceso pblicos y privados 3-6
Revisin de la clase Employee 3-7
Asignacin de nombres de mtodos: recomendaciones 3-8
Clase Employee refinada 3-9
Haga que las clases sean lo ms inmutables posibles 3-10
Creacin de subclases 3-11
Subclases 3-12
Subclase Manager 3-13
Los constructores no se heredan 3-14
Uso de super 3-15
Creacin de un objeto Manager 3-16
Qu es el polimorfismo? 3-17
Sobrecarga de mtodos 3-18
Mtodos con argumentos variables 3-19

iv
Herencia nica 3-21
Resumen 3-22
Prueba 3-23
Visin general de la prctica 3-1: Creacin de subclases 3-27
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

(Opcional) Visin general de la prctica 3-2: Adicin de una clase Staff a una clase
Manager 3-28

4 Diseo de clases Java


Objetivos 4-2
Uso del control de acceso 4-3
Control de acceso protegido: ejemplo 4-4
e to
Sombra de campos: ejemplo 4-5
e n s
Control de acceso: recomendacin 4-6
elic
Sustitucin de mtodos 4-7
a b l
Llamada a un mtodo sustituido 4-9 fe r
a n s
Llamada al mtodo virtual 4-10
n - tr
Accesibilidad de los mtodos sustituidos 4-11 o
Aplicacin de polimorfismo 4-12 s an
Uso de la palabra clave instanceof 4-14 ) ha uide
c o m tG
a il
Conversin de referencias de objetos 4-15
d e n
gm s Stu
Conversin de reglas 4-16
@
r a vi e thi
Sustitucin de mtodos de objeto 4-18
a s
Mtodo Object toString 4-19
m u
e
i ( Object equals 4-20
Mtodo
a v
MarSustitucin de equals en Employee 4-21
w i n Sustitucin de Object hashCode 4-22
Ed Resumen 4-23
Prueba 4-24
Visin general de la prctica 4-1: Sustitucin de mtodos y aplicacin de
polimorfismo 4-28

5 Diseo de clases avanzadas


Objetivos 5-2
Modelacin de problemas de negocio con clases 5-3
Activacin de la generalizacin 5-4
Identificacin de la necesidad de clases abstractas 5-5
Definicin de clases abstractas 5-6
Definicin de mtodos abstractos 5-7
Validacin de clases abstractas 5-8
Prueba 5-9

v
Palabra clave static 5-10
Mtodos estticos 5-11
Implantacin de mtodos estticos 5-12
Llamada a mtodos estticos 5-13
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Variables estticas 5-14


Definicin de variables estticas 5-15
Uso de variables estticas 5-16
Importaciones estticas 5-17
Prueba 5-18
Mtodos finales 5-19
Clases finales 5-20
e to
Variables finales 5-21
e n s
Declaracin de variables finales 5-22
elic
Prueba 5-23
a b l
fe r
Cundo evitar las constantes 5-24
a n s
Enumeraciones Typesafe 5-25
n - tr
o
an
Uso de enumeraciones 5-26
Enumeraciones complejas 5-27 s
ha uide
Prueba 5-28 )
m tG
Patrones de diseo 5-29 c o n
a il d e
Patrn singleton 5-30
@ gm s Stu
Clases anidadas 5-31
r a vi e thi
a s
Clase interna: ejemplo 5-32
m u
( e
Clases internas annimas 5-33
i
v
MaraPrueba 5-34

w i n Resumen 5-35

Ed Visin general de la prctica 5-1: Aplicacin de la palabra clave abstract 5-36


Visin general de la prctica 5-2: Aplicacin del patrn de diseo singleton 5-37
Visin general de la prctica 5-3: (Opcional) Uso de enumeraciones Java 5-38
(Opcional) Visin general de la prctica 5-4: Reconocimiento de clases anidadas 5-39

6 Herencia con interfaces Java


Objetivos 6-2
Implantacin de sustitucin 6-3
Interfaces Java 6-4
Desarrollo de interfaces Java 6-5
Campos constantes 6-6
Referencias a la interfaz 6-7
Operador instanceof 6-8
Interfaces de marcador 6-9
Conversin en tipos de interfaz 6-10

vi
Uso de tipos de referencia genricos 6-11
Implantacin y ampliacin 6-12
Ampliacin de interfaces 6-13
Interfaces en jerarquas de herencia 6-14
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Prueba 6-15
Diseo de patrones e interfaces 6-16
Patrn DAO 6-17
Antes del patrn DAO 6-18
Despus del patrn DAO 6-19
La necesidad del patrn de fbrica 6-20
Uso del patrn de fbrica 6-21
e to
Fbrica 6-22
e n s
Combinacin de DAO y fbrica 6-23
el ic
Prueba 6-24
a b l
Reutilizacin del cdigo 6-25 fe r
a n s
Dificultades en el diseo 6-26
n - tr
Composicin 6-27 o
Implantacin de la composicin 6-28 s an
Polimorfismo y composicin 6-29 ) ha uide
c o m tG
Prueba 6-31
a il d e n
Resumen 6-32
@ gm s Stu
r a vi e thi
Visin general de la prctica 6-1: Implantacin de una interfaz 6-33

m a
Visin general de la prctica 6-2: Aplicacin del patrn DAO 6-34
u s
( e
(Opcional) Visin general de la prctica 6-3: Implantacin de la composicin 6-35
i
v
ara
M7 Genricos y recopilaciones
w i n
Ed Objetivos 7-2
Genricos 7-3
Clase de cach simple sin genricos 7-4
Clase de cach genrica 7-5
Funcionamiento de los genricos 7-6
Genricos con diamante de inferencia de tipo 7-7
Prueba 7-8
Recopilaciones 7-9
Tipos de recopilaciones 7-10
Interfaz List 7-11
Clase de implantacin ArrayList 7-12
ArrayList sin genricos 7-13
ArrayList genrica 7-14
ArrayList genrica: Iteracin y empaquetado 7-15

vii
Empaquetado automtico y desempaquetado 7-16
Prueba 7-17
Interfaz Set 7-18
Interfaz Set: ejemplo 7-19
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Interfaz Map 7-20


Tipos de Map 7-21
Interfaz Map: ejemplo 7-22
Interfaz Deque 7-23
Pila con Deque: ejemplo 7-24
Ordenacin de recopilaciones 7-25
Interfaz Comparable 7-26
e to
Comparable: ejemplo 7-27 e n s
Prueba de Comparable: ejemplo 7-28 elic
a b l
Interfaz Comparator 7-29
fe r
Comparator: ejemplo 7-30 a n s
Prueba de Comparator: ejemplo 7-31 n - tr
o
Prueba 7-32
s an
Resumen 7-33
) ha uide
o m tG
Visin general de la prctica 7-1: Recuento de nmeros de artculo mediante el uso
c
de un HashMap 7-34 a il d e n
@ gm s Stu
Visin general de la prctica 7-2: Coincidencia de parntesis mediante Deque 7-35
r a vi e thi
Visin general de la prctica 7-3: Recuento de inventario y ordenacin con
m a u s
i ( e
elementos Comparator 7-36
v
ara
M8 Procesamiento de cadenas
w i n
Ed
Objetivos 8-2
Argumentos de lnea de comandos 8-3
Propiedades 8-5
Carga y uso de un archivo de propiedades 8-6
Carga de propiedades desde la lnea de comandos 8-7
PrintWriter y la consola 8-8
Formato printf 8-9
Prueba 8-10
Procesamiento de cadenas 8-11
StringBuilder y StringBuffer 8-12
StringBuilder: ejemplo 8-13
Mtodos de cadena de ejemplo 8-14
Uso del mtodo split() 8-15
Anlisis con StringTokenizer 8-16

viii
Scanner 8-17
Expresiones regulares 8-18
Pattern y Matcher 8-19
Clases de caracteres 8-20
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Clase de caracteres: ejemplos 8-21


Cdigo de clase de caracteres: ejemplos 8-22
Clases de caracteres predefinidas 8-23
Clases de caracteres predefinidas: ejemplos 8-24
Cuantificadores 8-25
Cuantificador: ejemplos 8-26
Voracidad 8-27
e to
Prueba 8-28
e n s
Coincidencias de lmite 8-29
el ic
Lmite: ejemplos 8-30 a b l
fe r
Prueba 8-31
a n s
Coincidencia y grupos 8-32
n - tr
o
Uso del mtodo replaceAll 8-33
Resumen 8-34 s an
) ha uide
Visin general de la prctica 8-1: Anlisis de texto con split() 8-35
c o m tG
a il d e n
Visin general de la prctica 8-2: Creacin de un programa de bsqueda de
gm s Stu
expresiones regulares 8-36
@
r a vi e thi
Visin general de la prctica 8-3: Transformacin de HTML mediante expresiones
a
regulares 8-37
m u s
( e
r a vi
9
Ma Excepciones y afirmaciones

w i n Objetivos 9-2
Ed Manejo de errores 9-3
Manejo de excepciones en Java 9-4
La sentencia try-catch 9-5
Objetos Exception 9-6
Categoras de excepciones 9-7
Prueba 9-8
Manejo de excepciones 9-10
La clusula finally 9-11
La sentencia try-with-resources 9-12
Excepciones suprimidas 9-13
La interfaz de AutoCloseable 9-14
Captura de varias excepciones 9-15
Declaracin de excepciones 9-16
Manejo de excepciones declaradas 9-17

ix
Devolucin de excepciones 9-18
Excepciones personalizadas 9-19
Prueba 9-20
Excepciones de envoltorio 9-21
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Revisin del patrn DAO 9-22


Afirmaciones 9-23
Sintaxis de las afirmaciones 9-24
Invariantes internas 9-25
Invariantes de flujo de control 9-26
Condiciones posteriores e invariantes de clases 9-27
Control de evaluacin de tiempo de ejecucin de afirmaciones 9-28
e to
Prueba 9-29
e n s
Resumen 9-30
el ic
Visin general de la prctica 9-1: Captura de excepciones 9-31
a b l
fe
Visin general de la prctica 9-2: Ampliacin del objeto Exception 9-32
r
a n s
n - tr
o
an
10 Conceptos fundamentales de E/S en Java
Objetivos 10-2 s
a ide
Conceptos bsicos de E/S en Java 10-3 ) h u
o m t G
Flujos de E/S 10-4
Aplicacin de E/S 10-5 ma
ilc den
@ g s Stu
r a vi de
Datos dentro de flujos 10-6
e t hi de bytes 10-7
m a
Mtodos InputStream
u s flujos
e
i ( OutputStream de flujos de bytes 10-9
Mtodos
a v
M arEjemplo de flujo de bytes 10-10
win Mtodos Reader de flujos de caracteres 10-11
Ed Mtodos Writer de flujos de caracteres 10-12
Ejemplo de flujo de caracteres 10-13
Cadenas de flujos de E/S 10-14
Ejemplo de flujos en cadena 10-15
Flujos de procesamiento 10-16
E/S de la consola 10-17
java.io.Console 10-18
Escritura en una salida estndar 10-19
Lectura a partir de una entrada estndar 10-20
E/S de canal 10-21
Visin general de la prctica 10-1: Escritura de una aplicacin simple de E/S de la
consola 10-22
Persistencia 10-23
Serializacin y grficos de objetos 10-24

x
Campos y objetos transitorios 10-25
Transient: ejemplo 10-26
UID de versin de serializacin 10-27
Ejemplo de serializacin 10-28
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Escritura y lectura de un flujo de objetos 10-29


Mtodos de serializacin 10-30
Ejemplo de readObject 10-31
Resumen 10-32
Prueba 10-33
Visin general de la prctica 10-2: Serializacin y anulacin de la serializacin de
ShoppingCart 10-37
e to
e n s
11 E/S de archivos Java (NIO.2)
el ic
Objetivos 11-2 a b l
fe r
Nueva API de E/S de archivos Java (NIO.2) 11-3
a n s
Limitaciones de java.io.File 11-4
o n -tr
Sistemas de archivos, rutas y archivos 11-5
s a n 11-6
Ruta de acceso relativa frente a ruta de acceso absoluta
Enlaces simblicos 11-7 ) ha uide
c o m tG
Conceptos de Java NIO.2 11-8
a il d e n
Interfaz Path 11-9
@ gm s Stu
Caractersticas devlai interfazth
a i 11-10
Path
Path: ejemplo
r
a 11-11us e
e m
a v i ( de redundancias de Path 11-12
Eliminacin

MarCreacin de una subruta 11-13


w i n Unin de dos rutas 11-14
Ed Creacin de una ruta entre dos rutas 11-15
Trabajo con enlaces 11-16
Prueba 11-17
Operaciones File 11-20
Comprobacin de un directorio o un archivo 11-21
Creacin de archivos y directorios 11-23
Supresin de un directorio o un archivo 11-24
Copia de un directorio o un archivo 11-25
Copia entre un flujo y una ruta 11-26
Desplazamiento de un directorio o un archivo 11-27
Listado del contenido de un directorio 11-28
Lectura o escritura de todos los bytes o lneas de un archivo 11-29
Canales y ByteBuffers 11-30
Archivos de acceso aleatorio 11-31

xi
Mtodos de E/S en buffer para archivos de texto 11-32
Flujos de bytes 11-33
Gestin de metadatos 11-34
Atributos de archivo (DOS) 11-35
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Atributos de archivo DOS: ejemplo 11-36


Permisos de POSIX 11-37
Prueba 11-38
Visin general de la prctica 11-1: Escritura de una aplicacin de fusin
de archivos 11-41
Operaciones recursivas 11-42
Orden del mtodo FileVisitor 11-43
e to
Ejemplo: WalkFileTreeExample 11-46
e n s
Bsqueda de archivos 11-47
elic
Patrn y sintaxis de PathMatcher 11-48
a b l
PathMatcher: ejemplo 11-50 fe r
a n s
Clase Finder 11-51
n - tr
Otras clases tiles de NIO.2 11-52 o
Cambio a NIO.2 11-53 s an
Resumen 11-54 ) ha uide
c o m tG
Prueba 11-55
a il d e n
gm s Stu
Visin general de la prctica 11-2: Copia recursiva 11-58
@
r a vi e thi
(Opcional) Visin general de la prctica 11-3: Uso de PathMatcher para realizar una

m a
supresin recursiva 11-59
u s
i ( e
v
Mara
12 Threads
Objetivos 12-2
w i n
Ed Programacin de tareas 12-3
Importancia de los threads 12-4
Clase Thread 12-5
Ampliacin de Thread 12-6
Inicio de Thread 12-7
Implantacin de Runnable 12-8
Ejecucin de instancias Runnable 12-9
Runnable con datos compartidos 12-10
Un ejecutable: varios threads 12-11
Prueba 12-12
Problemas con datos compartidos 12-13
Datos no compartidos 12-14
Prueba 12-15
Operaciones atmicas 12-16

xii
Ejecucin desordenada 12-17
Prueba 12-18
Palabra clave volatile 12-19
Parada de un thread 12-20
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Palabra clave volatile 12-22


Mtodos synchronized 12-23
Bloques synchronized 12-24
Bloqueo de supervisin de objeto 12-25
Deteccin de interrupcin 12-26
Interrupcin de un thread 12-27
Thread.sleep() 12-28
e to
Prueba 12-29
e n s
Mtodos Thread adicionales 12-30
elic
a b l
Mtodos a evitar 12-31
fe r
Interbloqueo 12-32
a n s
Resumen 12-33
n - tr
o
an
Visin general de la prctica 12-1: Sincronizacin de acceso a datos
s
compartidos 12-34
) ha uide
c o m tG
Visin general de la prctica 12-2: Implantacin de un programa multithread 12-35

a il d e n
13 Simultaneidad
@ gm s Stu
Objetivos 13-2 vi
r a e t hi
m a u s
Paquete java.util.concurrent 13-3
( e
r a vi java.util.concurrent.atomic 13-4
Paquete

M a Paquete java.util.concurrent.locks 13-5


w i n java.util.concurrent.locks 13-6
Ed Recopilaciones con proteccin de thread 13-7
Prueba 13-8
Sincronizadores 13-9
java.util.concurrent.CyclicBarrier 13-10
Alternativas de threads de alto nivel 13-11
java.util.concurrent.ExecutorService 13-12
java.util.concurrent.Callable 13-13
java.util.concurrent.Future 13-14
Cierre de ExecutorService 13-15
Prueba 13-16
E/S simultnea 13-17
Cliente de red de thread nico 13-18
Cliente de red multithread (parte 1) 13-19

xiii
Cliente de red multithread (parte 2) 13-20
Cliente de red multithread (parte 3) 13-21
Cliente de red multithread (parte 4) 13-22
Cliente de red multithread (parte 5) 13-23
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Paralelismo 13-24
Sin paralelismo 13-25
Paralelismo Naive 13-26
La necesidad de un marco Fork-Join 13-27
Extraccin de trabajo 13-28
Ejemplo de thread nico 13-29
java.util.concurrent.ForkJoinTask<V> 13-30
e to
Ejemplo de RecursiveTask 13-31
e n s
Estructura de compute 13-32
elic
Ejemplo de compute (por debajo del umbral) 13-33 a b l
fer
Ejemplo de compute (por encima del umbral) 13-34
a n s
Ejemplo de ForkJoinPool 13-35
n - tr
o
Recomendaciones del marco Fork-Join 13-36
s an
Prueba 13-37
) ha uide
Resumen 13-38
c o m tG
a il d e n
(Opcional) Visin general de la prctica 13-1: Uso del paquete
gm s Stu
java.util.concurrent 13-39
@
r a vi e thi
(Opcional) Visin general de la prctica 13-2: Uso del marco Fork-Join 13-40
m a u s
i ( e
14 Creacin de aplicaciones de base de datos con JDBC
v
Mara
Objetivos 14-2

w i n Uso de la API de JDBC 14-3


Ed Uso de clases de controlador de proveedor 14-4
Componentes de la API de JDBC clave 14-5
Uso de un objeto ResultSet 14-6
Unin de todo 14-7
Escritura de cdigo JDBC porttil 14-9
Clase SQLException 14-10
Cierre de objetos de JDBC 14-11
Construccin try-with-resources 14-12
try-with-resources: prctica incorrecta 14-13
Escritura de consultas y obtencin de resultados 14-14
Visin general de la prctica 14-1: Trabajo con la base de datos
Derby y JDBC 14-15
ResultSetMetaData 14-16

xiv
Obtencin de recuento de filas 14-17
Control del tamao de recuperacin de ResultSet 14-18
Uso de PreparedStatement 14-19
Uso de CallableStatement 14-20
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Qu es una transaccin? 14-22


Propiedades ACID de una transaccin 14-23
Transferencia sin transacciones 14-24
Transferencia correcta con transacciones 14-25
Transferencia incorrecta con transacciones 14-26
Transacciones JDBC 14-27
RowSet 1.1: RowSetProvider y RowSetFactory 14-28
e to
Uso de RowSetFactory de RowSet 1.1 14-29
e n s
Ejemplo: Uso de JdbcRowSet 14-31
elic
a b l
Objetos de acceso a datos 14-32
fe r
Patrn de objeto de acceso a datos 14-33
a n s
Resumen 14-34
n - tr
o
Prueba 14-35
s an
ha uide
Visin general de la prctica 14-2: Uso del patrn de objeto de acceso
)
a datos 14-39
c o m tG
a il d e n
15 Localizacin
@ gm s Stu
Objetivos 15-2 vi
r a e t hi
Por qu m a
localizar? u s
15-3
e
i ( de ejemplo 15-4
Aplicacin
a v
M arLocale 15-5
win Grupo de recursos 15-6
Ed Archivo de grupo de recursos 15-7
Archivos del grupo de recursos de ejemplo 15-8
Prueba 15-9
Inicializacin de la aplicacin de ejemplo 15-10
Aplicacin de ejemplo: bucle principal 15-11
Mtodo printMenu 15-12
Cambio de Locale 15-13
Interfaz de ejemplo con francs 15-14
Formato de fecha y moneda 15-15
Inicializacin de fecha y moneda 15-16
Visualizacin de fecha 15-17
Personalizacin de fechas 15-18
Visualizacin de moneda 15-19

xv
Prueba 15-20
Resumen 15-21
Visin general de la prctica 15-1: Creacin de una aplicacin de fecha
localizada 15-22
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

(Opcional) Visin general de la prctica 15-2: Localizacin de una aplicacin


JDBC 15-23

A Descripcin general de SQL


Objetivos A-2
Uso de SQL para consultar la base de datos A-3
Sentencias SQL A-4
e to
Sentencia SELECT bsica A-5
e n s
Limitacin de las filas seleccionadas A-7
elic
Uso de la clusula ORDER BY A-8
a b l
fe r
Sintaxis de las sentencias INSERT A-9
a n s
Sintaxis de sentencias UPDATE A-10
n - tr
Sentencia DELETE A-11 n o
s a
Sentencia CREATE TABLE A-12
h
) Gua i d e
Definicin de restricciones A-13
o m
Inclusin de restricciones A-16ilc
a d e nt
Tipos de datos A-18 gm S tu
@
vi A-20
Borrado de una tabla t hi s
a r a s e
Resumenm
e A-21 u
a v i(
Mar
w i n
Ed

xvi
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Excepciones y afirmaciones

e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
Objetivos

Al finalizar esta leccin, debera estar capacitado para:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Definir el objetivo de las excepciones de Java


Utilizar las sentencias try y throw
Utilizar las clusulas catch, multi-catch y finally
Cerrar automticamente recursos con una sentencia try-
with-resources
Reconocer categoras y clases de excepciones comunes e to
n s
Crear excepciones personalizadas y recursos que se
e l ice
puedan cerrar automticamente r a bl
Probar invariantes a travs de afirmaciones ans
fe
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin de Java SE 7 9-2


Manejo de errores
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Las aplicaciones encontrarn errores durante su ejecucin.


Una aplicacin fiable debe manejar los errores lo mejor posible.
Los errores:
Deben ser la excepcin y no el comportamiento
esperado
Deben poder manejarse para crear aplicaciones fiables
e to
n s
Se pueden producir como resultado de bugs en las
e l ice
aplicaciones
r a bl
Se pueden producir debido a factores n s fe
a
o
ms all del control de la aplicacin n-tr
an Bases de datos inaccesibles
s
i de Fallo del disco duro ) h a
o m tG u
il c e n
a d
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
ide( un resultado de fallo
a v
M ar lenguajes de programacin utilizan el valor de retorno de un mtodo para indicar si el
Devolucin
Algunos
d winmtodo se ha completado correctamente o no. En el ejemplo C int x = printf("hi");, un
E valor negativo en x indicara un fallo. Muchas de las funciones de la biblioteca estndar de C
devuelven un valor negativo en caso de fallo. El problema es que el ejemplo anterior se podra
escribir tambin como printf("hi");, donde se ignora el valor de retorno. En Java tambin
existe el mismo problema: los valores de retorno se pueden ignorar.
Cuando est creando un mtodo en lenguaje Java y no consiga ejecutarlo correctamente, sepa
que puede recurrir a las funciones de generacin y manejo de excepciones disponibles en el
lenguaje, en lugar de usar valores de retorno.

Programacin de Java SE 7 9-3


Manejo de excepciones en Java
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Cuando se usan bibliotecas de Java que se basan en recursos


externos, el compilador le exigir que maneje o declare las
excepciones que se puedan producir.
Manejar una excepcin significa que hay que agregar un
bloque de cdigo para manejar el error.
Declarar una excepcin significa que se declara que un
e to
mtodo puede fallar y no ejecutarse correctamente. e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
La regla de manejo o de declaracin
M bibliotecas exigirn conocer el proceso de manejo de excepciones. Estas incluyen:
Muchas
i n
w E/S de archivos (NIO: java.nio)
Ed Acceso a base de datos (JDBC: java.sql)
Manejar una excepcin significa utilizar una sentencia try-catch para transferir el control a un
bloque de manejo de excepciones cuando se produzca una excepcin. Declarar una excepcin
significa agregar una clusula throws a una declaracin de mtodo para indicar que el mtodo
puede fallar cuando se ejecute de un modo concreto. En otras palabras, "manejar" implica que la
responsabilidad es suya, mientras que "declarar" implica que la responsabilidad es de otra
persona.

Programacin de Java SE 7 9-4


La sentencia try-catch

La sentencia try-catch se utiliza para manejar excepciones.


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

try {
System.out.println("About to open a file");
InputStream in =
new FileInputStream("missingfile.txt");
Se omite la lnea si la e to
System.out.println("File open");
lnea anterior no pudo
e n s
} catch (Exception e) { abrir el archivo.
el ic
System.out.println("Something went wrong!"); a b l
fe r
}
a n s
o n -tr
Esta lnea solo se ejecuta
si se produjo algn error s an
en el bloque try.
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
( e
icatch
a
La clusulav
SiM
ar
se produce una excepcin dentro de un bloque try, la ejecucin se transferir al bloque
win catch asociado. Se omitirn todas las lneas dentro del bloque try que aparezcan detrs de la
Ed excepcin, y no se ejecutarn. La clusula catch debe usarse para:
Volver a intentar la operacin
Probar una operacin alternativa
Cerrar o volver sin generar un error
Evite dejar bloques catch vacos. Ocultar sin ms las excepciones no es buena prctica.

Programacin de Java SE 7 9-5


Objetos Exception

A las clusulas catch se les pasan referencias a objetos


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

java.lang.Exception. La clase java.lang.Throwable


es la clase principal para Exception, y describe varios
mtodos utilizables.

try{
e to
//...
e n s
} catch (Exception e) {
elic
System.out.println(e.getMessage());
a b l
fe r
e.printStackTrace();
a n s
}
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Registro de excepciones
M se produzcan errores en su aplicacin, a menudo le vendr bien registrar qu ha pasado.
Cuando
i n
w Los desarrolladores de Java tienen a su disposicin varias bibliotecas de registro, incluida Log4j
Ed de Apache y el marco de registro incorporado java.util. Si bien estas bibliotecas de registro
no forman parte del objeto de estudio de este curso, ver que algunos IDE, como NetBeans,
recomiendan eliminar todas las llamadas a printStackTrace(). Esto es as porque las
aplicaciones con calidad de produccin deben emplear una biblioteca de registro, en lugar de
generar mensajes de depuracin en la pantalla.

Programacin de Java SE 7 9-6


Categoras de excepciones

La clase java.lang.Throwable conforma la base de la


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

jerarqua de clases de excepciones. Hay dos categoras de


excepciones principales:
Throwable

Excepciones
comprobadas, las cuales
se deben manejar o
e to
declarar.
Error Exception
e n s
Excepciones no el ic
a b l
comprobadas, que fe r
normalmente no se
RuntimeException SQLException
a n s IOException

manejan o declaran. o n -tr


s an
ha uide
ArithmeticException FileNotFoundException

m tG)
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Gestin de excepciones
M se genera un objeto Exception y se pasa a una clusula catch, se instancia desde
Cuando
i n
w una clase que representa el tipo concreto de problema que se ha producido. Estas clases
Ed relacionadas con las excepciones se pueden dividir en dos categoras: comprobadas y no
comprobadas.
Excepciones no comprobadas
java.lang.RuntimeException, java.lang.Error y sus subclases se categorizan como
excepciones no comprobadas. Estos tipos de excepciones no deberan producirse normalmente
al ejecutarse la aplicacin. Se puede usar una sentencia try-catch para detectar ms
fcilmente el origen de estas excepciones, pero cuando una aplicacin est lista para produccin,
deber quedar poco cdigo para gestionar RuntimeException y sus subclases. Las subclases
Error representan errores que no puede corregir, como que la mquina JVM se est quedando sin
memoria. Entre las excepciones RuntimeException con las que habitualmente tendr que
solucionar problemas se encuentran:
ArrayIndexOutOfBoundsException: acceso a un elemento de matriz que no existe.
NullPointerException: uso de una referencia que no apunta a ningn objeto.
ArithmeticException: divisin entre cero.

Programacin de Java SE 7 9-7


Prueba

Las excepciones NullPointerException se deben capturar


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

mediante una sentencia


try-catch.
a. Verdadero
b. Falso
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin de Java SE 7 9-8


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Cul de los siguientes tipos son todas excepciones probadas


instancesof?
a. Error
b. Throwable
c. RuntimeException
d. Exception e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin de Java SE 7 9-9


Manejo de excepciones
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Debe siempre capturar el tipo de excepcin ms especfico. Se


pueden asociar varios bloques catch con una nica sentencia try.

try {
System.out.println("About to open a file");
InputStream in = new FileInputStream("missingfile.txt");
System.out.println("File open"); El orden es importante. Primero es
e to
int data = in.read(); necesario capturar las excepciones
e n s
in.close();
ms especficas (es decir, las
clases secundarias antes que las
elic
clases principales).
a b l
} catch (FileNotFoundException e) {
fe r
System.out.println(e.getClass().getName());
a n s
System.out.println("Quitting");
o n -tr
} catch (IOException e) {
s an
System.out.println(e.getClass().getName());
) ha uide
System.out.println("Quitting");
c o m tG
}
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Excepciones comprobadas
M las clases que son subclase de Exception, excepto RuntimeException y sus
Todas
i n
w subclases, entran dentro de la categora de excepciones comprobadas. Estas excepciones se
Ed deben manejar o declarar con una sentencia try o throws. La documentacin HTML de una
API Java (Javadoc) describir qu excepciones comprobadas se pueden generar mediante un
mtodo o un constructor y por qu.
Capturar el tipo ms especfico de excepcin le permite escribir bloques catch destinados a
manejar tipos de errores muy especficos. Debe evitar capturar el tipo base de Exception, ya
que es difcil crear un bloque catch con finalidad general que pueda gestionar todos los errores
posibles.
Nota: las excepciones devueltas por Java Persistence API (JPA) amplan RuntimeException,
y por ello se categorizan como excepciones sin comprobar. Estas excepciones necesitan
manejarse o declararse en cdigo listo para produccin, incluso aunque no sea necesario
hacerlo mediante el compilador.

Programacin de Java SE 7 9-10


La clusula finally

InputStream in = null;
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

try {
System.out.println("About to open a file");
in = new FileInputStream("missingfile.txt");
System.out.println("File open");
int data = in.read();
} catch (IOException e) {
e to
System.out.println(e.getMessage());
e n s
elic
} finally { Las clusulas finally se ejecutan con independencia
de si se ha generado o no un objeto Exception. a b l
try {
fe r
a n s
-tr
if(in != null) in.close(); Siempre hay que cerrar
} catch (IOException e) { o n
los recursos abiertos.

System.out.println("Failed to close file"); s an


} ) ha uide
c o m tG
}
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Cierre de recursos
M se abren recursos, como archivos o conexiones a bases de datos, siempre deben
Cuando
i n
w cerrarse una vez dejan de hacer falta. Intentar cerrar estos recursos dentro del bloque try puede
Ed ser problemtico, ya que se puede terminar omitiendo la operacin de cierre. Los bloques
finally se ejecutan siempre, independientemente de si se ha producido o no un error al
ejecutarse el bloque try. Si el control salta a un bloque catch, el bloque finally se ejecutar
despus del bloque catch.
En ocasiones, la operacin que desea realizar en el bloque finally puede provocar ella misma
la generacin del objeto Exception. En ese caso, tal vez sea necesario anidar una sentencia
try-catch dentro de un bloque finally. Tambin se puede anidar una sentencia try-catch
dentro de bloques try y catch.

Programacin de Java SE 7 9-11


La sentencia try-with-resources

Java SE 7 proporciona una nueva sentencia try-with-


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

resources para cerrar automticamente recursos.


System.out.println("About to open a file");
try (InputStream in =
new FileInputStream("missingfile.txt")) {
System.out.println("File open");
e to
int data = in.read(); e n s
elic
} catch (FileNotFoundException e) {
a b l
System.out.println(e.getMessage()); fe r
a n s
} catch (IOException e) {
o n -tr
an
System.out.println(e.getMessage());
} s
ha uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Recursos que se pueden cerrar
Msentencia try-with-resources puede evitar tener que usar un largo bloque finally. Los
La
i n
w recursos abiertos con la sentencia try-with-resources se cierran siempre. Las clases que
Ed implantan java.lang.AutoCloseable se pueden utilizar como recurso. Si un recurso se tiene
que cerrar automticamente, su referencia se deber declarar dentro de los parntesis de la
sentencia try.
Si van separados por punto y coma, se pueden abrir varios recursos. Si abre varios recursos, se
cerrarn en el orden inverso a su apertura.

Programacin de Java SE 7 9-12


Excepciones suprimidas

Si se produce una excepcin en el bloque try de una


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

sentencia try-with-resources y se produce una excepcin


mientras se cierran los recursos, las excepciones resultantes
se suprimirn.
} catch(Exception e) {
System.out.println(e.getMessage());
e to
for(Throwable t : e.getSuppressed()) { e n s
elic
System.out.println(t.getMessage());
a b l
} fe r
a n s
}
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
SiM
ara
Excepciones en recursos
se produce una excepcin al crear el recurso AutoCloseable, el control saltar
i n
w inmediatamente a un bloque catch.
Ed Si se produce una excepcin en el cuerpo del bloque try, se cerrarn todos los recursos antes
de que se ejecute el bloque catch. Si se genera una excepcin mientras se cierran los recursos,
se suprimir.
Si el bloque try se ejecuta sin excepciones, pero se genera una excepcin al cerrar un recurso,
el control saltar a un bloque catch.

Programacin de Java SE 7 9-13


La interfaz de AutoCloseable

Un recurso en una sentencia try-with-resources debe


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

implantar una de las siguientes opciones:


java.lang.AutoCloseable
Nueva en JDK 7
Puede devolver un objeto Exception
java.io.Closeable e to
Refactorizada en JDK7 para ampliar AutoCloseable e n s
e lic
Puede devolver un objeto IOException abl fe r
a n s
public interface AutoCloseable {
o n -tr
void close() throws Exception;
s an
}
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Cierre frente a cierre automtico
Mdocumentacin de la API de Java dice lo siguiente sobre AutoCloseable: "Tenga en cuenta
La
i n
w que, al contrario que el mtodo de cierre Closeable, este mtodo de cierre no tiene que ser
Ed idempotente. En otras palabras, llamar a este mtodo de cierre ms de una vez puede tener un
efecto secundario visible, a diferencia de Closeable.close, que no puede tener ningn efecto
si se le llama ms de una vez. No obstante, se anima encarecidamente a los implantadores de
esta interfaz a hacer sus mtodos de cierre idempotentes."

Programacin de Java SE 7 9-14


Captura de varias excepciones

Java SE 7 proporciona una nueva clusula multi-catch.


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

ShoppingCart cart = null;


try (InputStream is = new FileInputStream(cartFile);
ObjectInputStream in = new ObjectInputStream(is)) {
cart = (ShoppingCart)in.readObject();
} catch (ClassNotFoundException | IOException e) {
e to
System.out.println("Exception deserializing " + cartFile);
e n s
System.out.println(e);
elic
System.exit(-1);
a b l
} Cuando hay varios tipos de
fe r
excepciones, se separan
a n s
con una barra vertical.
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
AM
ara
Las ventajas de multi-catch
veces interesa realizar la misma accin, independientemente de la excepcin que se est
i n
w generando. La nueva clusula multi-catch reduce la cantidad de cdigo que hay que escribir
Ed gracias a que elimina la necesidad de incluir varias clusulas catch con el mismo
comportamiento.
Otra ventaja de la clusula multi-catch es que reduce la posibilidad de intentar capturar una
excepcin genrica. La captura de objetos Exception impide ver otros tipos de excepciones que
se pueden generar mediante cdigo agregado ms tarde a un bloque try.
Los diferentes tipos separados por barras verticales no pueden tener una relacin de herencia.
No se pueden incluir ambas FileNotFoundException y IOException dentro de una clusula
multi-catch.
La E/S de archivos y la serializacin de objetos se tratan en la leccin sobre los "conceptos
fundamentales de E/S de Java".

Programacin de Java SE 7 9-15


Declaracin de excepciones
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Puede declarar que un mtodo devuelve una excepcin en


lugar de manejarla.
public static int readByteFromFile() throws IOException {
try (InputStream in = new FileInputStream("a.txt")) {
System.out.println("File open");
return in.read();
e to
} e n s
elic
}
a b l
fe r
Observe la falta de clusulas a n s
catch. La sentencia try-with-
o n -tr
an
resources se est utilizando solo
para cerrar recursos.
s
ha uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Mediante la clusula throws, un mtodo puede declarar que devuelve una o ms excepciones

i n M
durante su ejecucin. Si se genera una excepcin mientras se ejecuta el mtodo, este dejar de
w ejecutarse y se devolver la excepcin al emisor. Los mtodos sustituidos pueden declarar las
Ed mismas excepciones, menos excepciones o excepciones ms especficas, pero no ms
excepciones ni ms genricas. Un mtodo puede declarar varias excepciones mediante una lista
separada por comas.
public static int readByteFromFile() throws FileNotFoundException,
IOException {
try (InputStream in = new FileInputStream("a.txt")) {
System.out.println("File open");
return in.read();
}
}
Si bien tcnicamente no necesita declarar FileNotFoundException, ya que es una subclase
de IOException, es buena prctica hacerlo.

Programacin de Java SE 7 9-16


Manejo de excepciones declaradas
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Las excepciones que pueden devolver los mtodos deben


manejarse. Al declarar una excepcin simplemente se
especifica que es otra persona la que tiene que manejarla.
public static void main(String[] args) { Mtodo que ha declarado
una excepcin
try {
int data = readByteFromFile();
e to
} catch (IOException e) { e n s
elic
System.out.println(e.getMessage());
a b l
} fe r
a n s
}
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Manejo de excepciones
Maplicacin debe siempre manejar sus excepciones. Cuando se agrega una clusula throws a
Su
i n
w un mtodo, simplemente se retrasa el manejo de la excepcin. De hecho, las excepciones se
Ed pueden devolver repetidamente a la pila de llamadas. Las aplicaciones Java SE estndar deben
manejar las excepciones antes de sacarlas del mtodo main; de no hacerlo, se corre el riesgo de
que el programa termine anormalmente. Se puede declarar que main devuelva una excepcin,
pero, a menos que est diseando programas que quiera que terminen de forma abrupta, deber
evitar hacerlo.

Programacin de Java SE 7 9-17


Devolucin de excepciones
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Puede volver a emitir una excepcin capturada previamente.


Tenga en cuenta que hay una clusula throws y una
sentencia throw.

public static int readByteFromFile() throws IOException {


try (InputStream in = new FileInputStream("a.txt")) {
e to
System.out.println("File open");
e n s
return in.read();
elic
} catch (IOException e) {
a b l
fe r
e.printStackTrace();
a n s
throw e;
o n -tr
}
s an
}
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Reemisin precisa
M SE 7 permite volver a emitir el tipo de excepcin precisa. El ejemplo que sigue no se
Java
i n
w compilara con Java SE 6, ya que la clusula catch recibe un objeto Exception, pero el mtodo
Ed devuelve un objeto IOException. Para obtener ms informacin acerca de la nueva funcin de
reemisin precisa, consulte
http://download.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html#rethrow.

public static int readByteFromFile() throws IOException {


try {
InputStream in = new FileInputStream("a.txt");
System.out.println("File open");
return in.read();
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}

Programacin de Java SE 7 9-18


Excepciones personalizadas
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Puede crear clases de excepciones personalizadas


extendiendo Exception o una de sus subclases.

public class DAOException extends Exception {

public DAOException() {
e to
super();
e n s
}
elic
a b l
fe r
public DAOException(String message) {
a n s
super(message);
o n -tr
}
s an
}
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
Las bibliotecas de clases de Java estndar nunca devuelven excepciones personalizadas. Para
hacer uso de una clase de excepcin personalizada, deber devolverla usted mismo. Por
w i n
ejemplo:
Ed throw new DAOException();
Una clase de excepcin personalizada puede sustituir mtodos o agregar nuevas
funcionalidades. Las reglas de herencia son las mismas, incluso aunque el tipo de clase principal
sea una excepcin.
Dado que las excepciones capturan informacin sobre un problema que se ha producido, es
posible que necesite agregar campos y mtodos dependiendo del tipo de informacin que sea
necesario capturar. Si una cadena puede capturar toda la informacin necesaria, puede usar el
mtodo getMessage() que todas las clases Exception heredan de Throwable. Los
constructores de Exception que reciban una cadena la almacenarn para que getMessage()
la devuelva.

Programacin de Java SE 7 9-19


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Qu palabra clave usara para agregar una clusula a un


mtodo que indique que el mtodo puede generar una
excepcin?
a. throw
b. thrown
c. throws e to
e n s
d. assert ic
b l el
fe r a
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin de Java SE 7 9-20


Excepciones de envoltorio

Utilice una excepcin de envoltorio para ocultar el tipo de


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

excepcin que se est generando sin simplemente ocultar la


excepcin.
public class DAOException extends Exception {
public DAOException(Throwable cause) {
super(cause);
e to
}
e n s
elic
a b l
public DAOException(String message, Throwable cause)
fe r
{
a n s
super(message, cause);
o n -tr
}
s an
} ) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Obtencin de la causa
Mclase Throwable contiene un mtodo getCause() que se puede usar para recuperar una
La
i n
w excepcin de envoltorio.
Ed
try {
//
} catch (DAOException e) {
Throwable t = e.getCause();
}

Programacin de Java SE 7 9-21


Revisin del patrn DAO
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

El patrn DAO utiliza la abstraccin (una interfaz) para permitir


sustituir la implantacin. Un DAO de base de datos o archivo
debe gestionar excepciones. Una implantacin de DAO puede
usar una excepcin de envoltorio para preservar la abstraccin
y evitar ocultar excepciones.

e to
public Employee findById(int id) throws DAOException {
e n s
try {
elic
a b l
return employeeArray[id];
fe r
} catch (ArrayIndexOutOfBoundsException e) {
a n s
throw new DAOException("Error finding employee in DAO", e);
o n -tr
an
}
} s
ha uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Excepciones DAO
MDAO basado en archivo debe gestionar excepciones IOException y un DAO basado en
Un
i n
w JDBC debe gestionar excepciones SQLException. Si estos tipos de excepciones los devolvi un
Ed DAO, los clientes se vincularn con una implantacin en lugar de con una abstraccin. Al
modificar la interfaz de DAO e implantar clases para devolver una excepcin de envoltorio
(DAOException), podr conservar la abstraccin y los clientes podrn saber cundo encuentra
un problema la implantacin de DAO.

Programacin de Java SE 7 9-22


Afirmaciones
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Utilice afirmaciones para documentar y verificar las


suposiciones y la lgica interna de un nico mtodo:
Invariantes internas
Invariantes de flujo de control
Condiciones posteriores e invariantes de clases
Usos de afirmaciones no adecuados e to
Las afirmaciones se pueden desactivar en el tiempo de e n s
ejecucin; por ello: l e lic
r a b
f
No utilice afirmaciones para comprobar los parmetros
s e de un
mtodo pblico. tra n
n -
noefectos secundarios
No utilice mtodos que puedan generar
a
as
en la comprobacin de la afirmacin. e ) h Guid
o m
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Por qu utilizar afirmaciones
M utilizar afirmaciones para agregar cdigo a sus aplicaciones que garantice que la
Puede
i n
w aplicacin se est ejecutando segn lo esperado. El uso de afirmaciones le permite probar
Ed diferentes fallos en las condiciones. En caso de fallo, se termina la aplicacin y se muestra
informacin de depuracin. No deben usarse afirmaciones si las comprobaciones tienen que
ejecutarse siempre, puesto que la comprobacin de las afirmaciones se puede desactivar.

Programacin de Java SE 7 9-23


Sintaxis de las afirmaciones
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

La sintaxis de una afirmacin es la siguiente:


assert <expresin_booleana> ;
assert <expresin_booleana> : <expresin_detalle> ;
Si <expresin_booleana> se evala en false,
entonces se devuelve AssertionError.
El segundo argumento se convierte a una cadena y se e to
utiliza como texto descriptivo en el mensaje e n s
lic
AssertionError. ble ra
f e
tra ns
n -
a no
h a s de
m ) Gui
o
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
La sentencia assert
Mafirmaciones combinan el mecanismo de manejo de excepciones de Java con cdigo que se
Las
i n
w ejecuta condicionalmente. A continuacin se incluye un ejemplo de pseudocdigo del
Ed comportamiento de afirmaciones:
if (AssertionsAreEnabled) {
if (condition == false) throw new AssertionError();
}
AssertionError es una subclase de Error y, por lo tanto, entra en la categora de
excepciones sin comprobar.

Programacin de Java SE 7 9-24


Invariantes internas
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

El problema es:
1 if (x > 0) {
2 // hacer esto
3 } else {
4 // hacer eso
5 }
e to
La solucin es: e n s
le lic
1 if (x > 0) {
a b
2 // hacer esto s f er
- t r an
3 } else {
n on
4 assert ( x == 0 );
s a
) a
h x seai denegativo
5 // hacer eso, salvo que
o m tG u
6 } il c en
g ma Stud
a v i@
Copyright t h isy/o sus filiales. Todos los derechos reservados.
2011, Oracle
r
e ma use
a v i(
a r
i n M
w
Ed

Programacin de Java SE 7 9-25


Invariantes de flujo de control
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Ejemplo:

1 switch (suit) {
2 case Suit.CLUBS: // ...
3 break;
4 case Suit.DIAMONDS: // ...
5 break;
e to
6 case Suit.HEARTS: // ...
e n s
7 break;
elic
8 case Suit.SPADES: // ... a b l
fe r
9 break;
a n s
10 default: assert false : "Palo de cartas desconocido";
o n -tr
an
11 break;
12 } s
ha uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin de Java SE 7 9-26


Condiciones posteriores e invariantes de clases
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Ejemplo:

1 public Object pop() {


2 int size = this.getElementCount();
3 if (size == 0) {
4 throw new RuntimeException("Intento de extraccin de montn vaco");
5 }
6
e to
7 Object result = /* cdigo para recuperar elemento extrado */ ;
e n s
8
elic
9 // prueba de la condicin posterior
a b l
10 assert (this.getElementCount() == size - 1);
fe r
11
a n s
12 return result;
o n -tr
an
13 }

s
ha uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin de Java SE 7 9-27


Control de evaluacin de tiempo
de ejecucin de afirmaciones
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Si se ha desactivado la comprobacin de afirmaciones, el


cdigo se ejecuta igual de rpido que si las comprobaciones
no hubieran estado all nunca.
La comprobacin de afirmaciones est desactivada por
defecto. Active las afirmaciones con cualquiera de los
siguientes comandos:
e to
java -enableassertions MyProgram
e n s
elic
a b l
java -ea MyProgram s f er
La comprobacin de las afirmaciones se puede
- t r ancontrolar por
n onConsulte:
clases, paquetes y jerarquas de paquetes.
s a
a
h uide
http://download.oracle.com/javase/7/docs/technotes/guides/la
)
nguage/assert.html om G
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin de Java SE 7 9-28


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Deben utilizarse afirmaciones para validar entradas del


usuario?
a. Verdadero
b. Falso

e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin de Java SE 7 9-29


Resumen
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta leccin, debe haber aprendido a hacer lo siguiente:


Definir el objetivo de las excepciones de Java
Utilizar las sentencias try y throw
Utilizar las clusulas catch, multi-catch y finally
Cerrar automticamente recursos con una sentencia
try-with-resources e to
e n s
Reconocer categoras y clases de excepciones comunes lic
a b le
Crear excepciones personalizadas y recursos queese r
s f
puedan cerrar automticamente
- t r an
Probar invariantes a travs de n on
a
afirmaciones as e ) h Guid
o m
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin de Java SE 7 9-30


Visin general de la prctica 9-1:
Captura de excepciones
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica, se abordan los siguientes temas:


Adicin de sentencias try-catch a una clase
Manejo de excepciones

e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
En esta prctica, escribir cdigo para gestionar excepciones comprobadas y no comprobadas.
M
w i n
Ed

Programacin de Java SE 7 9-31


Visin general de la prctica 9-2:
Ampliacin del objeto Exception
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica, se abordan los siguientes temas:


Adicin de sentencias try-catch a una clase
Manejo de excepciones
Ampliacin de la clase Exception
Creacin de un recurso personalizado con cierre
automtico e to
e n s
Uso de una sentencia try-with-resources
le lic
Devolucin de excepciones con throw y throwserab
ns f
t r a
no n-
a
s de
h
) Gui a
o m
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
En esta prctica, actualizar una implantacin de patrn DAO para usar una excepcin de
envoltorio personalizada.
w i n
Ed

Programacin de Java SE 7 9-32


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Conceptos fundamentales de E/S en Java

e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
Objetivos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Al finalizar esta leccin, debera estar capacitado para:


Describir los aspectos bsicos de entrada y salida en Java
Leer datos de la consola y escribir datos en ella
Utilizar flujos para leer y escribir datos
Leer y escribir objetos mediante serializacin
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 10-2


Conceptos bsicos de E/S en Java
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

El lenguaje de programacin Java proporciona un completo


juego de bibliotecas para realizar funciones de entrada/salida
(E/S).
Java define los canales de E/S como flujos.
Un flujo de E/S representa un origen de entrada o un
destino de salida. to
Los flujos pueden representar muchos tipos de orgenes yicen
se
destinos diferentes, como archivos de disco, dispositivos, b l el
otros programas y matrices de memoria. f e ra
t r a ns
Los flujos admiten muchos tipos de datos
o n -diferentes, como
a n caracteres
bytes simples, tipos de datos primitivos,
s
localizados y objetos. ) ha ide m G u
o t
a ilc den
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
e ma us
a v i(
Algunos flujos simplemente pasan datos, mientras que otros manipulan y transforman los datos
a r
i n M
de formas tiles.
w
Ed

Programacin Java SE 7 10-3


Flujos de E/S
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Los programas utilizan flujos de entrada para leer datos


desde un origen un elemento cada vez.

e to
e n s
Los programas utilizan flujos de salida para escribir datoslic
en un destino (receptor) un elemento cada vez. rab
le
sf e
tr a n
o n -
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
M ara
Independientemente de cmo trabajen internamente, todos los flujos presentan el mismo modelo
simple a los programas que los usan: un flujo es una secuencia de datos.
i n
w Un flujo es un flujo de datos. Un flujo puede proceder de un origen o se puede generar en un
Ed receptor.
Un flujo de origen inicia el flujo de datos, llamado tambin flujo de entrada.
Un flujo de receptor termina el flujo de datos, llamado tambin flujo de salida.
Los orgenes y los receptores son ambos flujos de nodo. Los tipos de flujos de nodo son archivos,
memoria y canales entre threads o procesos.

Programacin Java SE 7 10-4


Aplicacin de E/S

Generalmente existen tres maneras en las que un


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

desarrollador puede usar la entrada y la salida:


Archivos y
directorios

e to
Consola: e n s
(entrada el ic
a
estndar yb l
fe r
a n s
salida estndar)

o n -tr
s an Orgenes
h
) Gui a d e basados en
o m
a ilc dent sockets

@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
Los desarrolladores de aplicaciones generalmente utilizan flujos de E/S para leer y escribir
archivos, para leer y escribir informacin en y desde algunos dispositivos de salida, como el
w i n
teclado (entrada estndar) y la consola (salida estndar). Por ltimo, es posible que una
Ed aplicacin necesite utilizar un socket para comunicarse con otra aplicacin en un sistema remoto.

Programacin Java SE 7 10-5


Datos dentro de flujos

La tecnologa Java soporta dos tipos de flujos: de caracteres


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

y de bytes.
La entrada y la salida de datos de caracteres se maneja a
travs de lectores y escritores.
La entrada y la salida de datos de bytes se maneja a travs
de flujos de entrada y flujos de salida:
Normalmente, el trmino flujo hace referencia a un flujo de
e to
bytes. e n s
Los trminos lector y escritor hacen referencia a flujos de le lic
b
caracteres. era sf
a n
tr caracteres
Flujo Flujos de bytes Flujos -de
n o n
Flujos de origen InputStream s aReader
h a
) GuWriter i d e
Flujos de receptor o m
ilc dent
OutputStream
a
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
i (Java soporta dos tipos de flujos de entrada de datos: bytes no procesados y
a v
La tecnologa
M ar Unicode. Generalmente, el trmino flujo hace referencia a flujos de bytes, y los
caracteres
w intrminos lector y escritor hacen referencia a flujos de caracteres.
Ed Ms concretamente, los flujos de entrada de bytes se implantan mediante subclases de la clase
InputStream, y los flujos de salida de bytes se implantan mediante subclases de la clase
OutputStream. Los flujos de entrada de caracteres se implantan mediante subclases de la clase
Reader, y los flujos de salida de caracteres se implantan mediante subclases de la clase
Writer.
Los flujos de bytes se aplican mejor a la lectura y escritura de bytes no procesados (como
archivos de imgenes, archivos de audio y objetos). Las diferentes subclases ofrecen mtodos
para proporcionar soporte especfico para uno de estos tipos de flujos.
Los flujos de caracteres se disean para leer caracteres (como los incluidos en archivos y otros
flujos basados en caracteres).

Programacin Java SE 7 10-6


Mtodos InputStream de flujos de bytes

Los tres mtodos bsicos read son:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

int read()
int read(byte[] buffer)
int read(byte[] buffer, int offset, int length)

Otros mtodos incluyen:


e to
void close(); // Close an open stream
e n s
int available(); // Number of bytes available
elic
long skip(long n); // Discard n bytes from stream
a b l
fe r
a n s
boolean markSupported(); //
o n -tr
an
void mark(int readlimit); // Push-back operations
void reset(); // s
ha uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ElM
ara
Mtodos InputStream
mtodo read() devuelve un valor int que contiene un byte ledo del flujo, o un valor -1 que
i n
w indica la condicin de fin de archivo. Los otros dos mtodos de lectura leen el flujo en una matriz
Ed de bytes y devuelven el nmero de bytes ledos. Los dos argumentos int del tercer mtodo
indican un subrango en la matriz de destino que debe rellenarse.
Nota: para una mayor eficiencia, lea siempre los datos en el bloque prctico ms grande posible,
o use flujos en buffer.
Cuando haya terminado con un flujo, cirrelo. Si tiene una pila de flujos, utilice flujos de filtro para
cerrar el flujo en la parte superior de la pila. Esta operacin tambin cierra los flujos inferiores.
Nota: en Java SE 7, InputStream implanta AutoCloseable, lo cual significa que, si usa una
clase InputStream (o una de sus subclases) en un bloque try-with-resources, el flujo se cierra
automticamente al final de la sentencia try.
El mtodo available informa sobre el nmero de bytes inmediatamente disponibles para leerse
en el flujo. La operacin de lectura real que siga a esta llamada puede devolver ms bytes.
El mtodo skip desecha el nmero especfico de bytes del flujo.

Programacin Java SE 7 10-7


Los mtodos markSupported(), mark() y reset() realizan operaciones de retroceso en un
flujo, si el flujo en cuestin lo soporta. El mtodo markSupported() devuelve true si los
mtodos mark() y reset() estn operativos para ese flujo concreto. El mtodo mark(int)
indica que debe anotarse el punto actual en el flujo y se debe asignar un buffer lo suficientemente
grande como para soportar, como mnimo, el nmero de bytes del argumento especificado. El
parmetro del mtodo mark(int) especifica el nmero de bytes que se pueden volver a leer
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

llamando a reset(). Tras las operaciones read() posteriores, cuando se llama al mtodo
reset(), se devuelve el flujo de entrada al punto marcado. Si se lee ms all del buffer
marcado, reset() no tendr ningn significado.

e to
e n s
el ic
a b l
fe r
a n s
n - tr
o
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
r a vi e thi
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 10-8


Mtodos OutputStream de flujos de bytes

Los tres mtodos bsicos write son:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

void write(int c)
void write(byte[] buffer)
void write(byte[] buffer, int offset, int length)

Otros mtodos incluyen:


void close(); // Automatically closed in try-with-resources e to
e n s
void flush(); // Force a write to the stream
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Mtodos OutputStream
M con entradas, procure siempre escribir los datos en el bloque prctico ms grande posible.
Como
w i n
Ed

Programacin Java SE 7 10-9


Ejemplo de flujo de bytes
1 import java.io.FileInputStream; import java.io.FileOutputStream;
2 import java.io.FileNotFoundException; import java.io.IOException;
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

3
4 public class ByteStreamCopyTest {
5 public static void main(String[] args){
6 byte[] b = new byte[128]; int bLen = b.length;
7 // Example use of InputStream methods
8 try (FileInputStream fis = new FileInputStream (args[0]);
9 FileOutputStream fos = new FileOutputStream (args[1])) {
10 System.out.println ("Bytes available: " + fis.available());
11 int count = 0; int read = 0;
e to
12
13
while (fis.read(b) != -1) {
if (read < bLen) fos.write(b, 0, read);
e n s
14 else fos.write(b); Tenga en cuenta que es necesario
elic
15 count += read; saber cuntos bytes se leen cada
a b l
16 } vez en la matriz de bytes.
fe r
17 System.out.println ("Wrote: " + count);
a n s
18 } catch (FileNotFoundException f) {
o n -tr
an
19 System.out.println ("File not found: " + f);
20
21
} catch (IOException e) {
s
ha uide
System.out.println ("IOException: " + e);
22 }
m tG )
c o n
il
23 }
a d e
gm s Stu
24 }

@ hi y/o sus filiales. Todos los derechos reservados.


vi 2011,e Oracle
t
a r a
Copyright
s
( e m u
v i
Mara
Este ejemplo copia un archivo en otro a travs de una matriz de bytes. Tenga en cuenta que
FileInputStream y FileOutputStream se usan en un principio para flujos de bytes no
w i n
procesados, como archivos de imgenes.
Ed Nota: el mtodo available(), segn la documentacin de Java, informa sobre "una estimacin
del nmero de bytes restantes que pueden leerse (u omitirse) desde este flujo de entrada sin
bloques".

Programacin Java SE 7 10-10


Mtodos Reader de flujos de caracteres

Los tres mtodos bsicos read son:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

int read()
int read(char[] cbuf)
int read(char[] cbuf, int offset, int length)

Otros mtodos incluyen:


void close() e to
e n s
boolean ready()
elic
long skip(long n)
a b l
boolean markSupported()
fe r
void mark(int readAheadLimit)
a n s
void reset()
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ElM
ara
Mtodos Reader
primer mtodo devuelve un valor int que contiene un carcter Unicode ledo del flujo, o un
i n
w valor -1 que indica la condicin de fin de archivo. Los otros dos mtodos leen de una matriz de
Ed caracteres y devuelven el nmero de bytes ledos. Los dos argumentos int del tercer mtodo
indican un subrango en la matriz de destino que debe rellenarse.

Programacin Java SE 7 10-11


Mtodos Writer de flujos de caracteres

Los mtodos bsicos write son:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

void write(int c)
void write(char[] cbuf)
void write(char[] cbuf, int offset, int length)
void write(String string)
void write(String string, int offset, int length)

e to
Otros mtodos incluyen: e n s
elic
void close()
a b l
void flush()
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Mtodos Writer
M mtodos son anlogos a los mtodos OutputStream.
Estos
w i n
Ed

Programacin Java SE 7 10-12


Ejemplo de flujo de caracteres
1 import java.io.FileReader; import java.io.FileWriter;
2 import java.io.IOException; import java.io.FileNotFoundException;
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

3
4 public class CharStreamCopyTest {
5 public static void main(String[] args){
6 char[] c = new char[128]; int cLen = c.length;
7 // Example use of InputStream methods
8 try (FileReader fr = new FileReader(args[0]);
9 FileWriter fw = new FileWriter(args[1])) {
10 int count = 0;
11 int read = 0;
e to
12
13
while ((read = fr.read(c)) != -1) {
if (read < cLen) fw.write(c, 0, read);
e n s
14 else fw.write(c); Ahora, en lugar de una matriz de
elic
15 count += read; bytes, esta versin utiliza una
a b l
16 } matriz de caracteres.
fe r
17 System.out.println("Wrote: " + count + " characters.");
a n s
18 } catch (FileNotFoundException f) {
o n -tr
an
19 System.out.println("File " + args[0] + " not found.");
20
21
} catch (IOException e) {
s
ha uide
System.out.println("IOException: " + e);
22 }
m tG )
c o n
il
23 }
a d e
gm s Stu
24 }

@ hi y/o sus filiales. Todos los derechos reservados.


vi 2011,e Oracle
t
a r a
Copyright
s
( e m u
v i
Mara
De forma parecida al ejemplo del flujo de bytes, esta aplicacin copia un archivo en otro mediante
una matriz de caracteres en lugar de una matriz de bytes. FileReader y FileWriter son
w i n
clases diseadas para leer y escribir flujos de caracteres, como por ejemplo archivos de texto.
Ed

Programacin Java SE 7 10-13


Cadenas de flujos de E/S
Cadena de flujos de entrada
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Origen
Programa
de datos
Flujo de entrada Flujo de entrada
de archivo en buffer Flujo de entrada
de datos

e to
e n s
el ic
Cadena de flujos de salida
a b l
fe r
a n s
Programa
o n -tr Receptor
de datos
a nFlujo de salida
Flujo de salida
Flujo de salida
h a s d e archivo
de
de datos
m
en buffer
) Gu i
o
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
Los programas muy pocas veces utilizan un nico objeto de flujo. En lugar de ello, encadenan
una serie de flujos para procesar los datos. La primera imagen en la diapositiva muestra un
w i n
ejemplo de un flujo de entrada. En este caso, para que la operacin resulte ms eficiente, se
Ed coloca en el buffer un flujo de archivo que despus se convierte a elementos de datos (datos
primitivos de Java). La segunda imagen muestra un ejemplo de flujo de salida; en este caso,
primero se escriben los datos, luego se colocan en el buffer y, por ltimo, se escriben en un
archivo.

Programacin Java SE 7 10-14


Ejemplo de flujos en cadena

1 import java.io.BufferedReader; import java.io.BufferedWriter;


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

2 import java.io.FileReader; import java.io.FileWriter;


3 import java.io.FileNotFoundException; import java.io.IOException;
4
Una clase FileReader encadenada a una
5 public class BufferedStreamCopyTest { clase BufferedFileReader: esto permite
6 public static void main(String[] args) { usar un mtodo que lea una cadena.
7 try (BufferedReader bufInput
8 = new BufferedReader(new FileReader(args[0]));
9 BufferedWriter bufOutput
10 = new BufferedWriter(new FileWriter(args[1]))) {
e to
11
12
String line = "";
while ((line = bufInput.readLine()) != null) {
e n s
13 bufOutput.write(line); El buffer de caracteres se sustituye por
elic
14 bufOutput.newLine(); String. Observe cmo readLine()
a b l
15 }
fe
utiliza el carcter de nueva lnea como r
16 } catch (FileNotFoundException f) {
a n s
terminador. As pues, deber volver a
17 System.out.println("File not found: " + f);
o -tr
agregarlo al archivo de salida.
n
an
18 } catch (IOException e) {
19
20 }
System.out.println("Exception: " + e);
s
ha uide
21 }
m tG )
c o n
22}
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
M ara
Aqu aparece una vez ms la aplicacin de copia. Esta versin muestra el uso de un objeto
BufferedReader encadenado a la clase FileReader que vio antes.
i n
w El flujo de este programa es el mismo que en el caso anterior. En lugar de leer un buffer de
Ed caracteres, este programa lee tambin una lnea cada vez a travs de la variable de lnea para
mantener el valor String que devuelve el mtodo readLine, lo cual resulta mucho ms
eficiente. El motivo de ello es que cada solicitud de lectura realizada desde un mtodo Reader
hace que se genere una solicitud de lectura para el carcter subyacente o el flujo de bytes. Una
clase BufferedReader lee caracteres desde el flujo a un buffer (aunque el tamao del buffer se
puede establecer, el valor por defecto es generalmente suficiente).

Programacin Java SE 7 10-15


Flujos de procesamiento
Funcionalidad Flujos de caracteres Flujos de bytes
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Almacenamiento en BufferedReader BufferedInputStream


buffer (cadenas) BufferedWriter BufferedOutputStream
Filtrado FilterReader FilterInputStream
FilterWriter FilterOutputStream
Conversin (de InputStreamReader
bytes a caracteres) OutputStreamWriter
e to
Serializacin de ObjectInputStream
e n s
objetos ObjectOutputStream
el ic
a b l
Conversin de datos DataInputStream fe r
a n
DataOutputStream
s
o n -tr
Recuento LineNumberReader
a n
LineNumberInputStream
Consulta hacia PushbackReader ha
s d e
PushbackInputStream
m ) Gu i
adelante o
Impresin PrintWriter
a ilc dent PrintStream
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
( e
i procesamiento
r a
Los flujos v
de realizan conversiones en otros flujos. El tipo de flujo se elige segn la
M a
funcionalidad que se necesite obtener para el flujo final.
w i n
Ed

Programacin Java SE 7 10-16


E/S de la consola

La clase System del paquete java.lang tiene tres campos


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

de instancias estticas: out, in y err.


El campo System.out es una instancia esttica de un
objeto PrintStream que le permite escribir en una salida
estndar.
El campo System.in es una instancia esttica de un
e to
objeto InputStream que le permite leer a partir de una n s
entrada estndar. e l ice
r a bl
El campo System.err es una instancia esttica
n s fede un
objeto PrintStream que le permite escribir
n - traen un error
estndar. no a
a s
h uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
M ara
Sistema de uso de E/S de la consola
System.out es el flujo de salida estndar. Este flujo ya est abierto y listo para aceptar
w i n datos de salida. Generalmente, este flujo corresponde a salida en pantalla o a otro destino
Ed de salida especificado por el entorno host o el usuario.
System.in es el flujo de entrada estndar. Este flujo ya est abierto y listo para
suministrar datos de entrada. Generalmente, este flujo corresponde a entrada del teclado o
a otro origen de entrada especificado por el entorno host o el usuario.
System.err es el flujo de salida de errores estndar. Este flujo ya est abierto y listo para
aceptar datos de salida.
Generalmente, este flujo corresponde a salida en pantalla o a otro destino de salida especificado
por el entorno host o el usuario. La convencin establece que este flujo de salida se utilice para
mostrar mensajes de error u otra informacin que el usuario debe poder ver de manera inmediata,
incluso si el flujo de salida principal, el valor de la variable out, se ha redirigido a un archivo o a
otro destino que generalmente no se supervisa de manera continua.

Programacin Java SE 7 10-17


java.io.Console

Adems de los objetos PrintStream, System tambin puede


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

acceder a una instancia del objeto java.io.Console:


1 Console cons = System.console();
2 if (cons != null) { readPassword no
hace eco de los
3 String userTyped; String pwdTyped; caracteres introducidos
4 do { en la consola.
5 userTyped = cons.readLine("%s", "User name: ");
6 pwdTyped = new String(cons.readPassword("%s", "Password: "));
e to
7 if (userTyped.equals("oracle") && pwdTyped.equals("tiger")) {
e n s
el ic
8 userValid = true;
a b l
9 } else {
fe r
10 s
System.out.println("Wrong user name/password. Try again.\n");
a n
11 }
o n -tr
an
12 } while (!userValid);
13 }
a s e
Tenga en cuenta que deber) h pasaruelidnombre de usuario y
la contrasea para elilproceso com endet G autenticacin.
a d
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
i ( representa la consola basada en caracteres asociada con la mquina JVM
a
El objeto v
arQue una mquina virtual tenga o no una consola depender de la plataforma subyacente y
Console

in M
actual.
w tambin de la forma en la que se invoque a la mquina virtual.
Ed NetBeans, por ejemplo, no utiliza una consola. Para ejecutar el ejemplo en el proyecto
SystemConsoleExample, utilice la lnea de comandos.
Nota: este ejemplo solo pretende ilustrar los mtodos de la clase Console. Deber asegurarse de
que la duracin de los campos userTyped y pwdTyped es lo ms corta posible, as como de
que pasen las credenciales recibidas a algn tipo de servicio de autenticacin. Consulte la API de
Java Authentication and Authorization Service (JAAS) para obtener ms informacin:
http://download.oracle.com/javase/6/docs/technotes/guides/security/jaas/JAASRefGuide.html

Programacin Java SE 7 10-18


Escritura en una salida estndar

Los mtodos println y print forman parte de la clase


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

java.io.PrintStream.
Los mtodos println imprimen el argumento y un
carcter de lnea nueva (\n).
Los mtodos print imprimen el argumento sin un
carcter de lnea nueva. to
Los mtodos print y println se sobrecargan para la cen
se
mayor parte de los tipos primitivos (boolean, char,bint, l e li
long, float y double) y para char[], Object f e ray
String. t r a ns
o n -
an
Los mtodos print(Object) y println(Object)
s
llaman al mtodo toString en hael argumento.
ide ) Gu
o m
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
(ema us
v i
Mtodos
a rade impresin
M
Tenga en cuenta que existe tambin un mtodo de impresin con formato, printf. Este mtodo
winlo ha visto anteriormente en la leccin titulada "Procesamiento de cadenas".
Ed

Programacin Java SE 7 10-19


Lectura a partir de una entrada estndar
1 import java.io.BufferedReader;
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

2 import java.io.IOException;
3 import java.io.InputStreamReader;

4 public class KeyboardInput { Encadenar un lector en buffer


5 public static void main(String[] args) { a un flujo de entrada que toma
la entrada de la consola.
6 try (BufferedReader in =
7 new BufferedReader (new InputStreamReader (System.in))) {
8 String s = "";
e to
9 // Read each input line and echo it to the screen.
e n s
10 while (s != null) {
elic
11 System.out.print("Type xyz to exit: ");
a b l
12 s = in.readLine().trim();
fe r
13 System.out.println("Read: " + s);
a n s
14 if (s.equals ("xyz")) System.exit(0);
o n -tr
an
15 }
16 } catch (IOException e) { s
ha uide
17 System.out.println ("Exception: " + e);
m tG )
18 }
c o n
19} a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
La sentencia try-with-resources en la lnea 6 abre BufferedReader, el cual est encadenado a

i n M
un InputStreamReader, que a su vez est encadenado a la entrada de la consola estndar
esttica System.in.
w
Ed Si la lectura de la cadena es igual a xyz, entonces el programa se cerrar. El propsito del
mtodo trim() en la cadena devuelta por in.readLine es eliminar todos los caracteres de
espacio en blanco.

Programacin Java SE 7 10-20


E/S de canal

Introducidos en JDK 1.4, los canales leen bytes y caracteres


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

en bloques, en lugar de un byte o un carcter cada vez.


1 import java.io.FileInputStream; import java.io.FileOutputStream;
2 import java.nio.channels.FileChannel; import java.nio.ByteBuffer;
3 import java.io.FileNotFoundException; import java.io.IOException;
4
5 public class ByteChannelCopyTest {
6 public static void main(String[] args) {
e to
7
8
try (FileChannel fcIn = new FileInputStream(args[0]).getChannel();
FileChannel fcOut = new FileOutputStream(args[1]).getChannel()) {
e n s
9 ByteBuffer buff = ByteBuffer.allocate((int) fcIn.size());
elic
10 fcIn.read(buff);
a b l
11 buff.position(0);
Crear un buffer con el mismo
tamao que el tamao del archivo yfe r
12 fcOut.write(buff);
a n s
despus leer y escribir el archivo en
13 } catch (FileNotFoundException f) { una sola operacin.
o n -tr
an
14 System.out.println("File not found: " + f);
15
16
} catch (IOException e) {
System.out.println("IOException: " + e); s
ha uide
17 }
m tG )
c o n
il
18 }
a d e
gm s Stu
19 }

@ hi y/o sus filiales. Todos los derechos reservados.


vi 2011,e Oracle
t
a r a
Copyright
s
( e m u
v i
M ara
En este ejemplo, se puede leer un archivo completo en un buffer y despus escribirlo en una sola
operacin.
i n
w La E/S de canal se introdujo en el paquete java.nio en JDK 1.4.
Ed

Programacin Java SE 7 10-21


Visin general de la prctica 10-1:
Escritura de una aplicacin simple
de E/S de la consola
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica, se abordan los siguientes temas:


Escritura de una clase principal que acepte un nombre de
archivo como argumento.
Uso de la E/S de la consola System para leer una cadena
de bsqueda. e to
n s
Uso del encadenamiento de flujos para utilizar el mtodo lice
adecuado para buscar la cadena en el archivo e informar a b le
sobre el nmero de incidencias. s f er
Continuacin de la lectura desde la consola - t r an
n o n
hasta que se introduzca una secuencia
a
a s
de cierre. ) h uide m tG
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
En esta prctica, escribir el cdigo necesario para leer un nombre de archivo como un
argumento de aplicacin y utilizar la consola System para leer a partir de una entrada estndar
w i n
hasta que se introduzca un carcter de terminacin.
Ed

Programacin Java SE 7 10-22


Persistencia
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Guardar datos en algn tipo de almacenamiento permanente


se conoce como "persistencia". Los objetos que pueden ser
persistentes se pueden almacenar en un disco (o en otro
dispositivo de almacenamiento), o se pueden enviar a otra
mquina para almacenarse all.
Los objetos no persistentes solo existen mientras se est to
ejecutando la mquina Java Virtual Machine. n s e
La serializacin de Java es el mecanismo estndar para e l ice
r a bl
guardar un objeto como secuencia de bytes que fdespus
e
n s
n - tra
se puede reconstruir en una copia del objeto.
o
Para serializar un objeto de una clasenespecfica, la clase
a
has de
debe implantar la interfaz java.io.Serializable.
) Gui
o m
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
La interfaz java.io.Serializable no define ningn mtodo, y sirve solo como marcador para

i n M
indicar que la clase ha de tenerse en cuenta para una posible serializacin.
w
Ed

Programacin Java SE 7 10-23


Serializacin y grficos de objetos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Cuando se serializa un objeto, solo se conservan los


campos del objeto.
Cuando un campo hace referencia a un objeto, los
campos del objeto al que se hace referencia se serializan
tambin si la clase del objeto es igualmente serializable.
El rbol de los campos de un objeto constituye el grfico
e to
del objeto. e n s
elic
a b l
A fe r
a n s
o n -tr
B C
s an
) ha uide
D om GD
c n t
m ail tude
@ g sS
a i
Copyright
r t hi y/o sus filiales. Todos los derechos reservados.
v 2011,e Oracle
m a u s
i ( e
v
ara
Grficos de objetos
Mserializacin recorre el grfico del objeto y escribe esos datos en el archivo (o en otro flujo de
La
i n
w salida) para cada nodo del grfico.
Ed

Programacin Java SE 7 10-24


Campos y objetos transitorios

Algunas clases de objetos no son serializables, ya que


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

representan informacin transitoria especfica del sistema


operativo.
Si el grfico del objeto contiene una referencia no
serializable, se devuelve NotSerializableException
y la operacin de serializacin falla.
Los campos que no deben serializarse o que no necesitan e to
n s
hacerlo, se pueden marcar con la palabra clave
e l ice
l
transient. rab e
A
a n sf
n -tr
o
B C
s an
) ha uide
D om GD
c n t
m ail tude
@ g sS
a i
Copyright
r t hi y/o sus filiales. Todos los derechos reservados.
v 2011,e Oracle
m a u s
i ( e
v
SiM
ara
Transient
se encuentra un campo que contienen una referencia a un objeto y no se ha marcado como
i n
w serializable (se implanta java.io.Serializable), se devuelve NotSerializableException
Ed y la operacin de serializacin falla por completo. Para serializar un grfico con campos que hacen
referencia a objetos que no son serializables, estos campos deben marcarse con la palabra clave
transient.

Programacin Java SE 7 10-25


Transient: ejemplo

public class Portfolio implements Serializable {


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public transient FileInputStream inputFile;


public static int BASE = 100; Los campos static
no se serializan.
private transient int totalValue = 10;
protected Stock[] stocks; La serializacin incluir todos los
miembros de la matriz stocks.
}
El modificador de acceso del campo no afecta a los datos e to
que se vayan a serializar. e n s
el ic
Los valores almacenados en campos estticos no se a b l
r
serializan. sfe an
Cuando se anula la serializacin del objeto, n tr valores de los
-los
o
campos estticos se establecen en los
s a nvalores
declarados en
a e
) htransitorios
la clase. El valor de los campos id no estticos se
m
establece en el valor porcdefecto
u
G el tipo.
o tpara
il den
a
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
Cuando se anula la serializacin de un objeto, los valores de los campos transitorios estticos se
establecen en los valores definidos en la declaracin de la clase. Los valores de los campos no
w i n
estticos se establecen en el valor por defecto para su tipo. As, en el ejemplo de la diapositiva, el
Ed valor de BASE ser 100, por la declaracin de la clase. Los campos transitorios no estticos,
inputFile y totalValue, se definen en su valor por defecto, null y 0 respectivamente.

Programacin Java SE 7 10-26


UID de versin de serializacin
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Durante el proceso de serializacin se usa un nmero de


versin, serialVersionUID, para asociar la salida serializada
con la clase empleada en el proceso de serializacin.
Al anular la serializacin, se comprueba el valor de
serialVersionUID para verificar que las clases cargadas son
compatibles con el objeto cuya serializacin se est
anulando. e to
n s
Si el receptor de un objeto serializado ha cargado clases para
e l ice
ese objeto con serialVersionUID diferentes, la anulacin a l la
bde
e r
serializacin resultar en InvalidClassException.nsf tra
n -
Una clase serializable puede declarar suopropio
serialVersionUID declarando de forma
s a nexplcita
un campo
h a
llamado serialVersionUID) como final d e
i esttico y tipo long:
o m G u
private static long ent
ilc serialVersionUID = 42L;
g ma Stud
a v i@
Copyright t h isy/o sus filiales. Todos los derechos reservados.
2011, Oracle
r
e ma use
a v i(
Nota: la documentacin de java.io.Serializable indica lo siguiente:
r
aSi una clase serializable no declara explcitamente un valor serialVersionUID, entonces el
n M
wi tiempo de ejecucin de la serializacin calcular el valor serialVersionUID por defecto para
Ed esa clase de acuerdo con distintos aspectos de la clase, tal y como se describe en la
especificacin de serializacin de objetos de Java(TM). No obstante, se recomienda
encarecidamente que todas las clases serializables declaren explcitamente valores
serialVersionUID, ya que el clculo por defecto de serialVersionUID es muy sensible a
detalles de clase que pueden variar dependiendo de las implantaciones del compilador, y
por lo tanto pueden resultar en excepciones InvalidClassException no esperadas durante la
anulacin de la serializacin. As pues, para garantizar un valor serialVersionUID uniforme
en diferentes implantaciones del compilador de Java, es necesario que una clase
serializable declare un valor serialVersionUID explcito. Tambin se recomienda
encarecidamente utilizar el modificador private en las declaraciones serialVersionUID
explcitas siempre que sea posible, ya que este tipo de declaraciones se aplica solo a la
clase que declara de forma inmediata. Los campos serialVersionUID no son tiles como
miembros heredados. Las clases de matriz no pueden declarar un valor serialVersionUID
explcito, por lo que siempre llevan el valor calculado por defecto; el requisito de
coincidencia entre los valores serialVersionUID no se aplica en las clases de matriz.

Programacin Java SE 7 10-27


Ejemplo de serializacin
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En este ejemplo hay una cartera de valores constituida por un


juego de acciones.
Durante la serializacin, el precio actual no se serializa,
por lo que se marca como transient.
No obstante, queremos que el valor actual de las acciones
se establezca en el valor de mercado actual al anular la
serializacin. e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 10-28


Escritura y lectura de un flujo de objetos
1 public static void main(String[] args) {
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

2 Stock s1 = new Stock("ORCL", 100, 32.50);


3 Stock s2 = new Stock("APPL", 100, 245); Portfolio es el objeto raz.
4 Stock s3 = new Stock("GOGL", 100, 54.67);
5 Portfolio p = new Portfolio(s1, s2, s3);
6 try (FileOutputStream fos = new FileOutputStream(args[0]);
7 ObjectOutputStream out = new ObjectOutputStream(fos)) {
8 out.writeObject(p); El mtodo writeObject escribe el grfico
de objeto de p en el flujo de archivo. e to
9 } catch (IOException i) {
e n s
10 System.out.println("Exception writing out Portfolio: " + i);
el ic
11 }
a b l
fe r
12 try (FileInputStream fis = new FileInputStream(args[0]);
a n s
13 ObjectInputStream in = new ObjectInputStream(fis)) {
o n -tr El mtodo readObject
a n i) { restaura
14 Portfolio newP = (Portfolio)in.readObject();
el objeto desde el
15 } catch (ClassNotFoundException | IOException
a s e flujo de archivo.

m ) hreading u idin Portfolio: " + i);


co ent G
16 System.out.println("Exception
17 }
i l
g ma Stud
a v i@
Copyright t h isy/o sus filiales. Todos los derechos reservados.
2011, Oracle

m ar use
v i (e
ara
La clase SerializeStock.

in M
Lnea 6 8: una clase FileOutputStream aparece encadenada a una clase
w ObjectOutputStream. Esto permite escribir los bytes no procesados generados por
Ed ObjectOutputStream en un archivo a travs del mtodo writeObject. Este mtodo
recorre el grfico del objeto y escribe los datos de los campos no transitorios y no estticos
como bytes no procesados.
Lnea 12 14: para restaurar un objeto desde un archivo, hay una clase
FileInputStream encadenada con una clase ObjectInputStream. Los bytes no
procesados que lee el mtodo readObject restauran un Object con los campos de datos
no estticos y transitorios. Este valor Object debe convertirse al tipo esperado.

Programacin Java SE 7 10-29


Mtodos de serializacin

Los objetos que se estn serializando (o se est anulando su


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

serializacin) pueden controlar la serializacin de sus propios campos.


public class MyClass implements Serializable {
// Fields
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject();
Llamada a defaultWriteObject
// Write/save additional fields para serializar los campos de estas
oos.writeObject(new java.util.Date()); clases.
e to
}
e n s
lic
}

Por ejemplo, en esta clase la hora actual se escribe en el grfico


a b le
del objeto.
s f er
t
Durante la anulacin de la serializacin se invoca
- r aan un mtodo
similar: non a
private void readObject(ObjectInputStream ois) throws a s
h uide
ClassNotFoundException, IOException {}
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Se invoca al mtodo writeObject en el objeto que se est serializando. Si el objeto no contiene

i n M
este mtodo, se invoca en su lugar al mtodo defaultWriteObject.
w Tambin se puede llamar a este mtodo solo una vez desde el mtodo del objeto
Ed writeObject.
Durante la anulacin de la serializacin, se invoca al mtodo readObject en el objeto cuya
serializacin se est anulando (si est presente el archivo de clase del objeto). La firma del
mtodo es importante.
private void readObject(ObjectInputStream ois) throws
ClassNotFoundException, IOException {
ois.defaultReadObject();
// Print the date this object was serialized
System.out.println ("Restored from date: " +
(java.util.Date)ois.readObject()));
}

Programacin Java SE 7 10-30


Ejemplo de readObject
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

1 public class Stock implements Serializable {


2 private static final long serialVersionUID = 100L;
3 private String symbol;
4 private int shares;
5 private double purchasePrice;
6 private transient double currPrice;
7
8 public Stock(String symbol, int shares, double purchasePrice) {
9 this.symbol = symbol;
10 this.shares = shares;
e to
11 this.purchasePrice = purchasePrice; El valor currPrice de las acciones lo
e n s
12 setStockPrice(); establece el mtodo setStockPrice
elic
13 } al crear el objeto Stock, pero no se
a b l
14 llama al constructor durante la
fe r
15 // This method is called post-serialization anulacin de la serializacin.
a n s
16
17
private void readObject(ObjectInputStream ois)

o
throws IOException, ClassNotFoundException { n -tr
18 ois.defaultReadObject();
an
El valor currPrice de las
s
19
20
// perform other initialization
setStockPrice(); ) ha uide
acciones se establece despus de
que se anule la serializacin de

c o m tG los otros campos.


21
22 }
}

a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
En la clase Stock se proporciona el mtodo readObject para garantizar que el valor

i n M
currPrice de las acciones se establezca (mediante el mtodo setStockPrice) despus de
w anular la serializacin del objeto Stock.
Ed Nota: la firma del mtodo readObject es fundamental para llamar a este mtodo durante la
anulacin de la serializacin.

Programacin Java SE 7 10-31


Resumen
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta leccin, debe haber aprendido a hacer lo siguiente:


Describir los aspectos bsicos de entrada y salida en Java
Leer datos de la consola y escribir datos en ella
Utilizar flujos para leer y escribir datos
Leer y escribir objetos mediante serializacin
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 10-32


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

El objetivo de encadenar flujos es:


a. Permitir a los flujos agregar funcionalidad
b. Cambiar la direccin del flujo
c. Modificar el acceso del flujo
d. Cumplir con los requisitos de JDK 7
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 10-33


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Para evitar que se serialicen campos especficos del sistema


operativo, deber marcar el campo como:
a. private
b. static
c. transient
d. final e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 10-34


Prueba

Dados los siguientes fragmentos:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public MyClass implements Serializable {


private String name;
private static int id = 10;
private transient String keyword;
public MyClass(String name, String keyword) {
this.name = name; this.keyword = keyword;
}
}

e to
MyClass mc = new MyClass ("Zim", "xyzzy");
e n s
Suponiendo que no se hacen ms cambios en los datos, cul eseel lic
valor de los campos name y keyword despus de anular la rab
l
serializacin de la instancia de objeto mc? n s fe
a. Zim, "" n - tra
b. Zim, null a no
h a s de
c. Zim, xyzzy
m ) Gui
o
d. "", null ilc ent
g ma Stud
a v i@
Copyright t h isy/o sus filiales. Todos los derechos reservados.
2011, Oracle
r
e ma use
a v i(
a r
i n M
w
Ed

Programacin Java SE 7 10-35


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Dados los siguientes fragmentos:


1 public class MyClass implements Serializable {
2 private transient String keyword;
3 public void readObject(ObjectInputStream ois)
4 throws IOException, ClassNotFoundException {
5 ois.defaultReadObject();
6 String this.keyword = (String)ois.readObject();
7 }
e to
8 }
e n s
Qu hace falta para anular correctamente la serializacin lde li c
b e
un flujo que contenga este objeto? e r a
a n sf
a. Hacer el campo keyword static -tr
b. Cambiar el modificador de acceso a o n
dencampo a public
c. Hacer el mtodo readObject h a s d e (lnea 3)
m ) Gu i
private
o t
d. Usar readString en ilc de
lugar enreadObject (lnea 6)
g ma Stud
a v i@
Copyright t h isy/o sus filiales. Todos los derechos reservados.
2011, Oracle
r
e ma use
a v i(
a r
i n M
w
Ed

Programacin Java SE 7 10-36


Visin general de la prctica 10-2:
Serializacin y anulacin de la
serializacin de ShoppingCart
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica, se abordan los siguientes temas:


Creacin de una aplicacin que serialice un objeto
ShoppingCart compuesto de una ArrayList de
objetos Item.
Uso de la palabra clave transient para evitar la
serializacin del total de ShoppingCart. Esto permitir e to
e n s
que los elementos puedan variar de precio. lic
Uso del mtodo writeObject para almacenar rable
la fecha actual en el flujo serializado. n s fe
Uso del mtodo readObject para n - tra
volver a calcular el coste del carro a no
tras
h
anular la serializacin e imprimir a sla fecha
d e
m ) Gu i
c o
en la que el objeto se serializ.
nt
m ail tude
@ g sS
a i
Copyright
r t hi y/o sus filiales. Todos los derechos reservados.
v 2011,e Oracle
e ma us
a v i(
a r
i n M
w
Ed

Programacin Java SE 7 10-37


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Ed
w i n M
ara
v i
( e m a r a
u
@
s
a
vi e thi
il c o
gm s Stu
d
)
e n
s
m tG
o
ha uide
an
tr n -
a n s fe
r
a b l el
ic
e n s e
to
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

E/S de archivos Java (NIO.2)

e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
Objetivos

Al finalizar esta leccin, debera estar capacitado para:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Utilizar la interfaz Path para realizar operaciones en


archivos y en rutas de acceso a directorios
Utilizar la clase Files para comprobar, suprimir, copiar o
mover un archivo o un directorio
Utilizar mtodos de la clase Files para leer y escribir
archivos mediante E/S de canales o E/S de flujos e to
n s
Leer y cambiar atributos de archivos y de directorios
e l ice
Acceder de forma recurrente al rbol de un directorio r a bl
Localizar un archivo a travs de la clase n s fe
a
PathMatcher n-tr no
a
s de
h
) Gui a
o m
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 11-2


Nueva API de E/S de archivos Java (NIO.2)
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

e to
Interfaz de sistema de archivos mejorada
e n s
elic
b l
Funcionalidad total socket-canal
f e ra
t r a ns
o
E/S asncronan - escalable
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
La API NIO en JSR 51 instaur la base para usar NIO en Java, centrndose en buffers, canales y
juegos de caracteres. JSR 51 proporcion la primera opcin de E/S de socket escalable en la
w i n
plataforma con una API de E/S no bloqueante y multiplexada que permiti desarrollar servidores
Ed muy escalables sin tener que recurrir a cdigo nativo.
Para muchos desarrolladores, el objetivo ms importante de JSR 203 es abordar problemas con
java.io.File a travs del desarrollo de una nueva interfaz de sistema de archivos.
La nueva API:
Funciona de manera ms consistente entre una plataforma y otra.
Facilita la escritura de programas que manejan fluidamente los fallos de las operaciones del
sistema de archivos.
Proporciona un acceso ms eficiente a un juego ms amplio de atributos.
Permite a los desarrolladores de aplicaciones sofisticadas aprovechar funciones propias de
la plataforma cuando sea indispensable.
Permite soportar sistemas de archivos no nativos para conectarlos a la plataforma.

Programacin Java SE 7 11-3


Limitaciones de java.io.File
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

No funciona bien con enlaces simblicos

Problemas de escalabilidad

e to
e n s
elic
a b l
Juego de atributos de
Problemas de rendimiento
fe r
archivo muy limitado
a n s
o n -tr
a n
Funcionalidad de accesoaa sistemas
h s d e
de archivosm muy ) bsica u i
o t G
a ilc den
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
La API de archivos de E/S Java (java.io.File) presentaba bastantes retos a los

i n M
desarrolladores.
w Muchos mtodos no devolvan excepciones al fallar, por lo que resultaba imposible obtener
Ed un mensaje de error til.
Faltaban varias operaciones (copia de archivo, desplazamiento, etc.).
El mtodo de cambio de nombre no funcionaba consistentemente de una plataforma a otra.
No exista soporte real para enlaces simblicos.
Interesaba contar con ms soporte para metadatos, como permisos de archivo, propietario
de archivo y otros atributos de seguridad.
El acceso a los metadatos no funcionaba de forma eficaz: cada llamada a metadatos
resultaba en una llamada del sistema, lo cual haca que el funcionamiento de las
operaciones fuera muy ineficaz.
Muchos de los mtodos de archivo no escalaban. Si se solicitaba una lista de directorios de
gran tamao en un servidor, poda colgarse el sistema.
No era posible escribir cdigo fiable que recorriera un rbol de archivos de forma recurrente
y respondiera correctamente si haba enlaces simblicos circulares.
Adems, la E/S global no se escriba de manera que pudiera ampliarse. Los desarrolladores
pidieron poder desarrollar sus propias implantaciones de sistemas de archivos. Por ejemplo,
guardando un pseudoarchivo en memoria o aplicando formato zip a archivos.
Programacin Java SE 7 11-4
Sistemas de archivos, rutas y archivos
En NIO.2, los archivos y los directorios se representan a travs
de una ruta, que es la ubicacin relativa o absoluta del archivo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

o del directorio.
nodo raz:
/ (Solaris)
C:\ (Windows)

e to
labs Documents and Settings e n s
el ic
a b l
fe r
a n s
Admin student
o n -tr
s an
) ha uide
o m tG
finance.xls
c logfile.txt
i l e n
g ma Stud
a v i@
Copyright t h isy/o sus filiales. Todos los derechos reservados.
2011, Oracle

m ar use
v i (e
ara
Sistemas de archivos
M de implantarse NIO.2 en JDK 7, los archivos se representaban mediante la clase
Antes
i n
w java.io.File.
Ed En NIO.2, las instancias de los objetos java.nio.file.Path se utilizan para representar la
ubicacin relativa o absoluta de un archivo o un directorio.
Los sistemas de archivos son estructuras jerrquicas (de rbol). Los sistemas de archivos pueden
tener uno o ms directorios raz. Por ejemplo, una mquina tpica Windows tendr dos nodos raz
de disco como mnimo: C:\ y D:\.
Tenga en cuenta que los sistemas de archivos tienen tambin sus propias caractersticas en
cuanto a separadores de rutas, tal y como se ve en la diapositiva.

Programacin Java SE 7 11-5


Ruta de acceso relativa frente a
ruta de acceso absoluta
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Las rutas de acceso pueden ser relativas o absolutas.


Las rutas de acceso absolutas contienen el elemento raz
y la lista completa del directorio para localizar el archivo.
Ejemplo:
...
/home/peter/statusReport
e to
...
e n s
elic
a b l
Una ruta de acceso relativa debe combinarse coneotrar ruta
s f
para poder acceder a un archivo.
- t r an
Ejemplo: non a
... a s
h uide
clarence/foo
m tG )
c o n
...
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
Las rutas pueden ser relativas o absolutas. Las rutas de acceso absolutas contienen el elemento
raz y la lista completa del directorio para localizar el archivo. Por ejemplo,
w i n
/home/peter/statusReport es una ruta absoluta. Toda la informacin necesaria para
Ed localizar el archivo se encuentra en la cadena de la ruta.
Una ruta de acceso relativa debe combinarse con otra ruta para poder acceder a un archivo. Por
ejemplo, clarence/foo es una ruta relativa. Sin ms informacin, los programas no podrn
localizar con fiabilidad el directorio clarence/foo dentro del sistema de archivos.

Programacin Java SE 7 11-6


Enlaces simblicos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

/ (raz Solaris) dir


o
C:\ (raz Windows)

logs
home

e to
clarence peter logFile (archivo)
homeLogFile
e n s
(archivo)
elic
a b l
foo fe r
a n s
o n -tr
bar statusReport (archivo)
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
Los objetos del sistema de archivos son generalmente directorios o archivos. Todos los usuarios
estn familiarizados con estos objetos. Pero algunos sistemas de archivos soportan la nocin de
w i n
enlaces simblicos. Los enlaces simblicos se conocen tambin como symlinks o enlaces
Ed lgicos.
El enlace simblico es un archivo especial que sirve como referencia a otro archivo. Los enlaces
simblicos generalmente son transparentes para el usuario. Leer o escribir un enlace simblico es
lo mismo que leer o escribir en otro archivo o directorio.
En el diagrama de la diapositiva, logFile aparece ante el usuario como un archivo normal, pero
en realidad es un enlace simblico a dir/logs/HomeLogFile. HomeLogFile es el destino del
enlace.

Programacin Java SE 7 11-7


Conceptos de Java NIO.2

Antes de JDK 7, la clase java.io.File era el punto de


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

entrada para todas las operaciones de archivo o de directorio.


NIO.2 introduce un nuevo paquete y nuevas clases:
java.nio.file.Path: localiza un archivo o un
directorio mediante una ruta de acceso dependiente del
sistema.
java.nio.file.Files: realiza operaciones en archivos e to
n s
y en directorios a travs de una interfaz Path.
e l ice
java.nio.file.FileSystem: proporciona una rinterfaz a bl
hacia un sistema de archivos y una fbrica para s e un
fcrear
a n
objeto Path y otros objetos que acceden n atrun sistema de
-
archivos. a no
h a s de
Todos los mtodos que acceden
m ) G al u i
sistema de archivos
o
devuelven IOException ent subclase.
ilc o una
g ma Stud
a v i@
Copyright t h isy/o sus filiales. Todos los derechos reservados.
2011, Oracle
r
(e ma use
v i
ra
Java NIO.2
a
M
inUna diferencia significativa entre NIO.2 y java.io.File es la arquitectura de acceso al sistema
w de archivos. Con la clase java.io.File, los mtodos utilizados para manipular la informacin
Ed de ruta estn en la misma clase que los mtodos utilizados para leer y escribir archivos y
directorios.
En NIO.2, los dos mtodos van aparte. Las rutas se crean y manipulan mediante la interfaz Path,
mientras que las operaciones en los archivos y los directorios recaen en la clase Files, la cual
trabaja solo con objetos Path.
Por ltimo, al contrario que java.io.File, los mtodos de clase de archivos que operan
directamente en el sistema de archivos devuelven IOException (o una subclase). Las
subclases proporcionan detalles sobre la causa de la excepcin.

Programacin Java SE 7 11-8


Interfaz Path
La interfaz java.nio.file.Path proporciona el punto de
entrada para manipular archivos y directorios en NIO.2.
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Para obtener un objeto Path, deber obtener una


instancia del sistema de archivos por defecto y despus
invocar al mtodo getPath:
Barra diagonal inversa con escape
FileSystem fs = FileSystems.getDefault();
Path p1 = fs.getPath ("D:\\labs\\resources\\myFile.txt");
e to
e n s
El paquete java.nio.file proporciona tambin unale lic
clase helper final esttica llamada Paths para realizar
r a b la
sf e
accin getDefault: r a n
o n -t
a n "myFile.txt");
Path p1 = Paths.get ("D:\\labs\\resources\\myFile.txt");
Path p2 = Paths.get ("D:", "labs", "resources", s
ha uide
Path p3 = Paths.get ("/temp/foo"); )
m("file:///~/somefile");
Path p4 = Paths.get (URI.create
i l c o
e n tG
g ma Stud
a v i@
Copyright t h isy/o sus filiales. Todos los derechos reservados.
2011, Oracle

m ar use
v i (e
El punto
a r ade entrada para directorios y archivos de NIO.2 es una instancia de la interfaz Path. El

in M
proveedor (en este caso el proveedor por defecto) crea un objeto que implanta esta clase y
w maneja todas las operaciones realizadas en un archivo o un directorio dentro de un sistema de
Ed archivos.
Los objetos Path son inmutables. Una vez se crean, ya no se pueden cambiar.
Tenga en cuenta que, si planea utilizar el sistema de archivos por defecto, es decir, el sistema de
archivos en el que se est ejecutando JVM para las operaciones Path, la utilidad Paths es el
mtodo ms corto. No obstante, si quisiera realizar operaciones Path en un sistema de archivos
diferente al sistema por defecto, obtendra una instancia del sistema de archivos deseado y usara
el primer modo de creacin de objetos Path.
Nota: el sistema de archivos de Windows utiliza una barra diagonal inversa por defecto. No
obstante, Windows acepta tanto barras diagonales normales como inversas en las aplicaciones
(excepto en el shell de comandos). Las barras diagonales inversas en Java deben llevar carcter
de escape. Para poder representar una barra diagonal inversa en una cadena, es necesario
introducirla dos veces. Como se ve feo y los usuarios de Windows usan barras diagonales tanto
normales como inversas, los ejemplos que se incluyen en este curso usarn la barra diagonal
normal en las cadenas.

Programacin Java SE 7 11-9


Caractersticas de la interfaz Path

La interfaz Path define los mtodos utilizados para localizar un


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

archivo o un directorio en un sistema de archivos. Estos


mtodos incluyen:
Para acceder a los componentes de una ruta:
getFileName, getParent, getRoot y getNameCount
Para realizar operaciones en una ruta: e to
normalize, toUri, toAbsolutePath, subpath, e n s
resolve y relativize elic
a b l
Para comparar rutas: fe r
a n s
startsWith, endsWith y equals
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Los objetos Path son como objetos String
Mms prctico es pensar en los objetos Path como si fueran objetos String. Los objetos Path
Lo
i n
w se pueden crear a partir de una sola cadena de texto o a partir de un juego de componentes:
Ed Un componente raz, el cual identifica la jerarqua del sistema de archivos.
Un elemento de nombre, el ms alejado del elemento raz, que define el archivo o el
directorio al que apunta la ruta.
Tambin puede haber otros elementos separados por un carcter especial o un delimitador
que identifiquen los nombres de los directorios que forman parte de la jerarqua.
Los objetos Path son inmutables. Una vez creados, las operaciones que se realicen en los
objetos Path devolvern nuevos objetos Path.

Programacin Java SE 7 11-10


Path: ejemplo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

1 public class PathTest


2 public static void main(String[] args) {
3 Path p1 = Paths.get(args[0]);
4 System.out.format("getFileName: %s%n", p1.getFileName());
5 System.out.format("getParent: %s%n", p1.getParent());
6 System.out.format("getNameCount: %d%n", p1.getNameCount());
7 System.out.format("getRoot: %s%n", p1.getRoot());
8 System.out.format("isAbsolute: %b%n", p1.isAbsolute());
9 System.out.format("toAbsolutePath: %s%n", p1.toAbsolutePath());
10 System.out.format("toURI: %s%n", p1.toUri());
e to
11 }
e n s
12 }
elic
a b l
java PathTest D:/Temp/Foo/file1.txt
fe r
getFileName: file1.txt
a s
Ejecutado en un equipo Windows.
n
Observe que, excepto en un shell cmd,
getParent: D:\Temp\Foo
getNameCount: 3
o n -tr
se pueden usar barras diagonales
normales e inversas.
getRoot: D:\
s an
isAbsolute: false
toAbsolutePath: D:\Temp\Foo\file1.txt ) ha uide
c o m tG
toURI: file:///D:/Temp/Foo/file1.txt

a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Al contrario de lo que ocurre con las clases java.io.File, los archivos y los directorios se

i n M
representan a travs de instancias de objetos Path de manera dependiente del sistema.
w La interfaz Path ofrece varios mtodos para proporcionar informacin sobre la ruta:
Ed Path getFileName: el punto final de esta interfaz Path, devuelto como un objeto Path.
Path getParent: la ruta principal o una nula. Todo lo incluido en la ruta hasta el nombre
del archivo (archivo o directorio).
int getNameCount: el nmero de elementos de nombre que conforman esta ruta.
Path getRoot: el componente raz de esta interfaz Path.
boolean isAbsolute: true si la ruta contiene un elemento raz dependiente del sistema.
Nota: puesto que este ejemplo se ejecuta en una mquina Windows, el elemento raz
dependiente del sistema contiene la letra de la unidad y un signo de dos puntos. En
sistemas operativos basados en UNIX, isAbsolute devuelve true en cualquier ruta que
empiece por una barra diagonal.
Path toAbsolutePath: devuelve una ruta que representa la ruta absoluta para esta ruta
de acceso.
java.net.URI toUri: devuelve una URI absoluta.
Nota: los objetos Path pueden crearse para cualquier ruta. No es necesario que exista el archivo
o el directorio real.

Programacin Java SE 7 11-11


Eliminacin de redundancias de Path
Muchos sistemas de archivos utilizan una notacin .
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

para denotar el directorio actual y .. para denotar el


directorio principal.
Los dos ejemplos siguientes incluyen redundancias:
/home/./clarence/foo
/home/peter/../clarence/foo

El mtodo normalize elimina los elementos e to


n s
redundantes, entre ellos todas las incidencias de . o de lice
e
directory/... abl fe r
Ejemplo: a n s
o n -tr
an
Path p = Paths.get("/home/peter/../clarence/foo");
Path normalizedPath = p.normalize();
s
ha uide
m tG )
/home/clarence/foo
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
i ( de archivos utilizan una notacin . para denotar el directorio actual y ..
Muchos a v
sistemas
r el directorio principal. Es posible que se produzca una situacin en la que
M
paraadenotar
winPath contenga informacin redundante sobre el directorio. Puede que el servidor est
Ed configurado para guardar sus archivos log en el directorio /dir/logs/., y que desee eliminar
la notacin /. final de la ruta.
El mtodo normalize elimina todos los elementos redundantes, entre ellos todas las
incidencias de . o de directory/... Los ejemplos de la diapositiva se normalizaran en
/home/clarence/foo.
Es importante tener presente que normalize no comprueba el sistema de archivos cuando
limpia una ruta. Se trata de una operacin puramente sintctica. En el segundo ejemplo, si peter
fuera un enlace simblico, al eliminar peter/.. podra ocurrir que una ruta dejara de poder
localizar el archivo buscado.

Programacin Java SE 7 11-12


Creacin de una subruta
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Se puede obtener una parte de una ruta creando una


subruta con el mtodo subpath:
Path subpath(int beginIndex, int endIndex);
El elemento que devuelve endIndex es uno menos que
el valor endIndex. Temp = 0
foo =1
Ejemplo: bar =2
e to
e n s
Path p1 = Paths.get ("D:/Temp/foo/bar");
elic
Path p2 = p1.subpath (1, 3);
a b l
fe r
a n s
-tr
foo\bar

o n
Incluir el elemento en el n
s a ndice 2.
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ElM
ara
El nombre de elemento ms prximo a la raz tiene el ndice 0.
elemento ms lejos de la raz tiene el ndice count-1.
i n
w Nota: el objeto Path devuelto tiene los elementos que empiezan por beginIndex y se ampla al
Ed elemento en el ndice endIndex-1.

Programacin Java SE 7 11-13


Unin de dos rutas

El mtodo resolve se utiliza para combinar dos rutas.


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Ejemplo:
Path p1 = Paths.get("/home/clarence/foo");
p1.resolve("bar"); // Returns /home/clarence/foo/bar

Al pasar una ruta absoluta al mtodo resolve se


devuelve la ruta de acceso transferida. e to
e n s
Paths.get("foo").resolve("/home/clarence"); // Returns /home/clarence
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
El mtodo resolve se utiliza para combinar rutas. Este mtodo acepta una ruta de acceso

i n M
parcial, que es una ruta que no incluye un elemento raz, y esa ruta parcial se anexa a la ruta
w original.
Ed

Programacin Java SE 7 11-14


Creacin de una ruta entre dos rutas

El mtodo relativize le permite construir una ruta


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

desde una ubicacin del sistema de archivos a otra


ubicacin.
El mtodo construye una ruta que empieza en la ruta
original y termina en la ubicacin especificada por la ruta
transferida. to
La nueva ruta es relativa a la ruta original. n s e
e l ice
Ejemplo: bl ra
f e
Path p1 = Paths.get("peter"); ns tra
Path p2 = Paths.get("clarence");
n -
Path p1Top2 = p1.relativize(p2); a
// Result niso ../clarence
Path p2Top1 = p2.relativize(p1);
h s dise../peter
//aResult
m ) Gui
o
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
( e
i comn
a v
Un requisito
r al escribir cdigo de E/S de archivo es la capacidad de construir una ruta
a
M una ubicacin
desde en el sistema de archivos a otra ubicacin. Esto se consigue con el mtodo
winrelativize. Este mtodo construye una ruta que empieza en la ruta original y termina en la
Ed ubicacin especificada por la ruta transferida. La nueva ruta es relativa a la ruta original.

Programacin Java SE 7 11-15


Trabajo con enlaces
La interfaz Path reconoce enlaces.
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Todos los mtodos Path:


detectan qu hacer al encontrarse un enlace simblico; o
proporcionan una opcin que permite configurar el
comportamiento en caso de encontrarse un enlace
simblico.

e to
createSymbolicLink(Path, Path, FileAttribute<?>)
e n s
blicos el ic
Creacin de enlaces sim a b l
fe r
a n s
createLink(Path, Path) isSymbolicLink(Path)
o n -tr
readSymbolicLink(Path)

s an
Deteccin de enlac ha d e
s m tG )es simblic u i
os
Creacin de enlaces fsico o enlaces
i l c e n Bsqueda de destinos de
g ma Stud
a v i@
Copyright t h isy/o sus filiales. Todos los derechos reservados.
2011, Oracle

m ar use
v i (e
a r a
El paquete java.nio.file y la interfaz Path en particular reconocen enlaces. Todos los

in M
mtodos Path detectan qu hacer en caso de encontrarse un enlace simblico, o proporcionan
w una opcin para configurar el comportamiento en caso de encontrarse un enlace simblico.
Ed Algunos sistemas de archivos soportan tambin enlaces fsicos. Los enlaces fsicos son ms
restrictivos que los enlaces simblicos:
El destino del enlace debe existir.
Generalmente no se pueden usar enlaces fsicos para los directorios.
Los enlaces fsicos no pueden cruzar particiones ni volmenes. Por lo tanto, no pueden
existir en distintos sistemas de archivos al mismo tiempo.
Los enlaces fsicos parecen, y se comportan como, archivos normales, por lo que pueden
resultar difciles de encontrar.
Los enlaces fsicos son, a todos los efectos, la misma entidad que los archivos originales.
Tienen los mismos permisos de archivo, los mismos registros de hora, etc. Todos los
atributos son idnticos.
Debido a estas restricciones, los enlaces fsicos no se usan con la misma frecuencia que los
enlaces simblicos, aunque los mtodos Path funcionan sin problema con los enlaces fsicos.

Programacin Java SE 7 11-16


Prueba

Dado un objeto Path con la siguiente ruta de acceso:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

/export/home/heimer/../williams/./documents
Qu mtodo Path eliminara los elementos redundantes?
a. normalize
b. relativize
c. resolve e to
e n s
d. toAbsolutePath e l lic
fe r ab
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 11-17


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Dada la siguiente ruta:


Path p = Paths.get
("/home/export/tom/documents/coursefiles/JDK7");
y la sentencia:
Path sub = p.subPath (x, y);
Qu valores para x e y producirn un objeto Path que to
contenga documents/coursefiles? n s e
lice
a. x = 3, y = 4 le
a b
b. x = 3, y = 5 s f er
c. x = 4, y = 5 - t r an
n on
d. x = 4, y = 6 sa h a d e
m ) Gu i
o
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 11-18


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Dado el siguiente fragmento de cdigo:


Path p1 = Paths.get("D:/temp/foo/");
Path p2 = Paths.get("../bar/documents");
Path p3 = p1.resolve(p2).normalize();
System.out.println(p3);
Cul es el resultado? e to
e n s
a. Error del compilador le lic
a b
b. Excepcin de E/S
s f er
c. D:\temp\foo\documents - t r an
d. D:\temp\bar\documents n on
s a
a
) h uide
e. D:\temp\foo\..\bar\documents
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 11-19


Operaciones File
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Comprobacin de un directorio o un archivo

Supresin de un directorio o un archivo

Copia de un directorio o un archivo

Desplazamiento de un directorio o un archivo


e to
e n s
Gestin de metadatos
elic
a b l
fe
Lectura, escritura y creacin de archivos r
a n s
n -tr
Archivos de acceso aleatorio
o
n
alectura
Creacin
h a s y
d e directorios
de
m ) Gu i
o
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
La clase java.nio.file.Files est en el punto de entrada principal para operaciones con los

i n M
objetos Path.
w Los mtodos estticos de esta clase leen, escriben y manipulan archivos y directorios
Ed representados por objetos Path.
La clase Files tambin reconoce enlaces. Sus mtodos detectan los enlaces simblicos en
objetos Path y proporcionan o gestionan automticamente opciones para tratar los enlaces.

Programacin Java SE 7 11-20


Comprobacin de un directorio o un archivo

Los objetos Path representan el concepto de una ubicacin de


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

archivo o de directorio. Para poder acceder al archivo o al


directorio es necesario acceder primero al sistema de archivos
y determinar si existe o no con los siguientes mtodos Files:
exists(Path p, LinkOption... option)
Realiza pruebas para ver si existe un archivo. Por defecto, to
le siguen enlaces simblicos. n s e
notExists(Path p, LinkOption... option) le li
ce
Realiza pruebas para ver si no existe un archivo.fe rab
Por
defecto, le siguen enlaces simblicos. t r a ns
o n -
Ejemplo: n a Argumento opcional
Path p = Paths.get(args[0]); a s
h uide
System.out.format("Path %s exists: %b%n", p, m tG )
c o n
il e
Files.exists(p, LinkOption.NOFOLLOW_LINKS));
a d
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Recuerde que los objetos Path pueden apuntar a archivos o a directorios que no existen. Los

i n M
mtodos exists() y notExists() se utilizan para determinar si Path apunta a un directorio o
w un archivo legtimo, y los detalles de este archivo o directorio.
Ed Cuando se comprueba la existencia de un archivo se pueden obtener tres resultados:
Se puede verificar que existe el archivo.
Se puede verificar que no existe el archivo.
Que el estado del archivo sea desconocido. Este resultado se puede producir cuando el
programa no tiene acceso al archivo.
Nota: !Files.exists(path) no es equivalente a Files.notExists(path). Si ambos,
exists y notExists, devuelven false, no se puede determinar la existencia del archivo o del
directorio. Por ejemplo, en Windows se puede conseguir solicitando el estado de una unidad fuera
de lnea, como una unidad de CD-ROM.

Programacin Java SE 7 11-21


Comprobacin de un directorio o un archivo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Para verificar que se puede acceder a un archivo, la clase


Files proporciona los siguientes mtodos boolean.
isReadable (Path)
isWriteable (Path)
isExecutable (Path)
Tenga en cuenta que estas pruebas no son atmicas con e to
n s
respecto al resto de las operaciones del sistema de archivos. lice
Por lo tanto, es posible que los resultados de estas pruebas a b leno
resulten fiables una vez terminen los mtodos. s f er
El mtodo isSameFile (Path, Path) - t r an pruebas
realiza
n on
para comprobar si hay dos rutas squea apuntan
al mismo
a
) h Gutil
archivo. Esto resulta especialmente e
id en sistemas de
archivos que soportanlc o m
enlaces t
nsimblicos.
ai tude
g sSm
i @ hi y/o sus filiales. Todos los derechos reservados.
v 2011,e Oracle
t
a
Copyright
r
e ma us
a v i(
El resultado de cualquiera de estas pruebas queda inmediatamente obsoleto una vez finalizada la
a r
i n M
operacin. Segn se explica la documentacin: Tenga en cuenta que el resultado de este
w mtodo queda inmediatamente obsoleto. No existe garanta de que un intento posterior de abrir el
Ed archivo para escribir termine con xito (ni incluso de que acceda al mismo archivo). Preste
atencin a la hora de usar este mtodo en aplicaciones especialmente sensibles a la seguridad.

Programacin Java SE 7 11-22


Creacin de archivos y directorios
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Se pueden crear archivos y directorios con uno de los


siguientes mtodos:
Files.createFile (Path dir);
Files.createDirectory (Path dir);

El mtodo createDirectories se puede utilizar para to


crear directorios que no existen, de arriba abajo: n s e
ic e
Files.createDirectories(Paths.get("D:/Temp/foo/bar/example"));
b l el
fe r a
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
La clase Files tambin incluye mtodos para crear archivos y directorios temporales, discos

i n M
duros y enlaces simblicos.
w
Ed

Programacin Java SE 7 11-23


Supresin de un directorio o un archivo

Puede suprimir archivos, directorios o enlaces. La clase Files


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

proporciona dos mtodos:


delete(Path)
deleteIfExists(Path)
//...
Files.delete(path);
e to
//...
e n s
Devuelve NoSuchFileExc
eption,
le lic
eption o a b
DirectoryNotEmptyExc s f er
n
IOException -tra on
a n
a s e excepcin
de)vuhelve nin idna
gu
//...
Files.deleteIfExists(Path) Nom u
//... i l co ent G
g ma Stud
a v i@
Copyright t h isy/o sus filiales. Todos los derechos reservados.
2011, Oracle

m ar use
v i (e
a r a
El mtodo delete(Path) suprime el archivo o devuelve una excepcin si falla la operacin de

in M
supresin. Por ejemplo, si no existe el archivo, se devuelve NoSuchFileException.
w El mtodo deleteIfExists(Path) suprime tambin el archivo, pero si el archivo no existe, no
Ed se devuelve ninguna excepcin. Generar un fallo en modo silencioso resulta til cuando se tienen
varios threads para suprimir archivos y no se desea devolver una excepcin solo porque un
thread lo hizo primero.

Programacin Java SE 7 11-24


Copia de un directorio o un archivo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Puede copiar un archivo o un directorio mediante el


mtodo copy(Path, Path, CopyOption...).
Cuando se copian directorios, los archivos que incluyen no
se copian. Parmetros de StandardCopyOption
//...
REPLACE_EXISTING
copy(Path, Path, CopyOption...) COPY_ATTRIBUTES e to
//... NOFOLLOW_LINKS
e n s
el ic
a b l
fe r
Ejemplo: a n s
o n -tr
import static java.nio.file.StandardCopyOption.*;
s an
//...
) ha uidNOFOLLOW_LINKS);
e
Files.copy(source, target, REPLACE_EXISTING,
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
a vi (un archivo o un directorio mediante el mtodo copy(Path, Path,
Puedercopiar
M a
CopyOption...). Si el archivo de destino existe, la operacin de copia fallar, a menos que se
w i nhaya especificado la opcin REPLACE_EXISTING.
Ed Si bien se pueden copiar directorios, los archivos dentro del directorio no se copian, por lo que el
nuevo directorio quedar vaco incluso aunque el directorio original contenga archivos.
Cuando se copia un enlace simblico, se copia el destino del enlace. Si desea copiar el enlace en
s, y no su contenido, especifique la opcin NOFOLLOW_LINKS o la opcin REPLACE_EXISTING.
Se soportan las siguientes enumeraciones StandardCopyOption y LinkOption:
REPLACE_EXISTING: realiza la copia, incluso si ya existe el archivo de destino. Si el
destino es un enlace simblico, se copia el enlace en s (y no el destino del enlace). Si el
destino es un directorio que no est vaco, la operacin fallar con la excepcin
FileAlreadyExistsException.
COPY_ATTRIBUTES: copia los atributos de archivo asociados con el archivo en el archivo
de destino. Los atributos de archivo concretos que se soportan son dependientes del
sistema de archivos y de la plataforma, pero el atributo de momento de la ltima
modificacin es uno que soportan las distintas plataformas y se copia en el archivo de
destino.
NOFOLLOW_LINKS: indica que no se deben seguir los enlaces simblicos. Si el archivo que
se va a copiar es un enlace simblico, se copia el enlace en s (y no el destino del enlace).

Programacin Java SE 7 11-25


Copia entre un flujo y una ruta

Tambin puede interesarle poder copiar (o escribir) desde un


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

objeto Stream a un archivo o desde un archivo a un objeto


Stream. La clase Files proporciona dos mtodos que facilitan
esta tarea:
copy(InputStream source, Path target, CopyOption... options)
copy(Path source, OutputStream out)
Un uso interesante de este primer mtodo es copiar desde to
una pgina web y guardar en un archivo: n s e
ic e
Path path = Paths.get("D:/Temp/oracle.html");
b l el
URI u = URI.create("http://www.oracle.com/");
fe r a
try (InputStream in = u.toURL().openStream()) {
a n s
Files.copy(in, path, StandardCopyOption.REPLACE_EXISTING);
o n -tr
} catch (final MalformedURLException | IOException e) {
s an
System.out.println("Exception: " + e);
) ha uide
}
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
La alternativa a la copia del flujo a la ruta es el mtodo de ruta a flujo. Este mtodo se puede usar
para escribir un archivo en un socket o en otro tipo de flujo.
w i n
Ed

Programacin Java SE 7 11-26


Desplazamiento de un directorio o un archivo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Puede desplazar un archivo o un directorio mediante el


mtodo move(Path, Path, CopyOption...).
Al desplazar un directorio, no se desplazar su contenido.
Parmetros de StandardCopyOption
//...
move(Path, Path, CopyOption...) REPLACE_EXISTING
e to
//... ATOMIC_MOVE
e n s
elic
a b l
Ejemplo: r
n s fe
-tr a
import static java.nio.file.StandardCopyOption.*;
o n
//...
s an
ha uide
Files.move(source, target, REPLACE_EXISTING);

m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
M ara
Directrices para realizar desplazamientos:
Si la ruta de destino es un directorio y ese directorio est vaco, el desplazamiento se
w i n realizar correctamente si se ha definido REPLACE_EXISTING.
Ed Si el directorio de destino no existe, el desplazamiento se realizar correctamente.
Bsicamente, esto es cambiar de nombre el directorio.
Si el directorio de destino existe y no est vaco, se devuelve
DirectoryNotEmptyException.
Si el origen es un archivo, el destino es un directorio que existe y se define
REPLACE_EXISTING, la operacin de desplazamiento cambiar el nombre del archivo al
nombre de directorio en cuestin.
Para desplazar un directorio con archivos a otro directorio, esencialmente necesita copiar de
forma recurrente el contenido del directorio y suprimir el directorio antiguo.
Tambin puede hacer el desplazamiento como una operacin de archivo atmica mediante
ATOMIC_MOVE.
Si el sistema de archivos no soporta desplazamientos atmicos, se devuelve una excepcin.
ATOMIC_MOVE le permite desplazar un archivo a un directorio con la garanta de que ningn
proceso que est observando el directorio acceda a un archivo entero.

Programacin Java SE 7 11-27


Listado del contenido de un directorio

La clase DirectoryStream proporciona un mecanismo para


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

iterar sobre todas las entradas de un directorio.


1 Path dir = Paths.get("D:/Temp");
2 // DirectoryStream is a stream, so use try-with-resources
3 // or explicitly close it when finished
4 try (DirectoryStream<Path> stream =
5 Files.newDirectoryStream(dir, "*.zip")) {
e to
6 for (Path file : stream) {
e n s
7 System.out.println(file.getFileName());
el ic
8 }
a b l
9 } catch (PatternSyntaxException | DirectoryIteratorException | fe r
a n s
10
11
IOException x) {
System.err.println(x); o n -tr
12 }
s an
DirectoryStream escala ) ha soportar
para u i de directorios de
c o m tG
gran tamao. a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
i ( proporciona un mtodo para devolver un objeto DirectoryStream, el cual se
a
La clase v
arusar para iterar sobre todos los archivos y directorios desde cualquier directorio Path
Files

in M
puede
w (raz).
Ed Si se produce un error de E/S al iterar sobre todas las entradas en el directorio especificado, se
devuelve DirectoryIteratorException.
Si el patrn proporcionado (segundo argumento del mtodo) no es vlido, se devuelve
PatternSyntaxException.

Programacin Java SE 7 11-28


Lectura o escritura de todos los bytes
o lneas de un archivo
Los mtodos readAllBytes o readAllLines leen el
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

contenido completo de un archivo en una sola


transferencia.
Ejemplo:
Path source = ...;
List<String> lines;
e to
Charset cs = Charset.defaultCharset();
e n s
lines = Files.readAllLines(file, cs);
el ic
a b l
Utilice mtodos write para escribir bytes o lneas
s f eren un
archivo. tran n -
o
an
Path target = ...;
s
Files.write(target, lines, cs, CREATE, TRUNCATE_EXISTING, WRITE);
ha uide
m tG )
c o n Enumeraciones StandardOpenOption.
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
Si tiene un archivo pequeo y quiere leer todo su contenido en una sola transferencia, puede usar
el mtodo readAllBytes(Path) o el mtodo readAllLines(Path, Charset). Estos
w i n
mtodos se ocupan de la mayor parte del trabajo, como abrir y cerrar el flujo, pero al traer el
Ed archivo entero a la memoria de una sola vez, no deben usarse para manejar archivos de gran
tamao.
Puede usar uno de los mtodos de escritura para escribir bytes o lneas en un archivo.
write(Path, byte[], OpenOption...)
write(Path, Iterable<? extends CharSequence>, Charset,
OpenOption...)

Programacin Java SE 7 11-29


Canales y ByteBuffers
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

La E/S de flujo lee un carcter cada vez, mientras que la


E/S de canal lee un buffer cada vez.
La interfaz ByteChannel proporciona una funcionalidad
de lectura y escritura bsica.
Un objeto SeekableByteChannel es un objeto
ByteChannel que tiene la capacidad de mantener una
e to
posicin en el canal y cambiarla. n s
e l ice
bl
Los dos mtodos para escribir y leer E/S de canal son:
ra
f e
newByteChannel(Path, OpenOption...) ns tra
newByteChannel(Path, Set<? extends OpenOption>, FileAttribute<?>...)
n -
a no
La capacidad de realizar desplazamientos s de a diferentes
puntos en un archivo y despus h
) leera io escribir desde esa
o m G u
ubicacin hace posible
a ilcun acceso
d e nt aleatorio a un archivo.
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
NIO.2 r a vi (E/S de canal y de flujo en buffer.
soporta
LaM a
E/S de flujo lee un carcter cada vez, mientras que la E/S de canal lee un buffer cada vez. La
n
wi interfaz ByteChannel proporciona una funcionalidad de lectura y escritura bsica. Un objeto
Ed SeekableByteChannel es un objeto ByteChannel que tiene la capacidad de mantener una
posicin en el canal y realizar una consulta al archivo segn su tamao.
La capacidad de realizar desplazamientos a diferentes puntos en un archivo y despus leer o
escribir desde esa ubicacin hace posible un acceso aleatorio a un archivo.
Hay dos mtodos para escribir y leer E/S de canal:
newByteChannel(Path, OpenOption...)
newByteChannel(Path, Set<? extends OpenOption>, FileAttribute<?>...)
Nota: el mtodo newByteChannel devuelve una instancia de SeekableByteChannel. Con un
sistema de archivos por defecto se puede difundir este canal de bytes susceptible de bsqueda a
FileChannel, y con ello proporcionar acceso a funciones ms avanzadas, como asignar una
zona del archivo directamente a la memoria para un acceso ms rpido, bloquear una zona del
archivo para que no puedan acceder a ella otros procesos, o leer y escribir bytes desde una
posicin absoluta sin afectar a la posicin actual del canal. Consulte la leccin Conceptos
fundamentales de E/S para ver un ejemplo del uso de FileChannel.

Programacin Java SE 7 11-30


Archivos de acceso aleatorio

Los archivos de acceso aleatorio permiten acceder


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

aleatoria y no secuencialmente al contenido de un archivo.


Para acceder a un archivo aleatoriamente, abra el archivo,
busque una ubicacin concreta y lea desde el archivo o
escriba en l.
La funcionalidad de acceso aleatorio se activa mediante la
interfaz SeekableByteChannel. e to
e n s
el ic
position() write(ByteBuffer)
a b l
fe r
a n s
-tr
position(long)
o n
read(ByteBuffer)
s an
) ha uidetruncate(long)
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
Los archivos de acceso aleatorio permiten acceder aleatoria y no secuencialmente al contenido
de un archivo. Para acceder a un archivo aleatoriamente, abra el archivo, busque una ubicacin
w i n
concreta y lea desde el archivo o escriba en l.
Ed Esta funcionalidad se activa mediante la interfaz SeekableByteChannel. La interfaz
SeekableByteChannel ampla la E/S de canal con la nocin de una posicin actual. Los
mtodos le permiten establecer o consultar la posicin y despus leer datos desde esa ubicacin
o escribir datos en ella. La API incluye unos pocos mtodos fciles de usar:
position(): devuelve la posicin actual del canal.
position(long): establece la posicin del canal.
read(ByteBuffer): lee bytes en el buffer desde el canal.
write(ByteBuffer): escribe bytes desde el buffer al canal.
truncate(long): trunca el archivo (u otra entidad) conectado al canal.

Programacin Java SE 7 11-31


Mtodos de E/S en buffer para archivos de texto

El mtodo newBufferedReader abre un archivo para su


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

lectura.
//...
BufferedReader reader = Files.newBufferedReader(file, charset);
line = reader.readLine();

El mtodo newBufferedWriter escribe en un archivo a e to


n s
travs de un objeto BufferedWriter. lice e
r a bl
//...
s fe
BufferedWriter writer = Files.newBufferedWriter(file, charset);
- t r an
writer.write(s, 0, s.length());
no n
a
s de
h
) Gui a
o m
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ElM
ara
Lectura de un archivo mediante E/S de flujo en buffer
mtodo newBufferedReader(Path, Charset) abre un archivo para su lectura y devuelve
i n
w un objeto BufferedReader que se puede utilizar para leer texto desde un archivo de manera
Ed eficiente.

Programacin Java SE 7 11-32


Flujos de bytes

NIO.2 soporta tambin mtodos para abrir flujos de bytes.


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

InputStream in = Files.newInputStream(file);
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
line = reader.readLine();

Para crear, agregar a un archivo o escribir en l, utilice el


mtodo newOutputStream. to
n s e
import static java.nio.file.StandardOpenOption.*;
ic e
//...
b l el
Path logfile = ...;
fe r a
String s = ...;
a n s
byte data[] = s.getBytes();
o n -tr
an
OutputStream out =

s
new BufferedOutputStream(file.newOutputStream(CREATE, APPEND);
ha uide
out.write(data, 0, data.length);
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 11-33


Gestin de metadatos

Mtodo Explicacin
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

size Devuelve el tamao del archivo especificado en bytes.


Devuelve true si el objeto Path especificado localiza un
isDirectory
archivo que es un directorio.
Devuelve true si el objeto Path especificado localiza un
isRegularFile
archivo que es un archivo normal.
Devuelve true si el objeto Path especificado localiza un e to
isSymbolicLink
archivo que es un enlace simblico. e n s
el ic
isHidden a b l
Devuelve true si el objeto Path especificado localiza un
r
archivo considerado oculto por el sistema de archivos.
fe
a n s
-tr
getLastModifiedTime Devuelve o establece la fecha de ltima modificacin
del archivo especificado. o n
an
setLastModifiedTime
getAttribute s
ha el uvalor dede un atributo de archivo.
Devuelve o establece
m tG ) i
setAttribute
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
i ( necesita usar varios atributos de archivo al mismo tiempo, puede que usar
a v
Si un programa
M ar que recuperen un solo atributo no sea eficiente. Acceder repetidamente al sistema de
mtodos
winarchivos para recuperar un solo atributo puede afectar negativamente al rendimiento. Por esto
Ed motivo, la clase Files proporciona dos mtodos readAttributes para recuperar los atributos
de un archivo en una sola operacin en bloque.
readAttributes(Path, String, LinkOption...)
readAttributes(Path, Class<A>, LinkOption...)

Programacin Java SE 7 11-34


Atributos de archivo (DOS)
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Los atributos de archivo se pueden leer desde un archivo


o un directorio en una sola llamada:
DosFileAttributes attrs =
Files.readAttributes (path, DosFileAttributes.class);

Los sistemas de archivos DOS pueden modificar atributos to


despus de crearse los archivos: n s e
ic e
Files.createFile (file); b l el
Files.setAttribute (file, "dos:hidden", true); fe r a
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Los tipos setAttribute (en DOS) amplan BasicFileAttributeView y ven los cuatro bits

i n M
estndar en sistemas de archivos que soportan atributos de DOS:
w dos:hidden
Ed dos:readonly
dos:system
dos:archive
Otras vistas de atributos soportadas son:
BasicFileAttributeView: proporciona un juego de atributos bsicos que soportan
todas las implantaciones de sistemas de archivos.
PosixFileAttributeView: ampla BasicFileAttributeView con atributos que
soportan la familia de estndares POSIX, como UNIX.
FileOwnerAttributeView: la soporta cualquier implantacin de sistema de archivos que
soporte el concepto de propiedad de archivo.
AclFileAttributeView: soporta la lectura o actualizacin de la lista de control de
acceso (ACL) de un archivo. Se soporta el modelo NFSv4 ACL.
UserDefinedFileAttributeView: permite usar metadatos definidos por el usuario.

Programacin Java SE 7 11-35


Atributos de archivo DOS: ejemplo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

DosFileAttributes attrs = null;


Path file = ...;
try { attrs =
Files.readAttributes(file, DosFileAttributes.class);
} catch (IOException e) { ///... }
FileSystem creation = attrs.creationTime();
FileSystem modified = attrs.lastModifiedTime();
e to
FileSystem lastAccess = attrs.lastAccessTime();
e n s
if (!attrs.isDirectory()) {
elic
long size = attrs.size();
a b l
fe r
}
a n s
// DosFileAttributes adds these to BasicFileAttributes
o n -tr
an
boolean archive = attrs.isArchive();
boolean hidden = attrs.isHidden(); s
ha uide
boolean readOnly = attrs.isReadOnly();
m tG )
boolean systemFile = attrs.isSystem();
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
El fragmento de cdigo en la diapositiva ilustra el uso de la clase DosFileAttributes. En la

i n M
llamada (nica) al mtodo readAttributes, se devuelven los atributos del archivo (o del
w directorio).
Ed

Programacin Java SE 7 11-36


Permisos de POSIX
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

NIO.2 permite crear archivos y directorios en sistemas de


archivos POSIX con sus primeros permisos establecidos.
1 Path p = Paths.get(args[0]);
2 Set<PosixFilePermission> perms =
3 PosixFilePermissions.fromString("rwxr-x---");
4 FileAttribute<Set<PosixFilePermission>> attrs =
5 PosixFilePermissions.asFileAttribute(perms);
e to
6 try { Crear un archivo en Path p
e n s
7 Files.createFile(p, attrs); con atributos opcionales.
elic
a b l
8 } catch (FileAlreadyExistsException f) {
fe r
9 System.out.println("FileAlreadyExists" + f);
a n s
10 } catch (IOException i) {
o n -tr
11 System.out.println("IOException:" + i);
s an
12 }
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
Los sistemas de archivos que implantan el estndar POSIX (Portable Operating System Interface)
pueden crear archivos y directorios con sus primeros permisos establecidos. Esto resuelve un
w i n
problema comn en la creacin de archivos a la hora de programar las operaciones de E/S. Los
Ed permisos en ese archivo se pueden cambiar antes de la siguiente ejecucin para establecer
permisos.
Se pueden establecer permisos solo para sistemas de archivos compatibles con POSIX, como
MacOS, Linux y Solaris. Windows (basado en DOS) no es compatible con POSIX. Los archivos y
directorios basados en DOS no tienen permisos, sino ms bien atributos de archivo.
Nota: puede determinar si un sistema de archivos soporta o no POSIX en cuanto a programacin
consultando las vistas de atributos de archivo soportadas. Por ejemplo:
boolean unixFS = false;
Set<String> views =
FileSystems.getDefault().supportedFileAttributeViews();
for (String s : views) {
if (s.equals("posix")) unixFS = true;
}

Programacin Java SE 7 11-37


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Dado el siguiente fragmento:


Path p1 = Paths.get("/export/home/peter");
Path p2 = Paths.get("/export/home/peter2");
Files.move(p1, p2, StandardCopyOption.REPLACE_EXISTING);
Si el directorio peter2 no existe, y el directorio peter tiene
dentro subcarpetas y archivos, cul es el resultado?
a. DirectoryNotEmptyException e to
e n s
b. NotDirectoryException le lic
a b
c. Se crea el directorio peter2.
s f er
d. Se copia el directorio peter en peter2. -tra
n
e. Se crea el directorio peter2 y se copiann on en l los
s a
a
archivos y directorios de peter.
h ide ) Gu
o m
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
e ma us
a v i(
a r
i n M
w
Ed

Programacin Java SE 7 11-38


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Dado el siguiente fragmento:


Path source = Paths.get(args[0]);
Path target = Paths.get(args[1]);
File.copy(source, target);
Suponiendo que source y target no son directorios,
cmo puede evitar que esta operacin de copia genere
FileAlreadyExistsException? e to
e n s
a. Suprimiendo el archivo target antes de copiar.
le lic
b. Utilizando en su lugar el mtodo move. a b
s f er
- t r an
c. Utilizando en su lugar el mtodo copyExisting.
d. Agregando la opcin REPLACE_EXISTINGnon al mtodo. a
a s
h uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 11-39


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Dado el siguiente fragmento:


Path source = Paths.get("/export/home/mcginn/HelloWorld.java");
Path newdir = Paths.get("/export/home/heimer");
Files.copy(source, newdir.resolve(source.getFileName());
Suponiendo que no hay excepciones, cul sera el resultado?
a. El contenido de mcginn se copiar en heimer.
e to
b. HelloWorld.java se copiar en /export/home. n s
c. HelloWorld.java se copiar en e l ice
r a bl
/export/home/heimer.
n s fe
-tra
d. El contenido de heimer se copiar en mcginn.
on
a n
a s
h uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 11-40


Visin general de la prctica 11-1:
Escritura de una aplicacin de fusin de archivos
En esta prctica, utilice la interfaz Path y la clase Files para
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

abrir un formulario de plantilla de carta, y sustituya el nombre


en la plantilla por un nombre extrado de un archivo que
contiene una lista de nombres.
Utilice la interfaz Path para crear un nuevo nombre de
archivo para la carta personalizada. to
Utilice la clase Files para leer todas las cadenas de n s e
ambos archivos a objetos List. e l ice
r a bl
Utilice las clases Matcher y Pattern para sfe
buscar el token que sustituir en la plantilla.-tra
n
n on
s a
) a
h uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 11-41


Operaciones recursivas
La clase Files ofrece un mtodo para recorrer el rbol de
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

archivos en busca de operaciones recursivas, como de copia y


de supresin.
walkFileTree (Path start, FileVisitor<T>)
Ejemplo:
public class PrintTree implements FileVisitor<Path> {
public FileVisitResult preVisitDirectory(Path, BasicFileAttributes){}
e to
public FileVisitResult postVisitDirectory(Path, BasicFileAttributes){}
e n s
public FileVisitResult visitFile(Path, BasicFileAttributes){}
el ic
public FileVisitResult visitFileFailed(Path, BasicFileAttributes){}
a b l
}
fe r
a n s
public class WalkFileTreeExample {
n r archivosSesellama
El rboltde
-recurrente. explora de
public printFileTree(Path p) {
n o
forma como

Files.walkFileTree(p, new PrintTree());


s
directorios a los mtodos definidos
a por PrintTree y se llega a los
}
) a
h uidarchivos e en el rbol. Cada mtodo
}
c o m t G el primer argumento del mtodo.
se transfiere a la ruta actual como

a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
La interfaz FileVisitor incluye mtodos a los que se va llamando a medida que se visita cada

i n M
uno de los nodos del rbol:
w preVisitDirectory: se invoca en un directorio antes de que se visiten las entradas del
Ed directorio.
visitFile: se invoca para un archivo en un directorio.
postVisitDirectory: se invoca despus de que se hayan visitado todas las entradas en
un directorio y sus descendientes.
visitFileFailed: se invoca para un archivo que no se haya podido visitar.
El resultado devuelto de cada uno de los mtodos llamados determina las acciones que tomar
tras alcanzar un nodo (antes o despus). Estas acciones se enumeran en la clase
FileVisitResult:
CONTINUE: continuar al siguiente nodo.
SKIP_SIBLINGS: continuar sin visitar a los hermanos del archivo o del directorio.
SKIP_SUBTREE: continuar sin visitar las entradas en este directorio.
TERMINATE
Nota: existe tambin una clase, SimpleFileVisitor, que implanta cada mtodo en
FileVisitor con un tipo de retorno FileVisitResult.CONTINUE o que devuelve
IOException. Si planea utilizar algunos de los mtodos de la interfaz FileVisitor, esta clase
es ms fcil de ampliar sustituyendo los mtodos que necesite.
Programacin Java SE 7 11-42
Orden del mtodo FileVisitor
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

preVisitDirectory() inicio

archivo dir enlace

e to
e n s
elic
dir a b l
archivo
fe r
a n s
o n -tr
archivo s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
M ara
FileVisitor
Empezando por el primer nodo de directorio y en cada subdirectorio que se encuentre, al mtodo
i n
w preVisitDirectory(Path, BasicFileAttributes) se le llama en la clase transferida al
Ed mtodo walkFileTree.
Si el tipo de retorno al invocar a preVisitDirectory() es FileVisitResult.CONTINUE, se
explorar el nodo siguiente.
Nota: la transversal del rbol de archivos es una transversal de profundidad con FileVisitor
invocado con cada archivo encontrado. La transversal del rbol de archivos finaliza cuando se
han visitado todos los archivos accesibles en el rbol, o cuando un mtodo de visita devuelve un
resultado TERMINATE. Cuando un mtodo de visita termina porque se produce una excepcin
IOException, un error uncaught o una excepcin de tiempo de ejecucin, la transversal se
termina y se propaga el error o la excepcin al emisor del mtodo.

Programacin Java SE 7 11-43


Orden del mtodo FileVisitor
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

inicio
preVisitDirectory()

visitFile() archivo dir enlace

e to
e n s
preVisitDirectory()
elic
dir a b l
archivo
fe r
a n s
o n -tr
an
visitFileFailed()
visitFile() archivo s
ha uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i( e
ra v
Cuando se encuentra un archivo en el rbol, el mtodo walkFileTree intenta leer sus atributos
Ma
BasicFileAttributes. Si el archivo no es un directorio, se llama al mtodo visitFile con
in
w los atributos de archivo. Si los atributos del archivo no se pudieran leer debido a una excepcin
Ed de E/S, se llama al mtodo visitFileFailed con la excepcin de E/S.
.

Programacin Java SE 7 11-44


Orden del mtodo FileVisitor
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

inicio
postVisitDirectory() postVisitDirectory()

archivo dir enlace

e to
postVisitDirectory()
e n s
elic
dir a b l
archivo
fe r
postVisitDirectory()
a n s
o n -tr
archivo s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
M ara
Una vez se han alcanzado todos los objetos secundarios del nodo, se invoca al mtodo
postVisitDirectory en cada uno de los directorios.
i n
w Nota: en la progresin que aqu se muestra, se entiende que el tipo de retorno
Ed FileVisitResult es CONTINUE por cada uno de los mtodos FileVisitor.

Programacin Java SE 7 11-45


Ejemplo: WalkFileTreeExample
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Path path = Paths.get("D:/Test");


try {
Files.walkFileTree(path, new PrintTree());
} catch (IOException e) {
System.out.println("Exception: " + e);
}

D:\Test
e to
e n s
elic
file1 foo bar a b l
fe r
a n s
o n -tr
a file3n
s a
) a
h uide
file2
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
En este ejemplo, la clase PrintTree implanta cada uno de los mtodos en FileVisitor e

i n M
imprime el tipo, el nombre y el tamao del directorio y el archivo en cada nodo. Si se usara el
w diagrama que se muestra en la diapositiva, el resultado sera el siguiente (en Windows):
Ed preVisitDirectory: Directory: D:\Test (0 bytes)
preVisitDirectory: Directory: D:\Test\bar (0 bytes)
postVisitDirectory: Directory: D:\Test\bar
visitFile: Regular file: D:\Test\file1 (328 bytes)
preVisitDirectory: Directory: D:\Test\foo (0 bytes)
preVisitDirectory: Directory: D:\Test\foo\a (0 bytes)
visitFile: Regular file: D:\Test\foo\a\file2 (22 bytes)
postVisitDirectory: Directory: D:\Test\foo\a
visitFile: Regular file: D:\Test\foo\file3 (12 bytes)
postVisitDirectory: Directory: D:\Test\foo
postVisitDirectory: Directory: D:\Test
El cdigo completo para este ejemplo est en el proyecto examples/WalkFileTreeExample.

Programacin Java SE 7 11-46


Bsqueda de archivos
Para localizar un archivo, generalmente se examina un
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

directorio. Se podra usar una herramienta de bsqueda, o un


comando como:
dir /s *.java
Este comando examinar de forma recurrente el rbol del
directorio, empezando por donde se encuentre y mirando
todos los archivos que contengan la extensin .java. to
La interfaz java.nio.file.PathMatcher incluye un n s e
mtodo de coincidencia para determinar si un objeto Path le lic
e
coincide con una cadena de bsqueda especificada. erab
n
Cada implantacin de sistema de archivostproporciona
a sf un
n - r
objeto PathMatcher recuperable mediante
n o la fbrica
FileSystems: s a
) ha uide
c o m tG
PathMatcher matcher = FileSystems.getDefault().getPathMatcher
(String syntaxAndPattern);
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 11-47


Patrn y sintaxis de PathMatcher
La cadena syntaxAndPattern presenta la siguiente forma:
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

sintaxis:patrn
Donde sintaxis puede ser glob y regex.
La sintaxis glob es parecida a las expresiones regulares, pero ms
simple:
Ejemplo de patrn Coincidencias

*.java Una ruta que representa el nombre de archivo que termina en .java.

e to
*.* Encuentra coincidencias de nombres de archivos que tienen un punto.
e n s
el ic
*.{java,class} b
Encuentra coincidencias de nombres de archivos que terminan en .java
a l
o en .class.
s f er
foo.? Encuentra coincidencias de nombres de archivos que
- t r anempiezan por foo.
y tienen una extensin de un nico carcter. n
Encuentra coincidencias de C:\foo a
no
y C:\bar en la plataforma de
C:\\*
Windows (observe cmo la barra h a sdiagonaldinversa
e tiene carcter de
escape. Como un literal de) cadena enu
m i
el lenguaje Java, el patrn sera
o t G
C:\\\\*.).
a ilc den
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
e ma us
a v i(
Las reglas a continuacin se usan para interpretar patrones glob:
a r
i n M
El carcter * busca coincidencias de cero o ms caracteres de un componente nombre sin
w cruzar lmites de directorios.
Ed Los caracteres ** encuentran coincidencias de cero o ms caracteres cruzando lmites de
directorios.
El carcter ? busca coincidencias exactas de un carcter de un componente nombre.
El carcter de barra diagonal inversa (\) se utiliza para incluir un escape en caracteres que
si no se interpretaran como caracteres especiales. La expresin \\ busca coincidencias de
una barra diagonal inversa, mientras que \{ busca coincidencias de un corchete de
apertura, por ejemplo.
Los caracteres [ ] son una expresin de corchetes cuadrados que buscan coincidencias
de un solo carcter en el componente nombre de un juego de caracteres. Por ejemplo,
[abc] busca coincidencias de a, b o c. El guion (-) especifica un rango. As, [a-z]
especifica un rango que busca coincidencias desde a hasta z (incluidas). Estas formas se
pueden tambin mezclar, de modo que [abce-g] buscar coincidencias de a, b, c, e, f o
g. Si el carcter despus de [ es !, entonces se usa para indicar una negacin. As, [!a-
c] buscar coincidencias de cualquier carcter salvo a, b o c.

Programacin Java SE 7 11-48


Dentro de una expresin entre corchetes cuadrados, los caracteres *, ? y \ coinciden
consigo mismos. El carcter (-) coincide consigo mismo si el primer carcter dentro de los
corchetes, o el primer carcter despus del ! si se trata de una negacin.
Los caracteres { } son un grupo de subpatrones, donde el grupo coincide si coincide alguno
de los subpatrones del grupo. El carcter "," se utiliza para separar los subpatrones. Los
grupos no se pueden anidar.
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Los caracteres iniciales de punto en un nombre de archivo se tratan como caracteres


normales en operaciones de coincidencia. Por ejemplo, el patrn * glob coincide con el
nombre de archivo .login. El mtodo Files.isHidden(java.nio.file.Path) se
puede usar para probar si un archivo se considera oculto.
El resto de los caracteres coinciden con ellos mismos de forma dependiente con la
implantacin. Esto incluye caracteres que representen cualquier separador de nombres.
La coincidencia de los componentes raz depende en gran manera de la implantacin y no
se especifica. e to
n s
Cuando la sintaxis es regex, el componente patrn es una expresin regular definida por la
e l ice
clase Pattern.
r a bl es por el
n
uso de maysculas o minsculas, dependen de la implantacin y, por lo tanto, s feno se especifican.
En ambas sintaxis, la glob y la regex, los detalles coincidentes, como si la coincidencia

n - tra
a no
h a s de
m ) Gui
o
a ilc dent
@ gm s Stu
r a vi e thi
m a u s
i( e
a v
M ar
win
Ed

Programacin Java SE 7 11-49


PathMatcher: ejemplo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

1 public static void main(String [] args) {


2 // ... check for two arguments
3 Path root = Paths.get(args[0]);
4 // ... check that the first argument is a directory
5 PathMatcher matcher =
6 FileSystems.getDefault().getPathMatcher("glob:" + args[1]);
7 // Finder is class that implements FileVisitor
8 Finder finder = new Finder(root, matcher);
e to
9 try {
e n s
10 Files.walkFileTree(root, finder);
elic
11 } catch (IOException e) {
a b l
12 System.out.println("Exception: " + e);
fe r
13 }
a n s
14 finder.done();
o n -tr
an
15 }
s
ha uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
M ara
En este fragmento de cdigo en la diapositiva (el ejemplo completo est en el directorio de
ejemplos), se transfieren dos argumentos al principal.
i n
w El primer argumento se prueba para ver si es un directorio. El segundo argumento se usa para
Ed crear una instancia de PathMatcher con una expresin regular mediante la fbrica
FileSystems.
Finder es una clase que implanta la interfaz FileVisitor, de modo que se puede transferir a
un mtodo walkFileTree. Esta clase se usa para llamar al mtodo de coincidencia en todos los
archivos visitados en el rbol.

Programacin Java SE 7 11-50


Clase Finder
1 public class Finder extends SimpleFileVisitor<Path> {
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

2 private Path file;


3 private PathMatcher matcher;
4 private int numMatches;
5 // ... constructor stores Path and PathMatcher objects
6 private void find(Path file) {
7 Path name = file.getFileName();
8 if (name != null && matcher.matches(name)) {
9 numMatches++;
e to
10 System.out.println(file);
e n s
11 }
elic
12 }
a b l
13 @Override
fe r
14 public FileVisitResult visitFile(Path file,
a n s
15 BasicFileAttributes attrs) {
o n -tr
an
16 find(file);
17 return CONTINUE; s
ha uide
18 }
m tG )
19 //...
c o n
20 } a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
La diapositiva muestra una porcin de la clase Finder. Esta clase se utiliza para recorrer el rbol

i n M
en busca de coincidencias entre el archivo y el archivo alcanzado por el mtodo visitFile.
w
Ed

Programacin Java SE 7 11-51


Otras clases tiles de NIO.2

La clase FileStore es til para proporcionar informacin de


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

uso sobre el sistema de archivos, como el total de espacio en


disco utilizable y asignado.
Filesystem kbytes used avail
System (C:) 209748988 72247420 137501568
Data (D:) 81847292 429488 81417804
Se puede usar una instancia de la interfaz WatchService to
para informar sobre cambios en los objetos Path registrados. nse
WatchService se puede usar para identificar el momento lic
e
l e
de adicin de los archivos a un directorio, as como surab
supresin o modificacin. n s fe
a -tr
ENTRY_CREATE: D:\test\New Text Document.txt
o n
ENTRY_CREATE: D:\test\Foo.txt
s an
ENTRY_MODIFY: D:\test\Foo.txt
) ha uide
ENTRY_MODIFY: D:\test\Foo.txt
c o m tG
ENTRY_DELETE: a
D:\test\Foo.txt il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
La diapositiva muestra resultados de ejemplos del proyecto DiskUsageExample y el proyecto

i n M
WatchDirExample.
w
Ed

Programacin Java SE 7 11-52


Cambio a NIO.2

Se ha agregado un mtodo a la clase java.io.File para


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

que JDK 7 pueda proporcionar compatibilidad con versiones


posteriores de NIO.2.
Path path = file.toPath();
Esto le permite aprovechar NIO.2 sin tener que reescribir
una gran cantidad de cdigo.
Adems, tambin puede sustituir el cdigo existente para e to
n s
mejorar el mantenimiento futuro. Por ejemplo, puede
e l ice
l
sustituir file.delete(); por: rab e
Path path = file.toPath();
a n sf
Files.delete(path); tr n -
o
Por el contrario, la interfaz Path proporciona
s a n un mtodo
para construir un objeto java.io.File: ) ha uide
c o m tG
File file = path.toFile();
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
a vi ( de legado
Cdigorjava.io.File
M
Una
ade las ventajas del paquete NIO.2 es que puede activar cdigo de legado para aprovechar la
n
wi nueva API.
Ed

Programacin Java SE 7 11-53


Resumen

En esta leccin, debe haber aprendido a hacer lo siguiente:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Utilizar la interfaz Path para realizar operaciones en


archivos y en rutas de acceso a directorios
Utilizar la clase Files para comprobar, suprimir, copiar
o mover un archivo o un directorio
Utilizar mtodos de la clase Files para leer y escribir
e to
archivos mediante E/S de canales o E/S de flujos e n s
Leer y cambiar atributos de archivos y de directorios ble
lic
Acceder de forma recurrente al rbol de un directorio f e ra
t r a ns
Localizar un archivo a travs de la claseo n -
PathMatcher an s de
h
) Gui a
o m
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 11-54


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Para copiar, desplazar o abrir un archivo o un directorio con


NIO.2, primero debe crearse una instancia de:
a. Path
b. Files
c. FileSystem
d. Channel e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 11-55


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Para una ruta de directorio de inicio dada, qu mtodos


FileVisitor utilizara para suprimir un rbol de archivos?
a. preVisitDirectory()
b. postVisitDirectory()
c. visitFile()
d. visitDirectory() e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 11-56


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En el caso de una aplicacin en la que se desea contar la


profundidad de un rbol de archivo (el nmero de niveles de
directorios), qu mtodo FileVisitor deber usar?
a. preVisitDirectory()
b. postVisitDirectory()
c. visitFile() e to
e n s
d. visitDirectory() ic
b l el
fe r a
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 11-57


Visin general de la prctica 11-2:
Copia recursiva
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Esta prctica aborda la creacin de una clase mediante la


implantacin de FileVisitor para copiar de forma
recurrente un rbol de directorios a otra ubicacin.
Permita al usuario de su aplicacin decidir si sustituir
o no un directorio existente.

e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 11-58


(Opcional) Visin general de la prctica 11-3:
Uso de PathMatcher para realizar
una supresin recursiva
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica, se abordan los siguientes temas:


Creacin de una clase mediante la implantacin de
FileVisitor para suprimir un archivo mediante un
comodn (es decir, suprimir todos los archivos de texto
con *.txt).
e to
(Opcional) Ejecucin de WatchDirExample en el e n s
directorio de ejemplos mientras se suprimen archivosbde le lic
f er
un directorio (o se usa la aplicacin de copia recursiva)
a
n s
para supervisar posibles cambios. -tra on
a n
a s
h uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 11-59


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Ed
w i n M
ara
v i
( e m a r a
u
@
s
a
vi e thi
il c o
gm s Stu
d
)
e n
s
m tG
o
ha uide
an
tr n -
a n s fe
r
a b l el
ic
e n s e
to
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Threads

e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
Objetivos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Al finalizar esta leccin, debera estar capacitado para:


Describir la programacin de tareas del sistema operativo
Definir un thread
Crear threads
Gestionar threads
Sincronizar threads que acceden a datos compartidos e to
n s
Identificar posibles problemas de threads e l ice
l b
f e ra
an s
- t r
n on
s a
) a
h uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
e ma us
a v i(
a r
i n M
w
Ed

Programacin Java SE 7 12-2


Programacin de tareas
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Los sistemas operativos modernos utilizan una multitarea


preferente para asignar el tiempo de CPU a las aplicaciones.
Existen dos tipos de tareas que se pueden programar para la
ejecucin:
Procesos: un proceso es un rea de la memoria que
contiene tanto cdigo como datos. Un proceso tiene un to
thread de ejecucin que se programa para recibir n s e
lice
porciones de tiempo de CPU. le
r a b
Thread: un thread es la ejecucin programada defeun
an
proceso. Es posible que existan threads simultneos.
s
- t r
on la misma
Todos los threads de un proceso comparten
n
memoria de datos, pero es posibles aque sigan
diferentes
h a i d e
m)una seccin
rutas de acceso a travs de Gu de cdigo.
o
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Multitarea preferente
Mcomputadoras modernas a menudo tienen ms tareas que ejecutar que las CPU. A cada
Las
i n
w tarea se le proporciona una cantidad de tiempo (denominada porcin de tiempo) en la que se
Ed puede ejecutar en una CPU. Una porcin de tiempo normalmente se mide en milisegundos.
Cuando transcurre la porcin de tiempo, la tarea se elimina de forma forzosa de la CPU y se le da
la oportunidad a otra tarea para que se ejecute.

Programacin Java SE 7 12-3


Importancia de los threads
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Para ejecutar un programa tan rpido como sea posible, debe


evitar cuellos de botella de rendimiento. Algunos de estos
cuellos de botella son:
Contencin de recursos: dos o ms tareas esperan uso
exclusivo de un recurso
Operaciones de E/S de bloqueo: no realizar ninguna
e to
accin a la espera de las transferencias de datos de disco ens
o de red l e lic
r a b
Infrautilizacin de CPU: una aplicacin de thread sf e
nico
a n
utiliza solo una CPU nica -tr on
a n
a s
h uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Servidores multithread
M no escriba el cdigo para crear nuevos threads de ejecucin, el cdigo se podra ejecutar
Aunque
i n
w en un entorno multithread. Debe tener en cuenta cmo funcionan los threads y cmo escribir el
Ed cdigo con proteccin de thread. Si crea el cdigo para su ejecucin en otra parte del software
(como un servidor de aplicaciones o Middleware), debe consultar la documentacin de los
productos para detectar si se crear los threads de forma automtica. Por ejemplo, en un servidor
de aplicaciones Java EE, existe un componente denominado servlet que se utiliza para manejar
solicitudes HTTP. Los servlets siempre deben tener proteccin de thread porque el servidor inicia
un nuevo thread para cada solicitud HTTP.

Programacin Java SE 7 12-4


Clase Thread

La clase Thread se utiliza para crear e iniciar threads. El


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

cdigo que va a ejecutar un thread se debe colocar en una


clase, lo que:
Ampla la clase Thread
Cdigo ms simple
Implanta la interfaz Runnable
e to
Ms flexible e n s
elic
extends es an libre
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 12-5


Ampliacin de Thread

Ampliar java.lang.Thread y sustituir el mtodo run:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public class ExampleThread extends Thread {


@Override
public void run() {
for(int i = 0; i < 100; i++) {
e to
System.out.println("i:" + i);
e n s
}
elic
a b l
}
fe r
}
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ElM
ara
Mtodo run
cdigo que se va a ejecutar en un nuevo thread de ejecucin se debe colocar en un mtodo
i n
w run. Debe evitar llamar al mtodo run de forma directa. Al llamar al mtodo run no se inicia un
Ed nuevo thread y el efecto no sera diferente de llamar a cualquier otro mtodo.

Programacin Java SE 7 12-6


Inicio deThread

Tras crear un nuevo Thread, se debe iniciar llamando al


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

mtodo Thread start:

public static void main(String[] args) {


ExampleThread t1 = new ExampleThread();
t1.start();
e to
}
e n s
elic
a b l
Programa el mtodo run
fe r
que se va a llamar.
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ElM
ara
Mtodo start
mtodo start se utiliza para comenzar a ejecuta un thread. Java Virtual Machine llamar al
i n
w mtodo run de Thread. Exactamente cuando el mtodo run comienza la ejecucin, la accin
Ed est fuera de su control. Un Thread se puede iniciar solo una vez.

Programacin Java SE 7 12-7


Implantacin de Runnable

Implantar java.lang.Runnable y el mtodo run:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public class ExampleRunnable implements Runnable {


@Override
public void run() {
for(int i = 0; i < 100; i++) {
e to
System.out.println("i:" + i);
e n s
}
elic
a b l
}
fe r
}
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
AlM
ara
Mtodo run
igual que al ampliar Thread, al llamar al mtodo run no se inicia un nuevo thread. La ventaja
i n
w de implantar Runnable es que puede seguir ampliando una clase de su eleccin.
Ed

Programacin Java SE 7 12-8


Ejecucin de instancias Runnable

Tras crear un nuevo Runnable, se debe transferir a un


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

constructor de Thread. El mtodo Thread start comienza


la ejecucin:

public static void main(String[] args) {


ExampleRunnable r1 = new ExampleRunnable();
e to
Thread t1 = new Thread(r1);
e n s
t1.start();
elic
a b l
}
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ElM
ara
Mtodo start
mtodo start de Thread se utiliza para comenzar a ejecutar un thread. Una vez iniciado el
i n
w thread, Java Virtual Machine llamar al mtodo run en el Runnable asociado al Thread.
Ed

Programacin Java SE 7 12-9


Runnable con datos compartidos

Los threads comparten potencialmente campos estticos y de


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

instancia.

public class ExampleRunnable implements Runnable {


private int i;
Variable compartida
potencialmente
@Override
e to
public void run() { e n s
elic
for(i = 0; i < 100; i++) {
a b l
System.out.println("i:" + i); fe r
a n s
}
o n -tr
an
}
} s
ha uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 12-10


Un ejecutable: varios threads
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Varios threads que hacen referencia a un objeto pueden


producir que se acceda de forma simultnea a los campos de
instancia.

public static void main(String[] args) {


ExampleRunnable r1 = new ExampleRunnable();
e to
Thread t1 = new Thread(r1);
e n s
t1.start();
elic
Una nica instancia
a b l
Thread t2 = new Thread(r1); Runnable
fe r
t2.start(); a n s
} o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Varios threads con un Runnable
Mposible transferir una nica instancia Runnable a varias instancias Thread. Solo hay tantas
Es
i n
w instancias Runnable como haya creado. Varias instancias de Thread comparten los campos de
Ed la instancia Runnable.
Varios threads tambin puede acceder de forma simultnea a campos estticos.

Programacin Java SE 7 12-11


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

La creacin de un nuevo thread requiere el uso de:


a. java.lang.Runnable
b. java.lang.Thread
c. java.util.concurrent.Callable

e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 12-12


Problemas con datos compartidos

A los datos compartidos se debe acceder con cuidado.


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Campos de instancia y estticos:


Se crean en un rea de memoria conocida como espacio
de pila.
Cualquier thread los puede compartir de forma potencial.
Varios threads los pueden cambiar de forma simultanea.
No hay ningn compilador o advertencias de IDE. e to
e n s
El acceso de forma segura a campos compartidos es su lic
responsabilidad. ble ra
f e
tr a ns
n-siguiente:
Las diapositivas anteriores pueden producir lo
no
i:0,i:0,i:1,i:2,i:3,i:4,i:5,i:6,i:7,i:8,i:9,i:10,i:12,i:11 ... a
s de
h
) Gui a
El cero se ha
o m
producido dos veces
a ilc dentFuera de la secuencia
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Depuracin de threads
Mdepuracin de threads puede ser difcil porque la frecuencia y la duracin de tiempo de cada
La
i n
w thread asignada puede variar por diferente motivos, entre los que se incluyen:
Ed Un sistema operativo maneja la programacin de threads y los sistemas operativos pueden
usar diferentes algoritmos de programacin.
Las mquinas tienen diferentes recuentos y velocidades de CPU.
Otras aplicaciones pueden estar poniendo carga en el sistema.
Este es uno de esos casos en los que una aplicacin puede parecer que funciona a la perfeccin
mientras se est desarrollando, pero los problemas extraos se pueden manifestar despus de su
produccin debido a las variaciones de programacin. Es su responsabilidad proteger el acceso a
las variables compartidas.

Programacin Java SE 7 12-13


Datos no compartidos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Algunos tipos de variables nunca se comparten. Los siguientes


tipos siempre tienen proteccin de thread:
Variables locales
Parmetros del mtodo
Parmetros de manejador de excepciones
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Datos con proteccin de thread compartidos
M dato compartido que sea inmutable, como los objetos String o campos finales, tiene
Cualquier
i n
w proteccin de thread porque solo se pueden leer y no escribir.
Ed

Programacin Java SE 7 12-14


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Las variables tiene proteccin de thread si son:


a. local
b. static
c. final
d. private
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 12-15


Operaciones atmicas
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Las operaciones atmicas funcionan como una operacin


nica. Una nica sentencia en el lenguaje Java no siempre
es atmica.
i++;
Crea una copia temporal del valor en i.
Incrementa la copia temporal.
e to
Anota el nuevo valor en i. e n s
el ic
l = 0xffff_ffff_ffff_ffff;
a b l
fedos r
s
Es posible acceder a variables de 64 bits mediante
n
operaciones de 32 bits independientes. -tra
n o n
Qu inconsistencias podran encontrarados threads al
incrementar el mismo campo? ) ha
s de
m u i
o nt G
Qu ocurre si dicho campo
a ilc es dlargo?e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
i ( inconsistente
a v
M
Un
ar problema con dos threads que incrementan el mismo campo es que se puede producir
Comportamiento
posible
winuna actualizacin perdida. Imagine si ambos threads leen un valor de 41 de un campo,
Ed incrementan el valor en uno y, a continuacin, anotan los resultados en el campo. Ambos threads
realizarn un incremento pero el valor resultante es solo 42. Segn cmo Java Virtual Machine se
implante y el tipo de CPU fsica que se est usando, es posible que nunca o en raras ocasiones
vea este comportamiento. Sin embargo, siempre debe asumir que esto puede ocurrir.
Si tiene un valor largo de 0x0000_0000_ffff_ffff y lo incrementa en 1, el resultado debe ser
0x0000_0001_0000_0000. Sin embargo, debido a que es vlido acceder a un campo de 64 bits
mediante dos escrituras de 32 bits independientes, podra haber temporalmente un valor de
0x0000_0001_ffff_ffff o incluso 0x0000_0000_0000_0000 segn los bits que se
modifiquen en primer lugar. Si se permite que un segundo thread lea un campo de 64 bits
mientras otro thread lo est modificando, se podra recuperar un valor incorrecto.

Programacin Java SE 7 12-16


Ejecucin desordenada
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Las operaciones realizadas en un thread puede parecer


que no se ejecutan en orden al observar los resultados
desde otro thread.
La optimizacin de cdigo puede dar como resultado una
operacin desordenada.
Los threads funcionan en copias almacenadas en cach de to
variables compartidas. n s e
lice
Para garantizar el comportamiento consistente en los le
b
threads, debe sincronizar sus acciones. era sf
Necesita una forma de establecer que una taccin
- r an ocurra
antes que otra.
n on
Necesita una forma de vaciar de s a los
nuevo cambios en
h a i d e
variables compartidas enmla) memoria
u principal.
i l co ent G
g ma Stud
a v i@
Copyright t h isy/o sus filiales. Todos los derechos reservados.
2011, Oracle

m ar use
vi (e
ara
Sincronizacin de acciones
M thread tiene una memoria de trabajo en la que mantiene su propia copia de trabajo de las
Cada
i n
w variables que se deben usar o asignar. A medida que el thread ejecuta un programa, funciona en
Ed estas copias de trabajo. Existen varias acciones que sincronizarn una memoria de trabajo del
thread con la memoria principal:
Una lectura o escritura voltil de una variable (palabra clave volatile)
Bloqueo o desbloqueo de una supervisin (palabra clave synchronized)
La primera y ltima accin de un thread
Acciones que inician un thread o detectan que un thread ha terminado

Programacin Java SE 7 12-17


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Cul de las siguientes opciones hace que un thread


sincronice variables?
a. Lectura de un campo voltil
b. Llamada a isAlive() en un thread
c. Inicio de un nuevo thread
d. Terminacin de un bloque de cdigo sincronizado e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 12-18


Palabra clave volatile

Un campo puede tener el modificador volatile aplicado:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public volatile int i;

La lectura o escritura de un campo volatile har que un


thread sincronice su memoria de trabajo con la memoria e to
n s
principal.
e l ice
l
volatile no significa atmico. rab fe
t r a ns con
Si i es volatile, i++ todava no es una operacin
proteccin de thread. on-
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Debido a que la manipulacin de los campos volatile puede no ser atmica, no es suficiente

i n M
con realizar lecturas y escrituras de variables nicas con proteccin de thread. Un buen ejemplo
del uso de volatile se muestra en los ejemplos de las siguientes diapositivas sobre la parada
w
Ed de un thread.

Programacin Java SE 7 12-19


Parada de un thread

Un thread se para al terminar su mtodo run.


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public class ExampleRunnable implements Runnable {


public volatile boolean timeToQuit = false;

@Override Variable voltil compartida


e to
public void run() {
e n s
System.out.println("Thread started");
elic
a b l
while(!timeToQuit) {
fe r
// ...
a n s
} o n -tr
System.out.println("Thread finishing");
s an
} ) ha uide
c o m tG
}
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 12-20


Parada de un thread
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public static void main(String[] args) {


ExampleRunnable r1 = new ExampleRunnable();
Thread t1 = new Thread(r1);
t1.start();
// ...
r1.timeToQuit = true;
} e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ElM
ara
Threadprincipal
mtodo main en una aplicacin Java SE que se ejecuta en un thread, a veces denominado
i n
w thread principal, que JVM crea automticamente. Solo con cualquier thread, cuando el thread
Ed principal escribe en el campo timeToQuit, es importante que el thread t1 vea la escritura. Si el
campo timeToQuit no es volatile, no existe ninguna garanta de que la escritura se vea
inmediatamente. Tenga en cuenta que si olvida declarar un campo similar como volatile, una
aplicacin puede funcionar perfectamente para usted pero, de forma ocasional, puede fallar para
otros usuarios.

Programacin Java SE 7 12-21


Palabra clave volatile

La palabra clave synchronized se utiliza para crear bloques


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

de cdigo con proteccin de thread. Un bloque de cdigo


synchronized:
Hace que un thread escriba todos sus cambios en la
memoria principal cuando se alcanza el final del bloque.
Similar a volatile
e to
Se usa para agrupar bloques de cdigo para una e n s
ejecucin exclusiva. elic
a b l
f er
Bloque de threads hasta que obtienen acceso exclusivo
s
n
Resuelve el problema atmico -tra on
a n
a s
h uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 12-22


Mtodos synchronized
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public class ShoppingCart {


private List<Item> cart = new ArrayList<>();
public synchronized void addItem(Item item) {
cart.add(item);
}
public synchronized void removeItem(int index) {
cart.remove(index);
e to
}
e n s
public synchronized void printCart() {
elic
Iterator<Item> ii = cart.iterator();
a b l
fe r
while(ii.hasNext()) {
a n s
Item i = ii.next();
o n -tr
an
System.out.println("Item:" + i.getDescription());
} s
ha uide
}
m tG )
}
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Comportamiento de mtodo sincronizado
Mel ejemplo de la diapositiva, puede llamar solo a un mtodo al mismo tiempo en un objeto
En
i n
w ShoppingCart porque todos sus mtodos estn synchronized. En este ejemplo, la
Ed sincronizacin es por ShoppingCart. Dos instancias ShoppingCart se podran usar de forma
simultnea.
Si los mtodos no estuvieran synchronized, al llamar a removeItem mientras printCart
itera con la recopilacin de Item podra darse un comportamiento inesperado. Un iterador puede
soportar un comportamiento de fallo rpido. Un iterador de fallo rpido devolver
java.util.ConcurrentModificationException, una subclase de RuntimeException,
si la recopilacin del iterador se modifica mientras se est utilizando.

Programacin Java SE 7 12-23


Bloques synchronized
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public void printCart() {


StringBuilder sb = new StringBuilder();
synchronized (this) {
Iterator<Item> ii = cart.iterator();
while (ii.hasNext()) {
Item i = ii.next();
sb.append("Item:"); e to
e n s
sb.append(i.getDescription());
elic
sb.append("\n");
a b l
fe r
}
a n s
}
o n -tr
System.out.println(sb.toString());
s an
}
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Cuellos de botella de sincronizacin
Msincronizacin en aplicaciones multithread garantiza un comportamiento fiable. Debido a que
La
i n
w los bloques y mtodos synchronized se utilizan para restringir una seccin de cdigo a un
Ed nico thread, est creando de forma potencial cuellos de botella de rendimiento. Se pueden usar
los bloques synchronized en lugar de mtodos synchronized para reducir el nmero de
lneas que son exclusivas de un nico thread.
Utilice la sincronizacin lo menos posible para el rendimiento, pero tanto como sea necesario
para garantizar la fiabilidad.

Programacin Java SE 7 12-24


Bloqueo de supervisin de objeto
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Cada objeto en Java se asocia a una supervisin, que un


thread puede bloquear o desbloquear.
Los mtodos synchronized utilizan la supervisin
para el objeto this.
Los mtodos static synchronized utilizan la
supervisin de clases.
e to
Los bloques synchronized deben especificar qu e n s
lic
supervisin del objeto bloquear o desbloquear. ble ra
f e
ns tra
synchronized ( this ) { }
n -
a no
Los bloques synchronized h a s dser
pueden e anidados.
m ) Gu i
o
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i( e
a v
M ar
Bloques synchronized anidados

winsynchronized anidados.
Un thread puede bloquear varias supervisiones de forma simultanea mediante bloques
Ed

Programacin Java SE 7 12-25


Deteccin de interrupcin
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

La interrupcin de un thread es otra posible forma de solicitar


que un thread pare la ejecucin.

public class ExampleRunnable implements Runnable {


@Override
public void run() {
e to
System.out.println("Thread started");
e n s
while(!Thread.interrupted()) {
elic
a b l
// ...
fe r
} Mtodo Thread esttico
a n s
System.out.println("Thread finishing"); o n -tr
} s an
} ) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Interrupcin no significa parada
M se interrumpe un thread, depende del usuario decidir qu accin realizar. Dicha accin
Cuando
i n
w podra ser volver del mtodo run o continuar con la ejecucin del cdigo.
Ed

Programacin Java SE 7 12-26


Interrupcin de un thread

Cada thread tiene un mtodo interrupt() e


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

isInterrupted().

public static void main(String[] args) {


ExampleRunnable r1 = new ExampleRunnable();
Thread t1 = new Thread(r1);
e to
t1.start(); Interrupcin de un thread
e n s
// ...
elic
a b l
t1.interrupt();
fe r
} a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ElM
ara
Ventajas de la interrupcin
uso de funciones de interrupcin de Thread es un modo prctico de parar un thread. Adems
i n
w de eliminar la necesidad de escribir su propia lgica de parada de thread, tambin puede
Ed interrumpir un thread bloqueado. Para obtener ms informacin, consulte
http://download.java.net/jdk7/docs/api/java/lang/Thread.html#interrupt().

Programacin Java SE 7 12-27


Thread.sleep()

Un Thread puede realizar una ejecucin durante un tiempo.


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

long start = System.currentTimeMillis();


try {
Thread.sleep(4000);
} catch (InterruptedException ex) {
e to
// What to do?
e n s
}
interrupt() se llama durante la suspensin
elic
a b l
long time = System.currentTimeMillis() - start;
fe r
System.out.println("Slept for " + time + " ms");
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Cunto tiempo se suspender un thread?
M solicitud de Thread.sleep(4000) significa que un thread desea parar la ejecucin durante
Una
i n
w 4 segundos. Tras 4 segundos transcurridos, el thread se vuelve a programar para la ejecucin.
Ed Esto no significa que el thread se inicie exactamente 4 segundos despus de la llamada a
sleep(), si no que comenzar la ejecucin 4 segundos o ms despus de iniciar la suspensin.
La duracin exacta de la suspensin se ve afectada por el hardware de la mquina, el sistema
operativo y la carga del sistema.
Suspensin interrumpida
Si llama a interrupt() en un thread que est suspendido, la llamada a sleep() devolver
una excepcin InterruptedException que se debe manejar. La forma de manejar la
excepcin depende de cmo est diseada la aplicacin. Si la llamada a interrupt()
simplemente intenta interrumpir la llamada de sleep() y no la ejecucin de un thread, debe
aceptar la excepcin. Otros casos pueden requerir que devuelva la excepcin o regrese desde un
mtodo run().

Programacin Java SE 7 12-28


Prueba

Una llamada a Thread.sleep(4000) causar la ejecucin


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

del thread para que siempre se suspenda durante 4 segundos


a. Verdadero
b. Falso

e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 12-29


Mtodos Thread adicionales

Existen muchos ms Thread y mtodos relacionados con


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

thread:
setName(String), getName() y getId()
isAlive(): Ha finalizado un thread?
isDaemon() y setDaemon(boolean): JVM puede cerrarse
mientras los threads del daemon estn en ejecucin.
join(): un thread actual espera que otro thread finalice.
e to
Thread.currentThread(): las instancias Runnable pueden ens
recuperar la instancia Thread que actualmente est en
l e lic
ejecucin. rab e
sf con
La clase Object tambin tiene mtodos relacionados
a n
tr
thread: on-
wait(), notify() y notifyAll():
s a nlos threads
se pueden
suspender durante un tiempo h a e
iduna notificacin
) indeterminado, reactivndose
solo cuando el Object o m
esperado G u
recibe de
c n t
reactivacin. ail de
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Ms informacin
Mthreads de daemon son threads en segundo plano que son menos importantes que los
Los
i n
w threads normales. Debido a que el thread principal no es un thread de daemon, todos los threads
Ed creados tambin sern threads no de daemon. Cualquier thread no de daemon que est en
ejecucin (activo) evitar que se cierre JVM incluso si se ha devuelto el mtodo main. Si un
thread no debe evitar que JVM se cierre, se debe establecer como un thread de daemon. Hay
ms conceptos y mtodos de multithread sobre los que obtener informacin. Para obtener
material de lectura adicional, consulte
http://download.oracle.com/javase/tutorial/essential/concurrency/further.html.

Programacin Java SE 7 12-30


Mtodos a evitar

Se deben evitar algunos mtodos Thread:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

setPriority(int) y getPriority()
Es posible que no causen ningn impacto o que provoquen
problemas
Los siguientes mtodos estn anticuados y nunca se
deben usar:
e to
destroy() e n s
elic
resume()
a b l
fe r
suspend()
a n s
stop()
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Mtodos anticuados
M interfaces, mtodos, variables y otros componentes de cualquier biblioteca de Java puede
Clases,
i n
w aparecer marcados como anticuados. Los componentes anticuados puede causar un
Ed comportamiento no predecible o simplemente puede que no hayan seguido las convenciones de
nomenclatura adecuadas. Debe evitar usar cualquier API anticuada en las aplicaciones. Las API
anticuadas an se incluyen en las bibliotecas para asegurar la compatibilidad con versiones
anteriores, pero se podran eliminar de forma potencial en futuras versiones de Java.
Para obtener ms informacin sobre los mtodos anticuados mencionados anteriormente,
consulte docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html, que est disponible
en lnea en http://download.oracle.com/javase/7/ o como parte de la documentacin JDK
descargable.

Programacin Java SE 7 12-31


Interbloqueo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

El interbloqueo se produce cuando dos o ms threads se


bloquean para siempre, en espera el uno del otro.

synchronized(obj1) { El thread 1 realiza una pausa


despus de bloquear la
synchronized(obj2) { supervisin de obj1.
}
e to
}
e n s
elic
El thread 2 realiza una pausa a b l
synchronized(obj2) {
fe r
synchronized(obj1) {
despus de bloquear la
supervisin de obj2. a n s
} o n -tr
} s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
M ara
La inanicin e interbloqueo activo son problemas mucho menos comunes que el interbloqueo,
pero an son problemas que es probable que los diseadores de un software actual encuentren.
i n
w Inanicin
Ed La inanicin describe una situacin en la que un thread no ha podido obtener acceso normal a
recursos compartidos y no podr realizar progresos. Esto ocurre cuando los recursos compartidos
dejan de estar disponibles durante largos perodos por threads "abusivos". Por ejemplo, suponga
que un objeto proporciona un mtodo sincronizado que a menudo tarda mucho tiempo en volver.
Si un thread llama a este mtodo de forma frecuente, otros threads que tambin necesiten acceso
sincronizado de forma frecuente al mismo objeto se bloquearn con frecuencia.
Interbloqueo activo
Un thread a menudo acta en respuesta a la accin de otro thread. Si la accin del otro thread es
tambin respuesta a la accin de otro thread, puede da lugar a un interbloqueo activo. Al igual
que ocurre con un interbloqueo, los threads con un interbloqueo activo no pueden avanzar. Sin
embargo, los threads que no estn bloqueados, simplemente estn demasiado ocupados
respondindose como para reanudar el trabajo.

Programacin Java SE 7 12-32


Resumen
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta leccin, debe haber aprendido a hacer lo siguiente:


Describir la programacin de tareas del sistema operativo
Definir un thread
Crear threads
Gestionar threads
Sincronizar threads que acceden a datos compartidos e to
n s
Identificar posibles problemas de threads e l ice
l b
f e ra
an s
- t r
n on
s a
) a
h uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
e ma us
a v i(
a r
i n M
w
Ed

Programacin Java SE 7 12-33


Visin general de la prctica 12-1:
Sincronizacin de acceso a datos compartidos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica, se abordan los siguientes temas:


Impresin de ID de thread
Uso de Thread.sleep()
Sincronizacin de un bloque de cdigo

e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
En esta prctica, escribir una clase agregada a una aplicacin multithread existente. Debe crear
una clase con proteccin de thread.
w i n
Ed

Programacin Java SE 7 12-34


Visin general de la prctica 12-2:
Implantacin de un programa multithread
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica, se abordan los siguientes temas:


Implantacin de Runnable
Inicio de Thread
Comprobacin del estado de un Thread
Interrupcin de un Thread
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
En esta prctica, crear, iniciar e interrumpir threads bsicos mediante la interfaz Runnable.

i n M
w
Ed

Programacin Java SE 7 12-35


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Ed
w i n M
ara
v i
( e m a r a
u
@
s
a
vi e thi
il c o
gm s Stu
d
)
e n
s
m tG
o
ha uide
an
tr n -
a n s fe
r
a b l el
ic
e n s e
to
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Simultaneidad

e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
Objetivos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Al finalizar esta leccin, debera estar capacitado para:


Usar variables atmicas
Usar ReentrantReadWriteLock
Usar recopilaciones java.util.concurrent
Describir las clases de sincronizador
Usar ExecutorService para ejecutar tareas de e to
e n s
forma simultnea
le lic
Aplicar el marco Fork-Join a b
er f
t r a ns
no n-
a
s de
h
) Gui a
o m
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 13-2


Paquete java.util.concurrent

Java 5 introdujo el paquete java.util.concurrent, que


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

contiene clases que son tiles en la programacin simultnea.


Sus funciones incluyen:
Recopilaciones simultneas
Alternativas de sincronizacin y bloqueo
Pools de threads e to
e n s
Pools de recuento de threads dinmicos y fijos disponibles lic
b le
Metodologa "divide y vencers" paralela (Fork-Join),anueva
r
en Java 7 sfe an
- t r
n on
s a
) a
h uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
e ma us
a v i(
a r
i n M
w
Ed

Programacin Java SE 7 13-3


Paquete java.util.concurrent.atomic

El paquete java.util.concurrent.atomic contiene


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

clases que soportan la programacin con proteccin de thread


y bloqueo libre en variables nicas.

AtomicInteger ai = new AtomicInteger(5);


if(ai.compareAndSet(5, 42)) { e to
e n s
System.out.println("Replaced 5 with 42");
le lic
} r a b
Una operacin atmica garantiza sf e
que el valor actual sea 5 y, a
tr a n
continuacin, se defina en 42.
o n -
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Operacin no bloqueante
Marquitecturas de CPU que soportan una operacin de definicin y comparacin nativa, no ser
En
i n
w necesario bloquear al ejecutar el ejemplo que se muestra. Otras arquitecturas pueden requerir
Ed alguna forma de bloqueo interno.

Programacin Java SE 7 13-4


Paquete java.util.concurrent.locks

El paquete java.util.concurrent.locks es un marco


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

para bloquear y esperar condiciones que es distinto de las


supervisiones y sincronizacin incorporadas.
public class ShoppingCart {
private final ReentrantReadWriteLock rwl =
new ReentrantReadWriteLock(); e to
e n s
Bloqueo de nico
el ic
public void addItem(Object o) b l
{escritor, varios lectores
a
s f er
rwl.writeLock().lock();
- t r an
n de escritura
// modify shopping cartnoBloqueo
s a
a
h uide
rwl.writeLock().unlock();
)
} com t G il den
a
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Bloqueo de varios lectores, nico escritor
M de las funciones del paquete java.util.concurrent.locks es la implantacin de un
Una
i n
w bloqueo de varios lectores, nico escritor. Es posible que un thread no tenga ni obtenga un
Ed bloqueo de lectura mientras est en uso un bloqueo de escritura. Varios threads pueden adquirir
simultneamente el bloqueo de lectura pero solo uno puede adquirir el bloqueo de escritura. El
bloqueo es reentrante; un thread que ya ha adquirido el bloqueo de escritura puede llamar a
mtodos adicionales que tambin obtengan el bloqueo de escritura sin miedo al bloqueo.

Programacin Java SE 7 13-5


java.util.concurrent.locks
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public String getSummary() {


String s = "";
rwl.readLock().lock();
// read cart, modify s Bloqueo de lectura
rwl.readLock().unlock();
e to
return s; Todos los mtodos de solo n s
lectura se pueden ejecutarlice
} le
de forma simultnea.
a b
public double getTotal() { s f er
-
// another read-only method t r an
n on
} a s de
} h
) Gui a
o m
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Varias lecturas simultneas
Mel ejemplo, todos los mtodos determinados como de solo lectura pueden agregar el cdigo
En
i n
w necesario para bloquear y desbloquear un bloqueo de lectura. ReentrantReadWriteLock
Ed permite la ejecucin simultnea de ambos, un nico mtodo de solo lectura y varios mtodos de
solo lectura.

Programacin Java SE 7 13-6


Recopilaciones con proteccin de thread

Las recopilaciones de java.util no tienen proteccin de


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

thread. Para usar recopilaciones en modo de proteccin de


thread:
Usar bloques de cdigo sincronizados para todos los
accesos a una recopilacin si se realizan escrituras
Crear un envoltorio sincronizado mediante mtodos de
e to
biblioteca, como e n s
i c
le l
java.util.Collections.synchronizedList(List<T>)
b
Usar recopilaciones java.util.concurrent fera
Nota: el hecho de que una Collection se cree t r a ns
con
o n -
a n tengan
proteccin de thread, no hace que sus elementos
s
proteccin de thread. ha ide ) Gu
o m
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
(ema us
v i
a ra
Recopilaciones simultneas
M
La clase ConcurrentLinkedQueue proporciona una cola FIFO no bloqueante con proteccin
winde thread escalable eficaz. Cinco implantaciones en java.util.concurrent soportan la
Ed interfaz ampliada BlockingQueue, que define las versiones de bloqueo de colocacin y captura:
LinkedBlockingQueue, ArrayBlockingQueue, SynchronousQueue,
PriorityBlockingQueue y DelayQueue.
Adems de las colas, este paquete proporciona implantaciones de Collection diseadas para
su uso en contextos multithread: ConcurrentHashMap, ConcurrentSkipListMap,
ConcurrentSkipListSet, CopyOnWriteArrayList y CopyOnWriteArraySet. Cuando se
espera que muchos threads accedan a la recopilacin proporcionada, normalmente se prefiere
ConcurrentHashMap a HashMap sincronizado, y normalmente se prefiere
ConcurrentSkipListMap a TreeMap sincronizado. Se prefiere CopyOnWriteArrayList a
ArrayList sincronizado cuando el nmero esperado de lecturas y transversales supera en gran
medida el nmero de actualizaciones en una lista.

Programacin Java SE 7 13-7


Prueba

CopyOnWriteArrayList garantiza la proteccin de thread


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

de los objetos agregados a List.


a. Verdadero
b. Falso

e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 13-8


Sincronizadores

El paquete java.util.concurrent proporciona cinco


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

clases que ayudan a las expresiones de sincronizacin con un


objetivo especial comn.
Clase Descripcin

Semaphore Semaphore es una herramienta de simultaneidad clsica.

e to
CountDownLatch Utilidad todava muy simple y muy comn para bloquear hasta
e n s
que se contenga un nmero determinado de seales, eventos o
elic
condiciones.
a b l
CyclicBarrier fe r
Punto de sincronizacin multidireccional reajustable til en
a n s
algunos estilos de programacin paralela.
o n -tr
Phaser Proporciona una forma ms flexible de
a n barrera que se puede
usar para controlar el clculo en
h a s dentre
fases
e varios threads.
Exchanger Permite a dos threads m ) Guobjetos
intercambiar
i en un punto de
o t
encuentro y esltil
a i c en distintos
d e n diseos de pipeline.
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
i (sincronizador permiten a los threads bloquear hasta que se alcanza determinado
a v
Las clases de
M aro accin.
estado
winSemaphore: Semaphore mantiene un juego de permisos. Los threads tratan de adquirir permisos
Ed y se pueden bloquear hasta que otros threads liberen permisos.
CountDownLatch: CountDownLatch permite a uno o ms threads esperar (bloquear) hasta la
finalizacin de una cuenta atrs. Una vez finalizada la cuenta atrs, todos los threads en espera
continan. CountDownLatch no se puede volver a usar.
CyclicBarrier: se crea con un recuento de terceros. Despus de llamar a un nmero de
partes (threads) en espera de CyclicBarrier, se liberarn (desbloquearn). CyclicBarrier
se puede volver a usar.
Phaser: una versin ms verstil de CyclicBarrier, nuevo en Java 7. Las partes pueden
registrar y anular el registro durante un perodo de tiempo, lo que provoca que el nmero de
threads necesarios antes del avance cambie.
Exchanger: permite a dos threads intercambiar un par de objetos, bloqueando hasta que se
realice el intercambio. Es una alternativa bidireccional de memoria eficaz a SynchronousQueue.

Programacin Java SE 7 13-9


java.util.concurrent.CyclicBarrier

CyclicBarrier es un ejemplo de categora de sincronizador


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

de clases proporcionada por java.util.concurrent.

final CyclicBarrier barrier = new CyclicBarrier(2);

new Thread() {
public void run() {
Dos threads deben permanecer
en espera antes de que se e to
try { puedan desbloquear.
e n s
elic
No se puede
System.out.println("before await - thread 1");
a b l
alcanzar. barrier.await();
fe r
System.out.println("after await - thread 1");
a n s
} catch (BrokenBarrierException|InterruptedException ex) {
o n -tr
s an
ha uide
}
}
m tG )
c o n
}.start();
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
i ( comportamiento
a v
M
En
ar
CyclicBarrier:
este ejemplo, si solo un thread llama a await() en la barrera, dicho thread se puede
winbloquear para siempre. Despus de que un segundo thread llame a await(), cualquier llamada
Ed adicional a await() se volver a bloquear hasta que se alcance el nmero de threads necesario.
CyclicBarrier contiene un mtodo await(long timeout, TimeUnit unit), que se
bloquear durante una duracin especificada y devolver una excepcin TimeoutException si
se alcanza dicha duracin.

Programacin Java SE 7 13-10


Alternativas de threads de alto nivel

Puede resultar difcil usar las API relacionadas con el Thread


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

tradicional de forma correcta. Las alternativas incluyen:


java.util.concurrent.ExecutorService,
mecanismo de mayor nivel usado para ejecutar tareas
Puede crear y volver a usar objetos de Thread para el
usuario. to
Permite ejecutar el trabajo y comprobar los resultados en el ens
e
ic
futuro. le l b
Marco Fork-Join, servicio ExecutorService defera
s 7
anJava
extraccin de trabajo especializado, nuevotren
o n -
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Alternativas de sincronizacin
Mbloques de cdigo sincronizados se utilizan para garantizar que a los datos que no tienen
Los
i n
w proteccin de thread no podrn acceder de forma simultnea varios threads. Sin embargo, el uso
Ed de bloques de cdigo sincronizados puede generar cuellos de botella de rendimiento. Varios
componentes del paquete java.util.concurrent proporcionan alternativas para usar
bloques de cdigo sincronizados. Adems de aprovechar recopilaciones simultneas, colas y
sincronizadores, existe otra forma de garantizar que a los datos no accedern de manera
incorrecta varios threads: simplemente no permitir que varios threads procesen los mismos datos.
En algunos casos, puede ser posible crear varias copias de los datos en RAM y permitir que
cualquier thread procese una nica copia.

Programacin Java SE 7 13-11


java.util.concurrent.ExecutorService

ExecutorService se utiliza para ejecutar tareas.


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Elimina la necesidad de crear y gestionar threads de


forma manual.
Las tareas se pueden ejecutar en paralelo segn la
implantacin de ExecutorService.
Las tareas pueden ser: e to
java.lang.Runnable e n s
elic
java.util.concurrent.Callable a b l
La implantacin de instancias se puede obtener f
scon er
a n
Executors. n-tr no
a
s de
ExecutorService es = Executors.newCachedThreadPool();
h
) Gui a
o m
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
i ( de ExecutorService
a v
Comportamiento
M
Un
ar
pool de threads almacenado en cach ExecutorService:
win Crea nuevos threads segn sea necesario.
Ed Vuelve a usar sus threads (dichos threads no mueren tras la finalizacin de la tarea).
Termina los threads que han estado inactivos durante 60 segundos.
Otros tipos de implantaciones de ExecutorService disponibles:
int cpuCount = Runtime.getRuntime().availableProcessors();
ExecutorService es = Executors.newFixedThreadPool(cpuCount);
Un pool de threads fijo ExecutorService:
Contiene un nmero fijo de threads.
Vuelve a usar sus threads (dichos threads no mueren tras la finalizacin de la tarea).
Se pone en cola hasta que un thread est disponible.
Se podra usar para evitar el exceso de trabajo en un sistema con tareas con ms uso de
CPU.

Programacin Java SE 7 13-12


java.util.concurrent.Callable

La interfaz Callable:
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Define una tarea ejecutada en ExecutorService.


Es similar en naturaleza a Runnable, pero puede:
Devolver un resultado mediante genricos.
Devolver una excepcin comprobada.
e to
e n s
package java.util.concurrent;
elic
public interface Callable<V> {
a b l
fe r
V call() throws Exception;
a n s
}
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 13-13


java.util.concurrent.Future

La interfaz Future se utiliza para obtener resultados de un


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

mtodo V call() de Callable.


ExecutorService controla
cundo se ha realizado el trabajo.

Future<V> future = es.submit(callable);


//submit many callables
try { Obtiene el resultado del mtodo call de e to
Callable (bloquea si es necesario).
e n s
V result = future.get();
elic
} catch (ExecutionException|InterruptedException ex) {
a b l
fe r
a n s
} Si Callable devuelve
o n -tr
an
una Exception.
s
ha uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Espera de un futuro
M a que la llamada a Future.get() se bloquear, debe realizar una de las siguientes
Debido
i n
w acciones:
Ed Enve todo el trabajo a ExecutorService antes de llamar a ningn mtodo
Future.get().
Est preparado para esperar que Future obtenga el resultado.
Utilice un mtodo no bloqueante como Future.isDone() antes de llamar a
Future.get() o utilice Future.get(long timeout, TimeUnit unit), que
devolver una excepcin TimeoutException si el resultado no est disponible en una
duracin determinada.

Programacin Java SE 7 13-14


Cierre de ExecutorService

El cierre de ExecutorService es importante porque sus


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

threads son threads de no daemons y evitarn que JVM se


cierre.

Pare la aceptacin de
nuevos Callable.
es.shutdown();
e to
Si desea esperar que las
e n s
try { acciones Callable finalicen.
elic
es.awaitTermination(5, TimeUnit.SECONDS);
a b l
fe r
} catch (InterruptedException ex) {
a n s
System.out.println("Stopped waiting early");
o n -tr
}
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 13-15


Prueba

ExecutorService siempre intentar usar todas las CPU


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

disponibles en un sistema.
a. Verdadero
b. Falso

e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 13-16


E/S simultnea
Las llamadas de bloqueo secuencial se ejecutan en una duracin
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

de tiempo ms larga que las llamadas de bloqueo simultneo.

e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Reloj
ara
M diferentes formas de medir el tiempo. En el grfico se muestran cinco llamadas
Existen
i n
w secuenciales a servidores de red que tardarn aproximadamente 10 segundos si cada llamada
Ed dura 2 segundos. En la parte derecha del grfico, cinco llamadas simultneas a los servidores de
red solo tardan un poco ms de 2 segundos si cada llamada dura 2 segundos. Ambos ejemplos
usan aproximadamente la misma cantidad de tiempo de CPU, la cantidad de ciclos de CPU
consumidos, pero tienen diferentes duraciones en conjunto o tiempo real.

Programacin Java SE 7 13-17


Cliente de red de thread nico
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public class SingleThreadClientMain {


public static void main(String[] args) {
String host = "localhost";
for (int port = 10000; port < 10010; port++) {
RequestResponse lookup =
new RequestResponse(host, port);
try (Socket sock = new Socket(lookup.host, lookup.port);
Scanner scanner = new Scanner(sock.getInputStream());){
e to
lookup.response = scanner.next();
e n s
System.out.println(lookup.host + ":" + lookup.port + " " +
elic
lookup.response);
a b l
} catch (NoSuchElementException|IOException ex) {
fe r
System.out.println("Error talking to " + host + ":" +
a n s
port);
o n -tr
an
}
}
s
ha uide
}
m tG )
}
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Llamada sncrona
Mel ejemplo de esta diapositiva, estamos intentado detectar el proveedor que ofrece el precio
En
i n
w ms bajo para un artculo. El cliente comunicar con los 10 servidores de red distintos, cada
Ed servidor tardar aproximadamente dos segundos en buscar los datos solicitados y devolverlos. Es
posible que haya retrasos adicionales introducidos por la latencia de red.
Este cliente de thread nico debe esperar que cada servidor responda antes de moverse a otro
servidor. Son necesarios cerca de 20 segundos para recuperar todos los datos.

Programacin Java SE 7 13-18


Cliente de red multithread (parte 1)
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public class MultiThreadedClientMain {


public static void main(String[] args) {
//ThreadPool used to execute Callables
ExecutorService es = Executors.newCachedThreadPool();
//A Map used to connect the request data with the result
Map<RequestResponse,Future<RequestResponse>> callables =
new HashMap<>();

e to
String host = "localhost";
e n s
//loop to create and submit a bunch of Callable instances
elic
for (int port = 10000; port < 10010; port++) {
a b l
RequestResponse lookup = new RequestResponse(host, port);
fe r
NetworkClientCallable callable =
a n s
new NetworkClientCallable(lookup);
o n -tr
an
Future<RequestResponse> future = es.submit(callable);
callables.put(lookup, future);
s
ha uide
}
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Llamada asncrona
Mel ejemplo de esta diapositiva, estamos intentado detectar el proveedor que ofrece el precio
En
i n
w ms bajo para un artculo. El cliente comunicar con los 10 servidores de red distintos, cada
Ed servidor tardar aproximadamente dos segundos en buscar los datos solicitados y devolverlos. Es
posible que haya retrasos adicionales introducidos por la latencia de red.
Este cliente multithread no espera que cada servidor responda antes de intentar comunicarse con
otro servidor. Son necesarios cerca de 2 segundos en lugar de 20 para recuperar todos los datos.

Programacin Java SE 7 13-19


Cliente de red multithread (parte 2)
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

//Stop accepting new Callables


es.shutdown();

try {
//Block until all Callables have a chance to finish
es.awaitTermination(5, TimeUnit.SECONDS);
} catch (InterruptedException ex) {
System.out.println("Stopped waiting early");
e to
}
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 13-20


Cliente de red multithread (parte 3)
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

for(RequestResponse lookup : callables.keySet()) {


Future<RequestResponse> future = callables.get(lookup);
try {
lookup = future.get();
System.out.println(lookup.host + ":" + lookup.port + " " +
lookup.response);
} catch (ExecutionException|InterruptedException ex) {
//This is why the callables Map exists
e to
//future.get() fails if the task failed
e n s
System.out.println("Error talking to " + lookup.host +
elic
":" + lookup.port);
a b l
}
fe r
}
a n s
}
o n -tr
an
}
s
ha uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 13-21


Cliente de red multithread (parte 4)
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public class RequestResponse {


public String host; //request
public int port; //request
public String response; //response

public RequestResponse(String host, int port) {


this.host = host;
this.port = port;
e to
}
e n s
elic
// equals and hashCode
a b l
fe r
}
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 13-22


Cliente de red multithread (parte 5)
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public class NetworkClientCallable implements Callable<RequestResponse> {


private RequestResponse lookup;

public NetworkClientCallable(RequestResponse lookup) {


this.lookup = lookup;
}

@Override
e to
public RequestResponse call() throws IOException {
e n s
try (Socket sock = new Socket(lookup.host, lookup.port);
elic
Scanner scanner = new Scanner(sock.getInputStream());) {
a b l
lookup.response = scanner.next();
fe r
return lookup;
a n s
}
o n -tr
an
}
}
s
ha uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 13-23


Paralelismo

Los sistemas modernos contienen varias CPU. Para sacar


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

partido de la potencia de procesamiento en un sistema es


preciso ejecutar tareas en paralelo en varias CPU.
Divide y vencers: una tarea se debe dividir en subtareas.
Debe intentar identificar aquellas subtareas que se puedan
ejecutar en paralelo.
Puede ser difcil ejecutar algunos problemas como tareas e to
n s
paralelas.
e l ice
a l
bque
Algunos problemas son ms sencillos. Los servidores r
soportan varios clientes pueden usar una tarea n s fe
independiente para manejar cada cliente. n - tra
a no
Tenga cuidado con el hardware.
h a sLa programacin
d e de
demasiadas tareas paralelas m ) puede i
uafectar de forma
c o t G
ail den
negativa al rendimiento.
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
SiM
ara
Recuento de CPU
las tareas requieren muchos clculos, al contrario de operaciones que generan muchas E/S, el
i n
w nmero de tareas paralelas no debe superar en gran cantidad el nmero de procesadores del
Ed sistema. Puede detectar el nmero de procesadores de forma sencilla en Java:
int count = Runtime.getRuntime().availableProcessors();

Programacin Java SE 7 13-24


Sin paralelismo

Los sistemas modernos contienen varias CPU. Si no


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

aprovecha los threads de alguna forma, solo se utilizar


una parte de la potencia de procesamiento del sistema.

e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
SiM
ara
Definicin de etapa
tiene una gran cantidad de datos que procesar pero solo un thread para procesar dichos datos,
i n
w se utilizar una nica CPU. En el grfico de la diapositiva, se va a procesar un gran nmero de
Ed datos (una matriz, posiblemente). El procesamiento de matriz podra ser una tarea simple, como
buscar el valor ms alto en la matriz. En un sistema de cuatro CPU, debe haber tres CPU
inactivas mientras se procesa la matriz.

Programacin Java SE 7 13-25


Paralelismo Naive
Una solucin paralela simple divide los datos que se van a
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

procesar en varios juegos. Un juego de datos para cada CPU


y un thread para procesar cada juego de datos.

e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Divisin de datos
Mel grfico de la diapositiva, un gran juego de datos (una matriz, posiblemente) se divide en
En
i n
w cuatro subjuegos de datos, uno para cada CPU. Se crea un thread por CPU para procesar los
Ed datos. Tras el procesamiento de los subjuegos de datos, los resultados se tendrn que combinar
de una forma significativa. Hay distintas formas de subdividir el juego de datos grande que se va
a procesar. Se usara demasiada memoria para crear una nueva matriz por thread que contenga
una copia de una parte de la matriz original. Cada matriz puede compartir una referencia a una
nica matriz grande pero solo acceder a un subjuego de una forma con proteccin de thread no
bloqueante.

Programacin Java SE 7 13-26


La necesidad de un marco Fork-Join

La divisin de juegos de datos en subjuegos con el mismo tamao


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

para cada thread que se va a procesar tiene un par de problemas.


Lo ideal es que todas las CPU se utilicen completamente hasta
que la tarea finalice pero:
Las CPU se pueden ejecutar a diferentes velocidades.
Las tareas que no son de Java requieren tiempo de CPU y
pueden reducir el tiempo del que dispone un thread de Java
e to
para la ejecucin en una CPU. n s
Los datos que se analizan e l ice
pueden requerir diferentes r a bl
n s fe
cantidades de tiempo para
n - tra
el proceso. no a
a s
h uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 13-27


Extraccin de trabajo

Para mantener varios threads ocupados:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Divida los datos que se van a procesar en un gran


nmero de subjuegos.
Asigne los subjuegos de datos a una cola de
procesamiento de threads.
Cada thread tendr muchos
e to
subjuegos en cola. e n s
Si un thread finaliza todos sus subjuegos le lic
a b
pronto, puede extraer subjuegos s f er
n
de otro thread. -tra on
a n
a s
h uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
AlM
ara
Granularidad de trabajo
subdividir los datos que se van a procesar hasta que haya ms subjuegos que threads, se est
i n
w facilitando la "extraccin de trabajo". En la extraccin de trabajo, un thread que se queda sin
Ed trabajo puede extraer trabajo (un subjuego de datos) de la cola de procesamientos de otro thread.
Debe determinar el tamao ptimo del trabajo que desee agregar a cada cola de procesamiento
de thread. La subdivisin excesiva de datos que se van a procesar pueden causar una
sobrecarga innecesaria, mientras que una divisin insuficiente de datos puede dar como
resultado una infrautilizacin de la CPU.

Programacin Java SE 7 13-28


Ejemplo de thread nico
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

int[] data = new int[1024 * 1024 * 256]; //1G


Juego de datos muy grande.
for (int i = 0; i < data.length; i++) {
data[i] = ThreadLocalRandom.current().nextInt();
}
Llenar la matriz con valores.

int max = Integer.MIN_VALUE; e to


e n s
for (int value : data) {
el ic
if (value > max) {
a b l
Buscar de forma secuencial la
fe r
max = value; matriz para el valor mayor.
a n s
}
o n -tr
}
s an
System.out.println("Max value found:" + max);
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Paralelo potencial
Meste ejemplo hay dos tareas independientes que se podran ejecutar en paralelo. La
En
i n
w inicializacin de la matriz con valores aleatorios y la bsqueda de la matriz del mayor valor
Ed posible podran hacerse en paralelo.

Programacin Java SE 7 13-29


java.util.concurrent.ForkJoinTask<V>

Un objeto ForkJoinTask representa una tarea que se va a


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

ejecutar.
Una tarea contiene el cdigo y los datos que se van a
procesar. Similar a Runnable o Callable.
Un nmero pequeo de threads en un pool Fork-Join crea
y procesa un gran nmero de tareas.
ForkJoinTask normalmente crea ms instancias e to
ForkJoinTask hasta que los datos que se van procesar se ens
ic
subdividen de forma adecuada. le l b
ra
Los desarrolladores normalmente utilizan las siguientes
f e
s
subclases: ran -t
RecursiveAction: si una tarea no n on que devolver un
tiene
resultado. s a
)
RecursiveTask: si una tarea
a de devolver un
h tieneuique
resultado. c o m tG
il n
a tude
g sSm
i @ hi y/o sus filiales. Todos los derechos reservados.
v 2011,e Oracle
t
a
Copyright
r
e ma us
a v i(
a r
i n M
w
Ed

Programacin Java SE 7 13-30


Ejemplo de RecursiveTask
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

public class FindMaxTask extends RecursiveTask<Integer> {


private final int threshold;
private final int[] myArray; Tipo de resultado de la tarea.
private int start;
private int end; Datos a procesar.

public FindMaxTask(int[] myArray, int start, int end, e to


e n s
int threshold) {
elic
// copy parameters to fields
a b l
} Dnde se realiza el trabajo. Observe
fe r
el tipo de devolucin genrica.
a n s
protected Integer compute() {
o n -tr
// shown later
s an
}
) ha uide
}
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 13-31


Estructura de compute
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

protected Integer compute() {


if DATA_SMALL_ENOUGH {
PROCESS_DATA
return RESULT;
} else {
SPLIT_DATA_INTO_LEFT_AND_RIGHT_PARTS
TASK t1 = new TASK(LEFT_DATA); e to
e n s
t1.fork(); Ejecucin asncrona
elic
TASK t2 = new TASK(RIGHT_DATA);
a b l
fe r
return COMBINE(t2.compute(), t1.join());
a n s
}
o n -tr
} Proceso en el thread actual
an
Bloquear hasta que se termine
s
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 13-32


Ejemplo de compute (por debajo del umbral)
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

protected Integer compute() {


Umbral decidido
if (end - start < threshold) { por el usuario
int max = Integer.MIN_VALUE;
for (int i = start; i <= end; i++) {
Rango en la
int n = myArray[i];
matriz if (n > max) {
max = n; e to
e n s
}
elic
}
a b l
fe r
return max;
a n s
} else {
o n -tr
// split data and create tasks
s an
}
) ha uide
}
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 13-33


Ejemplo de compute (por encima del umbral)
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

protected Integer compute() {


if (end - start < threshold) {
// find max
} else {
int midway = (end - start) / 2 + start;
FindMaxTask a1 = Tarea para la mitad izquierda de los datos
new FindMaxTask(myArray, start, midway, threshold); e to
e n s
a1.fork();
Tarea para la mitad elic
FindMaxTask a2 = derecha de los datos a b l
fe r
new FindMaxTask(myArray, midway + 1, end, threshold);
a n s
return Math.max(a2.compute(), a1.join());
o n -tr
}
s an
}
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Gestin de memoria
M que la misma matriz se transfiere a cada tarea pero con diferentes valores de inicio y
Observe
i n
w finalizacin. Si el subjuego de valores que se va a procesar se copiara en una matriz cada vez
Ed que se crea una tarea, el uso de la memoria aumentara rpidamente.

Programacin Java SE 7 13-34


Ejemplo de ForkJoinPool

ForkJoinPool se utiliza para ejecutar ForkJoinTask.


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Crea un thread para cada CPU en el sistema por defecto.

ForkJoinPool pool = new ForkJoinPool();


FindMaxTask task =
new FindMaxTask(data, 0, data.length-1, data.length/16);
e to
Integer result = pool.invoke(task);
e n s
elic
a b l
El mtodo compute de la tarea fe r
se llama automticamente.
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 13-35


Recomendaciones del marco Fork-Join

Evite operaciones de bloqueo o E/S.


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Solo se crea un thread por CPU por defecto. Las


operaciones de bloqueo evitarn el uso de todos los
recursos de CPU.
Conozca el hardware.
Una solucin Fork-Join se ejecutar de forma ms lenta en
un sistema de una CPU que en una solucin secuencial e to
estndar. n s
e l ice
Algunas CPU aumentan la velocidad solo cuando usanbun
a l
nico ncleo, lo que podra compensar de forma potencial
e r
fpor
cualquier aumento de rendimiento proporcionado a n s Fork-
- t r
Join. on
Conozca el problema. s an
Muchos de los problemas ) ha una
tienen u i e
dsobrecarga adicional si
o m t G
se ejecutan en paralelo
a ilc (ordenacin
d e n paralela, por ejemplo).

@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i( e
rav
Ordenacin paralela
a
nAlM
utilizar Fork-Join para ordenar una matriz en paralelo, se termina ordenando muchas pequeas
i
w matrices que, a continuacin, se combinan en matrices ordenadas ms grandes. Para ver un
Ed ejemplo, consulte la aplicacin de ejemplo proporcionada con JDK en C:\Program
Files\Java\jdk1.7.0\sample\forkjoin\mergesort.

Programacin Java SE 7 13-36


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

La aplicacin del marco Fork-Join siempre dar como


resultado un aumento del rendimiento.
a. Verdadero
b. Falso

e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 13-37


Resumen
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta leccin, debe haber aprendido a hacer lo siguiente:


Usar variables atmicas
Usar ReentrantReadWriteLock
Usar recopilaciones java.util.concurrent
Describir las clases de sincronizador
Usar ExecutorService para ejecutar tareas de forma e to
e n s
simultnea
le lic
Aplicar el marco Fork-Join a b
er f
t r a ns
no n-
a
s de
h
) Gui a
o m
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 13-38


(Opcional) Visin general de la prctica 13-1:
Uso del paquete java.util.concurrent
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica, se abordan los siguientes temas:


Uso de un pool de threads almacenado en cach
(ExecutorService)
Implantacin de Callable
Recepcin de resultados de Callable con Future
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
En esta prctica, va a crear un cliente de red multithread.
M
w i n
Ed

Programacin Java SE 7 13-39


(Opcional) Visin general de la prctica 13-2:
Uso del marco Fork-Join
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica, se abordan los siguientes temas:


Ampliacin de RecursiveAction
Creacin y uso de ForkJoinPool

e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
En esta prctica, va a crear un cliente de red multithread.
M
w i n
Ed

Programacin Java SE 7 13-40


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Creacin de aplicaciones de
base de datos con JDBC
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
Objetivos
Al finalizar esta leccin, debera estar capacitado para:
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Definir el diseo de la API de JDBC


Conectarse a una base de datos mediante un controlador
JDBC
Enviar consultas y obtener resultados de la base de datos
Especificar informacin sobre el controlador JDBC de
forma externa e to
n s
Usar transacciones con JDBC
e l ice
l
Usar RowSetProvider y RowSetFactory de JDBC rab 4.1 fe
ns separar
Usar un patrn de objeto de acceso a datosrapara
t
datos y mtodos de negocio o n -
n a
a s
h uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 14-2


Uso de la API de JDBC
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

2
e to
e n s
elic
a b l
3
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
La API de JDBC se compone de algunas clases determinadas, como Date, Time y

i n M
SQLException, as como de un juego de interfaces que se implantan en una clase de
w controlador proporcionada por el proveedor de base de datos.
Ed Debido a que la implantacin es una instancia vlida de la firma de mtodo de interfaz, una vez
que se cargan las clases de controlador del proveedor de base de datos, puede acceder a ellas
siguiendo la secuencia que se muestra en la diapositiva:
1. Utilice la clase DriverManager para obtener una referencia a un objeto Connection
mediante el mtodo getConnection. La firma tpica de este mtodo es getConnection
(url, name, password), donde url es la URL de JDBC y name y password son
cadenas que la base de datos aceptar para una conexin.
2. Use el objeto Connection (implantado por alguna clase proporcionada por el proveedor)
para obtener una referencia a un objeto Statement mediante el mtodo
createStatement. La firma tpica para este mtodo es createStatement () sin
argumentos.
3. Utilice el objeto Statement para obtener una instancia de ResultSet a travs de un
mtodo executeQuery (query). Este mtodo normalmente acepta una cadena (query)
donde query es una SQL de cadena esttica.

Programacin Java SE 7 14-3


Uso de clases de controlador de proveedor

La clase DriverManager se utiliza para obtener una instancia


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

de un objeto de conexin, mediante el controlador JDBC


nombrado en la URL de JDBC:
String url = "jdbc:derby://localhost:1527/EmployeeDB";
Connection con = DriverManager.getConnection (url);
La sintaxis de URL para un controlador JDBC es:
e to
jdbc:<driver>:[subsubprotocol:][databaseName][;attribute=value]
e n s
Cada proveedor puede implantar su propio subprotocolo. lic
a b le
La sintaxis de URL para un controlador Thin de Oracle
er es:
nsf
jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE
t r a
Ejemplo: n- n o
jdbc:oracle:thin:@//myhost:1521/orcl s a
h
) Gu a i d e
o m
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i( e
a v
Los
ar
DriverManager
M controladores JDBC 4.0 que se encuentran en la ruta de acceso de clase se cargan
winautomticamente. El mtodo DriverManager.getConnection intentar cargar la clase de
Ed controlador consultando el archivo META_INF/services/java.sql.Driver. Este archivo
contiene el nombre de la implantacin del controlador JDBC de java.sql.Driver. Por ejemplo,
el contenido del archivo META-INF/services/java.sql.driver en derbyclient.jar
contiene org.apache.derby.jdbc.ClientDriver.
Los controladores anteriores a JDBC 4.0 se deben cargar manualmente mediante:
try {
java.lang.Class.forName("<fully qualified path of the driver>");
} catch (ClassNotfoundException c) {
}
Las clases de controlador tambin se pueden transferir al intrprete en la lnea de comandos:
java djdbc.drivers=<fully qualified path to the driver> <class to run>

Programacin Java SE 7 14-4


Componentes de la API de JDBC clave
Cada clase de controlador JDBC del proveedor tambin
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

implanta las clases de API clave que usar para conectarse a


la base de datos, ejecutar consultas y manipular datos:
java.sql.Connection: conexin que representa la
sesin entre la aplicacin Java y la base de datos.
Connection con = DriverManager.getConnection(url,
username, password);
java.sql.Statement: objeto usado para ejecutar una e to
e n s
sentencia SQL esttica y devolver el resultado. e l lic
Statement stmt = con.createStatement(); ab f er
java.sql.ResultSet: objeto que representa s
an un juego
- t r
de resultados de la base de datos.
n on
String query = "SELECT * FROM Employee";
s a
ResultSet rs = stmt.executeQuery(query); ) a
h uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
Objetosra vi (
Connection, Statement y ResultSets
M a
La verdadera virtud de la API de JDBC es que proporciona una manera flexible y porttil de
wincomunicarse con la base de datos.
Ed El controlador JDBC proporcionado por un proveedor de base de datos implanta cada una de
estas interfaces Java. El cdigo Java puede usar la interfaz sabiendo que el proveedor de base
de datos ha proporcionado la implantacin de cada uno de los mtodo de la interfaz.
Connection es una interfaz que proporciona una sesin con la base de datos. Mientras el objeto
de conexin est abierto, puede acceder a la base de datos, crear sentencias, obtener resultados
y manipular la base de datos. Al cerrar una conexin, el acceso a la base de datos termina y la
conexin abierta se cierra.
Statement es una interfaz que proporciona una clase para ejecutar sentencias SQL y devolver
resultados. La interfaz Statement se utiliza para consultas SQL estticas. Hay dos subinterfaces
ms: PreparedStatement, que ampla Statement, y CallableStatement, que ampla
PreparedStatement.
ResultSet es una interfaz que gestiona los datos resultantes devueltos de Statement.
Nota: las palabras clave y comandos SQL no son sensibles a maysculas/minsculas, es decir
puede usar SELECT o Select. Los nombres de columna y tabla SQL (identificadores) pueden
ser sensibles a maysculas/minsculas o no segn la base de datos. Los identificadores SQL no
son sensibles a maysculas/minsculas en la base de datos Derby (a menos que se delimite).

Programacin Java SE 7 14-5


Uso de un objeto ResultSet
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

String query = "SELECT * FROM Employee";


ResultSet rs = stmt.executeQuery(query);

La primera llamada de mtodo next() devuelve


Cursor ResultSet true y rs apunta a la primera fila de datos.

rs.next() 110 Troy Hammer 1965-03-31 102109.15

rs.next() 123 Michael Walton 1986-08-25 93400.20


e to
rs.next() 201 Thomas Fitzpatrick 1961-09-22 75123.45
e n s
el ic
rs.next() 101 Abhijit Gopali 1956-06-01 l
70000.00
a b
rs.next() fe r
null
a n s
o n -tr
La ltima llamada de mtodo next() devuelve
an
false y la instancia rs ahora es nula.
s
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
M ara
Objetos ResultSet
ResultSet mantiene un cursor en las filas devueltas. El cursor est apuntando inicialmente
w i n antes de la primera fila.
Ed Se llama al mtodo ResultSet.next() para colocar el curso en la siguiente fila.
El objeto por defecto ResultSet no se puede actualizar y tiene un cursor que solo apunta
hacia adelante.
Es posible producir objetos ResultSet que se pueden desplazar o actualizar. El siguiente
fragmento de cdigo, en el que con es un objeto Connection vlido, muestra cmo crear
un juego de resultados desplazable, en el que otros usuarios no puedan realizar
actualizaciones y que se puede actualizar:
Statement stmt
= con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
Nota: no todas las bases de datos soportan juegos de resultados desplazables.
ResultSet tiene mtodos de acceso para leer el contenido de cada columna devuelta en una
fila. ResultSet tiene un mtodo getter para cada tipo.

Programacin Java SE 7 14-6


Unin de todo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

1 package com.example.text;
2
3 import java.sql.DriverManager;
4 import java.sql.ResultSet;
5 import java.sql.SQLException;
6 import java.util.Date;
7
8 public class SimpleJDBCTest {
e to
9
e n s
10 public static void main(String[] args) {
elic
11 String url = "jdbc:derby://localhost:1527/EmployeeDB";
a b l
12 String username = "public"; La contrasea, nombre
fe r
13 String password = "tiger"; de usuario y URL de
a n s
14 String query = "SELECT * FROM Employee"; JDBC codificada sirven
solo de ejemplo.
o n -tr
an
15 try (Connection con =
16
s
DriverManager.getConnection (url, username, password);
ha uide
17
)
Statement stmt = con.createStatement ();
m tG
18
c o
ResultSet rs = stmt.executeQuery (query)) {
n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
M ara
En esta diapositiva y la siguiente, ver un ejemplo completo de una aplicacin JDBC, una simple
que lee todas las filas de una base de datos de empleado y devuelve los resultados como
w i n
cadenas a la consola.
Ed Lnea 1516: utilice una sentencia try-with-resources para obtener una instancia de un
objeto que implanta la interfaz Connection.
Lnea 17: utilice dicho objeto para obtener una instancia de un objeto que implanta la
interfaz Statement del objeto Connection.
Lnea 18: cree un objeto ResultSet ejecutando la consulta de cadena mediante el objeto
Statement.
Nota: la codificacin de la URL de JDBC, nombre de usuario y contrasea hace que una
aplicacin sea menos porttil. En su lugar, considere usar java.io.Console para leer el
nombre de usuario y la contrasea, o algn tipo de servicio de autenticacin.

Programacin Java SE 7 14-7


Unin de todo
Pase por todas las filas
de ResultSet.
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

19 while (rs.next()) {
20 int empID = rs.getInt("ID");
21 String first = rs.getString("FirstName");
22 String last = rs.getString("LastName");
23 Date birthDate = rs.getDate("BirthDate");
24 float salary = rs.getFloat("Salary");
25 System.out.println("Employee ID: " + empID + "\n"
e to
26 + "Employee Name: " + first + " " + last + "\n"
e n s
27 + "Birth Date: " + birthDate + "\n"
elic
28 + "Salary: " + salary);
a b l
fe r
29 } // end of while
a n s
-tr
30 } catch (SQLException e) {
31 System.out.println("SQL Exception: " + e);
o n
32 } // end of try-with-resources
s an
33 }
) ha uide
34 }
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
M

ara
Lneas 2024: obtiene los resultados de cada uno de los campos de datos en cada fila leda
de la tabla Employee.
i n
w Lneas 2528: imprima los campos de datos resultantes en la consola del sistema.
Ed Lnea 30: SQLException: esta clase ampla la Exception devuelta por los mtodos
DriverManager, Statement y ResultSet (puede obtener ms informacin sobre esta
clase de excepcin en la siguiente diapositiva).
Lnea 32: se trata del corchete de cierre para la sentencia try-with-resources de la
lnea 15.
Este ejemplo se extrae del proyecto SimpleJDBCExample.
Resultado:
run:
Employee ID: 110
Employee Name: Troy Hammer
Birth Date: 1965-03-31
Salary: 102109.15

etc.

Programacin Java SE 7 14-8


Escritura de cdigo JDBC porttil
El controlador JDBC proporciona una capa "aislante" mediante
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

programacin entre la aplicacin Java y la base de datos. Sin


embargo, tambin debe considerar la semntica y la sintaxis
SQL al escribir aplicaciones de base de datos.
La mayora de las bases de datos soportan un juego
estndar de semntica y sintaxis SQL descrita por la
especificacin de nivel de entrada SQL-92 de ANSI to
(American National Standards Institute). n s e
Puede comprobar mediante programacin el soporte b e
para l ice
a l
r
esta especificacin desde su controlador: sfe an
Connection con = DriverManager.getConnection(url, username,
- t r
password);
n on
DatabaseMetaData dbm = con.getMetaData();
s a
if (dbm.supportsANSI92EntrySQL()) {
) a
h uide
c o m tG
// Support for Entry-level SQL-92 standard
}
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
e ma us
a v i(
En general, probablemente escribir una aplicacin que aprovecha las capacidades y funciones
a r
i n M
de la base de datos con la que est trabajando. Sin embargo, si desea escribir una aplicacin
w porttil, debe considerar el soporte que cada base de datos le proporcionar para la funcionalidad
Ed y tipos de SQL. Afortunadamente, puede consultar el controlador de base de datos mediante
programacin para determinar el nivel de soporte que proporciona el controlador. La interfaz
DatabaseMetaData tiene un juego de mtodos que el desarrollador del controlador usa para
indicar lo que soporta el controlador, incluido el soporte para la entrada, soporte intermedio o
completo para SQL-92.
La interfaz DatabaseMetaData tambin incluye otros mtodos que determinan el tipo de
soporte que la base de datos proporciona para consultas, tipos, transacciones, etc.

Programacin Java SE 7 14-9


Clase SQLException
SQLException se puede usar para notificar detalles sobre los
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

errores de la base de datos resultantes. Para informar de todas


las excepciones devueltas, puede iterar con la SQLException
devuelta:
1 catch(SQLException ex) {
2 while(ex != null) {
3 System.out.println("SQLState: " + ex.getSQLState());
4 System.out.println("Error Code:" + ex.getErrorCode()); e to
e n s
5 System.out.println("Message: " + ex.getMessage());
elic
6 Throwable t = ex.getCause();
a b l
7 while(t != null) {
fe r
8 System.out.println("Cause:" + t); a n s
9 t = t.getCause();
o n -tr
10 }
s an
Cdigos de estado, cdigos
11 ex = ex.getNextException();
) ha uide
de error y mensajes
dependientes del proveedor
12 }
c o m tG
13 } a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Se devuelve una SQLException de los errores producidos en uno de los siguientes tipos

i n M de acciones: mtodos de controlador, mtodos que acceden a la base de datos o intentos


w de obtener una conexin a la base de datos.
Ed La clase SQLException tambin implanta Iterable. Las excepciones se pueden
encadenar juntas y devolver como un nico objeto.
SQLException se devuelve si la conexin a la base de datos no se puede realizar debido
a informacin de contrasea o nombre de usuario incorrecta o simplemente a que la base
de datos est fuera de lnea.
SQLException tambin puede resultar al intentar acceder a un nombre de columna que no
forma parte de la consulta SQL.
SQLException es tambin una subclase, que proporciona granularidad de la excepcin
actual devuelta.
Nota: los valores SQLState y SQLErrorCode dependen de la base de datos. Para Derby, los
valores de SQLState se definen aqu:
http://download.oracle.com/javadb/10.8.1.2/ref/rrefexcept71493.html.

Programacin Java SE 7 14-10


Cierre de objetos de JDBC

Una forma Una forma mejor


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

close() Connection close() Connection

Cierra sentencias

Statement close() Statement

Llamar al cierre de e to
Invalida
e n s
forma explcita o en ic
ResultSets
try-with-resources
b l el
fer a
ResultSet close()
a n s
ResultSet

o n -tr
Recursos no n
aRecursos
liberados hasta h a s e
liberados
d
siguiente GC m ) Gu i
o
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
Alra vi (un objeto Connection se cerrar automticamente cualquier objeto Statement
cerrar
M acreado con este objeto Connection.
i n
w Al cerrar un objeto Statement se cerrarn e invalidarn las instancias de ResultSet
Ed creadas por el objeto Statement.
Los recursos contenidos por ResultSet no se liberarn hasta que no se realice la
recoleccin de basura, por lo que se trata de un mtodo recomendable para cerrar de forma
explcita los objetos ResultSet que ya no sean necesarios.
Al ejecutar el mtodo close() en ResultSet, se liberan los recursos externos.
Los objetos ResultSet tambin se cierran de forma implcita al volver a ejecutar un objeto
Statement asociado.
En resumen, se recomienda cerrar de forma explcita los objetos Connection, Statement y
ResultSet de JDBC cuando ya no son necesarios.
Nota: una conexin a la base de datos puede ser una operacin costosa. Se recomienda
mantener los objetos Connection lo mximo posible o usar un pool de conexiones.

Programacin Java SE 7 14-11


Construccin try-with-resources

Con la siguiente sentencia try-with-resources:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

try (Connection con =


DriverManager.getConnection(url, username, password);
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery (query)){
El compilador comprueba para ver que el objeto entre
parntesis implanta java.lang.AutoCloseable. e to
e n s
Esta interfaz incluye un mtodo: void close().
l e lic
El mtodo de cierre se llama automticamente al e a
final
r bde
bloque try en el orden adecuado (de la ltima a n sf
declaracin
a la primera). o n -tr
Es posible incluir varios recursos s a nse puedan cerrar en
que
el bloque try, separados por ) ha yucoma.
punto i de
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i( e
lasvfunciones de JDK 7 es la sentencia try-with-resources. Se trata de una mejora que
Una dera
M aautomticamente los recursos abiertos.
cierra
n
wi Con JDBC 4.1, las clases de API de JDBC que incluyen ResultSet, Connection y
Ed Statement implantan java.lang.AutoCloseable. El mtodo close() de los objetos
ResultSet, Statement y Connection se llamar en este ejemplo.

Programacin Java SE 7 14-12


try-with-resources: prctica incorrecta

Puede ser tentador escribir try-with-resources de forma ms


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

compacta:
try (ResultSet rs = DriverManager.getConnection(url, username,
password).createStatement().executeQuery(query)) {
Sin embargo, solo se llama el mtodo de cierre de
ResultSet, lo cual no es una buena prctica.
e to
Recuerde siempre qu recursos debe cerrar al usar try- n s
with-resources. e l ice
l b
f e ra
an s
- t r
n on
s a
) a
h uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
e ma us
a v i(
Evitar este problema de try-with-resources
r
a parecer que es una forma de ahorrar tiempo escribir estas tres sentencias, pero el efecto
n M
Puede
wi final es que Connection devuelto por DriverManager nunca se cierra de forma explcita al
Ed final del bloque try por lo que no es un mtodo recomendable.

Programacin Java SE 7 14-13


Escritura de consultas y obtencin de resultados

Para ejecutar consultas SQL con JDBC, debe crear un objeto de


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

envoltorio de consulta SQL, una instancia del objeto Statement.


Statement stmt = con.createStatement();
Utilice la instancia Statement para ejecutar una consulta SQL:
ResultSet rs = stmt.executeQuery (query);
Tenga en cuenta que hay tres mtodos de ejecucin de
Statement: e to
e n s
Mtodo Devuelve Se utiliza para
el ic
a b l
executeQuery(sqlString) ResultSet
fe r
Sentencia SELECT
a n s
executeUpdate(sqlString) int (filas
o n -tr UPDATE,
INSERT,
afectadas) n DELETE o DDL
a
s(truedeComandos o
execute(sqlString) boolean
h a
) Gui comando SQL
simhay
o nt
a ilc ResultSet)
d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
i ( SQL se ejecuta en una base de datos mediante una instancia de un objeto
a v
Una sentencia
M ar El objeto Statement es un objeto de envoltorio para una consulta. Un objeto Statement
Statement.
winse obtiene a travs de un objeto Connection, la conexin a la base de datos. As que tiene sentido
Ed que, a partir de Connection, obtenga un objeto que se puede utilizar para escribir sentencias en la
base de datos.
La interfaz Statement proporciona tres mtodos para crear consultas SQL y devolver un
resultado. El mtodo que use depende del tipo de sentencia SQL que desee utilizar:
executeQuery(sqlString): para una sentencia SELECT, devuelve un objeto
ResultSet.
executeUpdate(sqlString): para sentencias INSERT, UPDATE y DELETE, devuelve
int (nmero de filas afectadas) o 0 cuando la sentencia es una sentencia de Lenguaje de
definicin de datos (DDL), como CREATE TABLE.
execute(sqlString): para sentencias SQL, devuelve un boolean que indica si se ha
devuelto ResultSet. Se pueden ejecutar varias sentencias SQL con execute.

Programacin Java SE 7 14-14


Visin general de la prctica 14-1:
Trabajo con la base de datos Derby y JDBC
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica, se abordan los siguientes temas:


Inicio de la base de datos JavaDB (Derby) desde
NetBeans IDE
Relleno de la base de datos con datos (tabla Employee)
Ejecucin de consultas SQL para examinar los datos
Compilacin y ejecucin de la aplicacin JDBC de ejemplo e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
En esta prctica, iniciar la base de datos desde NetBeans, rellenar la base de datos con datos,
ejecutar algunas consultas SQL, y compilar y ejecutar una aplicacin simple que devuelva
w i n
filas de la tabla de base de datos Employee.
Ed

Programacin Java SE 7 14-15


ResultSetMetaData

En un momento dado puede necesitar detectar dinmicamente


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

el nmero de columnas y su tipo. Observe que estos


1 int numCols = rs.getMetaData().getColumnCount(); mtodos se indexan
2 String [] colNames = new String[numCols]; desde 1, no 0.
3 String [] colTypes = new String[numCols];
4 for (int i= 0; i < numCols; i++) {
5 colNames[i] = rs.getMetaData().getColumnName(i+1);
e to
6 colTypes[i] = rs.getMetaData().getColumnTypeName(i+1);
e n s
7 }
elic
a b l
8 System.out.println ("Number of columns returned: " + numCols);
fe r
9 System.out.println ("Column names/types returned: ");
a n s
10 for (int i = 0; i < numCols; i++) {
o n -tr
11 System.out.println (colNames[i] + " : " + colTypes[i]);
s an
12 }
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
La clase ResultSetMetaData se obtiene a partir de un objeto ResultSet.

i n M
getColumnCount devuelve el nmero de columnas devueltas en la consulta que ha producido
w ResultSet.
Ed Los mtodos getColumnName y getColumnTypeName devuelven cadenas. Se puede usar para
realizar una recuperacin dinmica de los datos de la columna.
Nota: estos mtodos utilizan 1 para indicar la primera columna, no 0.
Con una consulta de "SELECT * FROM Employee" y la tabla de datos Employee de las prcticas,
este fragmento producir este resultado:
Number of columns returned: 5
Column names/types returned:
ID : INTEGER
FIRSTNAME : VARCHAR
LASTNAME : VARCHAR
BIRTHDATE : DATE
SALARY : REAL

Programacin Java SE 7 14-16


Obtencin de recuento de filas
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Una pregunta comn al ejecutar una consulta es cuntas filas


se han devuelto.
1 public int rowCount(ResultSet rs) throws SQLException{
2 int rowCount = 0;
3 int currRow = rs.getRow();
Mueve el cursor hasta la ltima fila;
4 // Valid ResultSet?
este mtodo devuelve false si el
e to
5 if (!rs.last()) return -1; objeto ResultSet est vaco.
e n s
6 rowCount = rs.getRow();
elic
7 // Return the cursor to the current position
a b l
fer
8 if (currRow == 0) rs.beforeFirst();
a n s
9 else rs.absolute(currRow); La devolucin del cursor de fila a su
o n
posicin original antes de la llamada
-tr
an
10 return rowCount;
es un mtodo recomendable.
11 } s
ha uide
Para usar esta tcnica, ResultSet )
m t G debe ser desplazable.
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
i ( que para crear un objeto ResultSet desplazable debe definir el tipo ResultSet
a v
Nota: recuerde
r
M
en elamtodo createStatement:
winStatement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
Ed ResultSet.CONCUR_UPDATABLE);
Hay otra tcnica para el objeto ResultSets no desplazable. Al usar la funcin SQL COUNT, una
consulta determina el nmero de filas y una segunda lee los resultados. Tenga en cuenta que
esta tcnica requiere el bloqueo del control en las tablas para garantizar que el recuento no
cambia durante la operacin:
ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM EMPLOYEE");
rs.next();
int count = rs.getInt(1);
rs.stmt.excuteQuery ("SELECT * FROM EMPLOYEE");
// process results

Programacin Java SE 7 14-17


Control del tamao de recuperacin de
ResultSet
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Por defecto, el nmero de filas recuperadas a la vez por una


consulta se determina mediante el controlador JDBC. Es posible
que desee controlar este comportamiento en el caso de juegos de
datos grandes.
Por ejemplo, si desea limitar el nmero de filas recuperadas
en la cach a 25, puede definir el tamao de recuperacin:
e to
e n s
rs.setFetchSize(25);
el ic
a b l
s f er
Las llamadas a rs.next() devuelven los datos
- t r anen la cach
hasta la fila 26 , momento en el que el controlador
a
n on recuperar
otras 25 filas. s a
) a
h uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
i ( el tamao de recuperacin ms eficaz es el valor por defecto para el
a v
Nota: normalmente
M ar
controlador.
win
Ed

Programacin Java SE 7 14-18


Uso de PreparedStatement

PreparedStatement es una subclase de Statement que


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

permite transferir argumentos a una sentencia SQL


precompilada. Parmetro para sustitucin.
double value = 100_000.00;
String query = "SELECT * FROM Employee WHERE Salary > ?";
PreparedStatement pStmt = con.prepareStatement(query);
e to
pStmt.setDouble(1, value); Sustituye value para el
e n s
ResultSet rs = pStmt.executeQuery(); primer parmetro en la
elic
sentencia preparada.
a b l
En este fragmento de cdigo, una sentencia preparada fe r
n s
devuelve todas las columnas de todas las n - ra cuyo
tfilas
salario es mayor de 100 000 dlares.a no
PreparedStatement es til h a s dtiene
cuando e sentencias
) Gu i
om veces.
SQL que va a ejecutarlcvarias nt
m ai tude
@ g sS
a i
Copyright
r t hi y/o sus filiales. Todos los derechos reservados.
v 2011,e Oracle
e ma us
a v i(
r
PreparedStatement
a
n M
La sentencia SQL en el ejemplo de la diapositiva se precompila y almacena en el objeto
wi PreparedStatement. Esta sentencia se puede usar de forma eficaz para ejecutar esta
Ed sentencia varias veces. Este ejemplo podra estar en un bucle, consultando valores diferentes.
Las sentencias preparadas tambin se pueden usar para evitar ataques de inyeccin de SQL. Por
ejemplo, donde un usuario puede introducir una cadena que, cuando se ejecuta como parte de
una sentencia SQL, permite al usuario modificar la base de datos de formas no intencionadas
(como otorgar permisos en s).
Nota: los mtodos PreparedStatement setXXXX indexan parmetros a partir de 1, no 0.

Programacin Java SE 7 14-19


Uso de CallableStatement

CallableStatement permite que sentencias no SQL (como


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

procedimientos almacenados) se ejecuten en la base de datos.


CallableStatement cStmt
= con.prepareCall("{CALL EmplAgeCount (?, ?)}");
int age = 50; El parmetro IN se transfiere al
cStmt.setInt (1, age); procedimiento almacenado.

e to
ResultSet rs = cStmt.executeQuery();
e n s
cStmt.registerOutParameter(2, Types.INTEGER);
el ic
boolean result = cStmt.execute(); El parmetro OUT se devuelve desde a b l
el procedimiento almacenado. fe r
int count = cStmt.getInt(2);
a n s
System.out.println("There are " + count +
o n -tr
" Employees over the age of " + age);
s an
Los procedimientos almacenados ) ha seuiejecutan
de en la base
o m G
de datos.
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
i ( almacenados Derby
a v
M
La
ar de datos Derby utiliza un lenguaje de programacin Java para sus procedimientos
Procedimientos
base
winalmacenados.
Ed En el ejemplo que muestra la diapositiva, el procedimiento almacenado se declara mediante la
siguiente sintaxis:
CREATE PROCEDURE EmplAgeCount (IN age INTEGER, OUT num INTEGER) DYNAMIC
RESULT SETS 0
LANGUAGE JAVA
EXTERNAL NAME 'DerbyStoredProcedure.countAge'
PARAMETER STYLE JAVA
READS SQL DATA;
Una clase Java se carga en la base de datos Derby mediante la siguiente sintaxis:
CALL SQLJ.install_jar ('D:\temp\DerbyStoredProcedure.jar',
'PUBLIC.DerbyStoredProcedure', 0);
CALL syscs_util.syscs_set_database_property('derby.database.classpath',
'PUBLIC.DerbyStoredProcedure');

Programacin Java SE 7 14-20


La clase Java almacenada en la base de datos Derby que realiza el procedimiento almacenado
calcula una fecha en aos en el pasado segn la fecha actual. La consulta SQL cuenta el nmero
de empleados nicos que son mayores (o igual que) el nmero de aos pasados y devuelve
dicho recuento como el segundo parmetro del procedimiento almacenado. El cdigo de este
ejemplo debe tener el siguiente aspecto:
import java.sql.Connection;
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;

e to
public class DerbyStoredProcedure {
e n s
elic
public static void countAge (int age, int[] count) throws SQLException {
a b l
String url = "jdbc:default:connection";
fe r
Connection con = DriverManager.getConnection(url);
a n s
String query = "SELECT COUNT(DISTINCT ID) " +
o n -tr
"AS count FROM Employee "
s a +n
a ide
"WHERE Birthdate <=h?";
)
o m G u
t
PreparedStatement ps = con.prepareStatement(query);
ilc den
a
Calendar now = Calendar.getInstance();
tu
gm (age*-1));
now.add(Calendar.YEAR,
@ s S
vi Date
Date past =anew
r e t hi
(now.getTimeInMillis());
m a past);
u s
e
ps.setDate(1,
i(
r a v
ResultSet rs = ps.executeQuery();

Ma if (rs.next()) {

w i n count[0] = rs.getInt(1);
Ed } else {
count[0] = 0;
}
con.close();
}
}

Consulte el manual de referencia, y la gua de utilidades y herramientas de Derby para obtener


ms informacin sobre la creacin de procedimientos almacenados.

Programacin Java SE 7 14-21


Qu es una transaccin?
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Una transaccin es un mecanismo para manejar grupos


de operaciones como si fueran solo una.
Puede darse el caso de que ocurran todas las operaciones
de una transaccin o ninguna
en absoluto.
Las operaciones implicadas en una transaccin pueden
e to
depender de una o ms bases de datos. e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
Un ejemplo clsico de cundo usar una transaccin sera: suponga que una aplicacin cliente
necesita realizar una solicitud de servicio que puede implicar varias operaciones de lectura y
w i n
escritura en una base de datos. Si alguna de las llamadas no se realiza correctamente, se debe
Ed realizar un rollback de los estados escritos (en memoria o, con ms frecuencia, en una base de
datos).
Piense en una solicitud de transferencia de fondos interbancarios en la que el dinero se transfiere
de un banco a otro.
La operacin de transferencia requiere que el servidor realice las siguientes llamadas:
1. Llamada al mtodo de dbito en una cuenta en el primer banco
2. Llamada al mtodo de crdito en otra cuenta en el segundo banco
Si la llamada de crdito en el segundo banco falla, la aplicacin bancaria debe realizar un rollback
de la llamada de dbito anterior en el primer banco.
Nota: cuando una transaccin abarca varias bases de datos, es posible que se requieran
servicios de transaccin ms complicados.

Programacin Java SE 7 14-22


Propiedades ACID de una transaccin
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Una transaccin formalmente la define el juego de propiedades


que se conoce por el acrnimo ACID.
Atomicidad: una transaccin se hace o se deshace
completamente. En caso de fallo, todas las operaciones y
procedimientos se deshacen y se realiza un rollback de
todos los datos a su estado anterior. to
Consistencia: una transaccin transforma un sistema n s e
desde un estado consistente a otro estado consistente.le l
ice
Aislamiento: cada transaccin ocurre de formasfer
ab
r an al
independiente de otras transacciones que-tocurren
mismo tiempo. n on
s a
Durabilidad: las transacciones
) a de
h completadas
i permanecen
m u
como permanentes, incluso nt G un fallo del sistema.
co durante
ail tude
g sSm
i @ hi y/o sus filiales. Todos los derechos reservados.
v 2011,e Oracle
t
a
Copyright
r
e ma us
a v i(
Las transacciones deben tener las siguientes propiedades ACID:
a r
i n M
Atomicidad: todo o nada, se implantan todas las operaciones implicadas en la transaccin
w o no lo hace ninguna.
Ed Consistencia: la base de datos se debe modificar de un estado consistente a otro. En el
caso de que el sistema o la base de datos falle durante la transaccin, el estado original se
restaura (rollback).
Aislamiento: una transaccin en ejecucin se asla de otras transacciones en ejecucin en
trminos de los registros de base de datos a los que est accediendo.
Durabilidad: despus de que se confirme una transaccin, se puede restaurar a su estado
en el caso de un fallo del sistema o la base de datos.

Programacin Java SE 7 14-23


Transferencia sin transacciones
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Transferencia correcta (A)


Transferencia incorrecta (las cuentas se dejan en un
estado inconsistente) (B)
$500
1) Retirada: $100 -$100
Cuenta 1
$400
A Cajero
automtico
Banco
e to
Transferencia: $100
Desde: Cuenta 1 2) Ingreso: $100 Cuenta 2
$1000
e n s
A: Cuenta 2
+$100
el ic
a b l
$1100

fe r
a n s $500
1) Retirada: $100
no n-trCuenta 1 -$100
$400
B Cajero
automtico
Banco
a s a
Ingreso de

Transferencia: $100
Desde: Cuenta 1 h
) fallido u i Cuenta 2 $1000
o m G
ilc dent
A: Cuenta 2

a
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
i ( son adecuadas en los siguientes casos. Cada situacin describe un modelo de
a v
Las transacciones
M ar soportado por la implantacin del modelo de transaccin local del recurso en la
transaccin
wininstancia EntityManager.
Ed Una aplicacin cliente debe conversar con un objeto gestionado y debe realizar varias llamadas
en una instancia de objeto especfica. La conversacin se puede caracterizar por uno o ms de
los siguientes tipos:
A. Los datos se almacenan en cach en la memoria o se escriben en una base de datos
durante o despus de cada llamada sucesiva.
B. Los datos se escriben en una base de datos al final de la conversacin.
C. La aplicacin cliente requiere que el objeto mantenga un contexto en memoria entre cada
llamada; cada llamada sucesiva utiliza los datos que se mantienen en la memoria.
D. Al final de la conversacin, la aplicacin cliente requiere la capacidad de cancelar todas las
operaciones de escritura de la base de datos que se han producido durante o al final de la
conversacin.
Considere una aplicacin de carro de compra. Los usuarios de la aplicacin cliente examinan un
catlogo en lnea y crean varias selecciones de compra. Continan a la fase de pago e introducen
la informacin de tarjeta de crdito para realizar la compra. Si falla la verificacin de la tarjeta de
crdito, la aplicacin de compra debe cancelar todas las selecciones de compra pendientes en el
carro de la compra o realizar un rollback de las transacciones de compra realizadas durante la
conversacin.

Programacin Java SE 7 14-24


Transferencia correcta con transacciones
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Los cambios en una transaccin se almacenan en buffer. (A)


Si una transferencia es correcta, los cambios se confirman
(se hacen permanentes). (B)
Transacciones iniciadas por el banco $500
1) Retirada: $100 -$100
Cuenta 1
$400
A Cajero
automtico
Banco
e to
Transferencia: $100
Desde: Cuenta 1 2) Ingreso: $100 Cuenta 2
$1000
e n s
A: Cuenta 2
+$100
el ic
a b l
$1100

fe r
n s
Transacciones iniciadas por el banco
a
Confirmacin
o n -trCuenta 1 $400
B Cajero
automtico
Banco
s an
Transferencia
correcta ) ha uide Cuenta 2 $1100
c o m tG Confirmacin

a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
i ( se ha realizado de forma correcta, los cambios almacenados en buffer se
a v
Si la transaccin
M ar es decir, se hacen permanentes.
confirman,
winEn el mbito de una llamada de cliente en un objeto, el objeto realiza varios cambios en los datos
Ed en una base de datos. Si un cambio falla, el objeto debe realizar un rollback de todos los cambios.
Piense en una aplicacin bancaria. El cliente llama a la operacin de transferencia en un objeto
de cajero automtico. La operacin requiere que el objeto de cajero automtico realice las
siguientes llamadas en la base de datos del banco:
1. Llamada al mtodo de dbito en una cuenta
2. Llamada al mtodo de crdito en otra cuenta
Si la llamada de crdito en la base de datos del banco falla, la aplicacin bancaria debe realizar
un rollback de la llamada de dbito anterior.

Programacin Java SE 7 14-25


Transferencia incorrecta con transacciones
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Los cambios en una transaccin se almacenan en buffer. (A)


Si se produce un problema, la transaccin realiza un rollback
al ltimo estado consistente. (B)
Transacciones iniciadas por el banco $500
1) Retirada: $100 -$100
Cuenta 1
$400
A Cajero
automtico Banco
e to
Transferencia: $100
Desde: Cuenta 1
Ingreso
fallido Cuenta 2
e n s
A: Cuenta 2
$1000
el ic
a b l
fe r
n s
Transacciones iniciadas por el banco
a
Rollback
o n -trCuenta 1 $500
n
B Cajero
automtico Banco
a s a
e
Mensaje de error
h
)RollbackGu i d Cuenta 2 $1000
o m
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
i ( no se ha realizado de forma correcta, los cambios almacenados en buffer se
a v
Si la transaccin
M ar y la base de datos realiza un rollback al ltimo estado consistente.
devuelven
win
Ed

Programacin Java SE 7 14-26


Transacciones JDBC

Por defecto, cuando se crea un objeto Connection, se hace en


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

modo de confirmacin automtica.


Cada sentencia SQL individual se trata como una transaccin
y se confirma automticamente despus de la ejecucin.
Para agrupar dos o ms sentencias, debe desactivar el modo
de confirmacin automtica.
con.setAutoCommit (false); e to
e n s
Debe llamar de forma explcita el mtodo de confirmacin lic
para completar la transaccin con la base de datos. able
fe r
con.commit();
a n s
Tambin puede realizar un rollback mediante
o n -trprogramacin
an
de las transacciones en caso de fallo.
s de
con.rollback(); h
) Gui a
o m
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
M ara
Por defecto, JDBC confirma de forma automtica todas las sentencias SQL. Sin embargo, si
desea crear una operacin atmica que implique varias sentencias SQL, debe desactivar la
w i n
confirmacin automtica.
Ed Despus de desactivar la confirmacin automtica, no se confirma ninguna sentencia SQL en la
base de datos hasta que de forma explcita llame al mtodo de confirmacin.
La otra ventaja de gestionar sus propias transacciones es la capacidad de realizar un rollback a
un juego de sentencias SQL en caso de fallo mediante el mtodo de rollback.
Nota: JDBC no tiene una API para comenzar de forma explcita una transaccin. JSR (221) de
JDBC proporciona las siguientes instrucciones:
Cuando se desactiva una confirmacin automtica para un objeto Connection, todos los
objetos Statements posteriores estn en un contexto de transaccin hasta que se ejecuta
el mtodo de rollback o de confirmacin de Connection.
Si se cambia el valor de confirmacin automtica en mitad de una transaccin, la
transaccin actual se confirma.
Adems, la documentacin del controlador Derby agrega lo siguiente:
Un contexto de transaccin se asocia a un nico objeto Connection (y base de datos).
Una transaccin no puede abarcar varios objetos Connection (o bases de datos).
Nota: una aplicacin de ejemplo que usa transacciones es el archivo de proyecto
JDBCTransactionsExample en el directorio de ejemplos.
Programacin Java SE 7 14-27
RowSet 1.1: RowSetProvider y RowSetFactory
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

La especificacin de la API de JDK 7 presenta la nueva API de


RowSet 1.1. Una de las nuevas funciones de esta API es
RowSetProvider.
javax.sql.rowset.RowSetProvider se usa para
crear un objeto RowSetFactory:
myRowSetFactory = RowSetProvider.newFactory();
e to
La implantacin por defecto RowSetFactory es: e n s
com.sun.rowset.RowSetFactoryImpl elic
a b l
er de
RowSetFactory se usa para crear uno de los tipos
s f
objeto RowSet de RowSet 1.1. tran n -
o
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
RowSet 1.1
M clases para JDK7: javax.sql.rowset.RowSetProvider y
Nuevas
i n
w javax.sql.rowset.RowSetFactory. Estas dos clases se usan para crear instancias de
Ed RowSets, como se trata en la siguiente diapositiva.

Programacin Java SE 7 14-28


Uso de RowSetFactory de RowSet 1.1

RowSetFactory se usa para crear instancias de


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

implantaciones de RowSet:
Tipo de RowSet Proporciona

CachedRowSet Un contenedor para filas de datos que almacenan en


cach sus filas en memoria
FilteredRowSet Un objeto RowSet que proporciona mtodos para el
e to
soporte de filtrado
e n s
el ic
JdbcRowSet Un envoltorio alrededor de ResultSet para tratar un juego
a b l
de resultados como un componente de JavaBeans
s f er
JoinRowSet Un objeto RowSet que proporciona mecanismos
- t r an objetospara
combinar datos relacionados de diferentes
RowSet n on
s a
WebRowSet Un objeto RowSet que
) a
h soporta i deleformato de documento
u
m t alGdescribir un objeto RowSet
XML estndarorequerido
en XML il c e n
a d
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i( e
r a v
CachedRowSet: el objeto CachedRowSet es un contenedor para filas de datos que
M aalmacena en cach sus filas en memoria. Esto hace que sea posible operar sin estar
w i n siempre conectado a su origen de datos. Adems, es un componente de JavaBeans que se
Ed puede desplazar, actualizar y serializar. Un objeto CachedRowSet normalmente contiene
filas de un juego de resultados, pero tambin puede contener filas de archivos con un
formato tabular, como una hoja de clculo. La implantacin de referencia soporta la
obtencin de datos solo desde un objeto ResultSet, pero los desarrolladores pueden
ampliar las implantaciones de SyncProvider para proporcionar acceso a otras fuentes de
datos tabulares.
FilteredRowSet: implantacin estndar de FilteredRowSet de JDBC que implanta las
interfaces RowSet y ampla la clase CachedRowSet. La clase CachedRowSet proporciona
un juego de mtodos de manipulacin de cursor protegidos, que una implantacin de
FilteredRowSet puede sustituir para proporcionar soporte de filtrado.

Programacin Java SE 7 14-29


JdbcRowSet: JdbcRowSet es un envoltorio alrededor del objeto ResultSet que hace
posible usar el juego de resultados como un componente de JavaBeans. Por tanto, un
objeto JdbcRowSet puede ser uno de los beans que una herramienta pone a disposicin
para componer una aplicacin. Debido a que JdbcRowSet es un juego de filas conectado,
es decir, que mantiene continuamente su conexin a la base de datos mediante un
controlador con tecnologa JDBC, tambin hace que el controlador sea un componente de
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

JavaBeans.
JoinRowSet: la interfaz JoinRowSet proporciona un mecanismo para combinar datos
relacionados de diferentes objetos RowSet en un objeto JoinRowSet, lo que representa
una JOIN SQL. Es decir, un objeto JoinRowSet acta como contenedor para los datos a
partir de los objetos de RowSet que forman una relacin JOIN SQL.
WebRowSet: la interfaz WebRowSet describe el formato de documento XML estndar
necesario al describir un objeto RowSet en XML y lo deben usar todas las implantaciones
estndar de la interfaz WebRowSet para garantizar la interoperabilidad. Adems, el
e to
esquema WebRowSet usa anotaciones de esquema SQL/XML especficas, lo que asegura
e n s
ic
una interoperabilidad entre plataformas mayor. Se trata de un esfuerzo en curso bajo los
el
estndares de la organizacin ISO.
a b l
fer
a n s
n - tr
o
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
r a vi e thi
m a u s
i ( e
v
M ara
w i n
Ed

Programacin Java SE 7 14-30


Ejemplo: Uso de JdbcRowSet

1 try (JdbcRowSet jdbcRs =


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

2 RowSetProvider.newFactory().createJdbcRowSet()) {
3 jdbcRs.setUrl(url);
4 jdbcRs.setUsername(username);
5 jdbcRs.setPassword(password);
6 jdbcRs.setCommand("SELECT * FROM Employee");
7 jdbcRs.execute();
8 // Now just treat JDBC Row Set like a ResultSet object
e to
9 while (jdbcRs.next()) {
e n s
10 int empID = jdbcRs.getInt("ID");
elic
11 String first = jdbcRs.getString("FirstName"); a b l
fe r
12 String last = jdbcRs.getString("LastName");
a n s
13 Date birthDate = jdbcRs.getDate("BirthDate");
o n -tr
an
14 float salary = jdbcRs.getFloat("Salary");
15 } s
ha uide
16 //... other methods
m tG )
c o n
17 }
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
En el fragmento de cdigo de la diapositiva, se crea una instancia JdbcRowSet a partir de

i n M
RowSetProviderFactory.
w A continuacin, se trata el objeto como un JavaBean RowSet. Puede usar mtodos setter para
Ed definir url, username y password y, a continuacin, ejecutar un comando SQL y obtener
ResultSet para recuperar los valores de columna.
Este ejemplo se extrae del proyecto SimpleJDBCRowSetExample.

Programacin Java SE 7 14-31


Objetos de acceso a datos

Piense en una tabla de empleado como la del cdigo JDBC del


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

ejemplo.

e to
e n s
Al combinar el cdigo que accede a la base de datos con lic
la lgica "negocio", los mtodos de acceso a datos yab lale
tabla Employee se acoplan. s f er
- t r an
Los cambios en la tabla (como la adicin onde un campo)
requerirn un cambio completo en a n
la aplicacin.
h a s d e
Los datos del empleado no se
m ) Gu i
encapsulan en la aplicacin
o
del ejemplo. ilc ent
g ma Stud
a v i@
Copyright t h isy/o sus filiales. Todos los derechos reservados.
2011, Oracle
r
(e ma use
v i
ra
Tabla Employee
a
M
En la aplicacin SimpleJDBCExample que se muestra en la diapositiva anterior, hay un
winacoplamiento estrecho entre las operaciones utilizadas para acceder a los datos y la tabla
Ed Employee en s. El ejemplo es simple, pero si se imagina este tipo de acceso en una aplicacin
mayor, tal vez con varias tablas con relaciones entre ellas, comprobar que, si se accede
directamente a la base de datos en la misma clase que los mtodos de negocio, podra haber
problemas en el futuro si cambia la tabla Employee.
Adems, puesto que se accede a los datos directamente, no tiene forma de transferir la nocin de
un empleado. Debe tratar un empleado como un objeto.

Programacin Java SE 7 14-32


Patrn de objeto de acceso a datos

2
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

1
e to
3
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ElM
ara
Patrn de fbrica y objeto de acceso a datos
propsito de un objeto de acceso a datos (DAO) es separar actividades relacionadas con la
i n
w base de datos del modelo de negocio. En este patrn de diseo, hay dos tcnicas para garantizar
Ed la flexibilidad de diseo futuro.
1. Una fbrica se utiliza para generar instancias (referencias) a una implantacin de la interfaz
EmployeeDAO. Una fbrica hace que sea posible aislar el desarrollador mediante DAO a
partir de los detalles sobre cmo se instancia una implantacin de DAO. Como ha visto, se
utiliza el mismo patrn para crear una implantacin en la que se almacenan los datos en
memoria.
2. Una interfaz EmployeeDAO est diseada para modelar el comportamiento que desee
permitir en los datos de empleado. Tenga en cuenta que esta tcnica de separacin de los
datos demuestra una separacin de problemas. La interfaz EmployeeDAO fomenta la
separacin adicional entre la implantacin de los mtodos necesarios para soportar DAO y
las referencias a los objetos EmployeeDAO.
3. EmployeeDAOJDBCImpl implanta la interfaz EmployeeDAO. La clase de implantacin se
puede sustituir por una implantacin diferente sin que afecte a la aplicacin cliente.

Programacin Java SE 7 14-33


Resumen

En esta leccin, debe haber aprendido a hacer lo siguiente:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Definir el diseo de la API de JDBC


Conectarse a una base de datos mediante un controlador
JDBC
Enviar consultas y obtener resultados de la base de datos
Especificar informacin sobre el controlador JDBC de forma
externa e to
n s
Usar transacciones con JDBC e l ice
Usar RowSetProvider y RowSetFactory de JDBC r a bl
4.1
fe s
Usar un patrn de objeto de acceso a datos-tran
non
para separar datos y mtodos de negocio
a
a s
h uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 14-34


Prueba

Qu mtodo Statement ejecuta una sentencia SQL y


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

devuelve el nmero de filas afectadas?


a. stmt.execute(query);
b. stmt.executeUpdate(query);
c. stmt.executeQuery(query);
d. stmt.query(query); e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 14-35


Prueba

Al usar un objeto Statement para ejecutar una consulta que


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

devuelve solo un registro, no es necesario usar el mtodo


next() de ResultSet.
a. Verdadero
b. Falso
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 14-36


Prueba

La siguiente sentencia try-with-resources cerrar


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

adecuadamente los recursos JDBC:


try (Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query)){
//...
} catch (SQLException s) {
}
e to
a. Verdadero e n s
elic
b. Falso a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 14-37


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Teniendo en cuenta:
10 String[] params = {"Bob", "Smith"};
11 String query = "SELECT itemCount FROM Customer " +
12 "WHERE lastName='?' AND firstName='?'";
13 try (PreparedStatement pStmt = con.prepareStatement(query)) {
14 for (int i = 0; i < params.length; i++)
15 pStmt.setObject(i, params[i]);
16 ResultSet rs = pStmt.executeQuery();
e to
17 while (rs.next()) System.out.println (rs.getInt("itemCount"));
e n s
18 } catch (SQLException e){ }
e lic
Suponiendo que hay un objeto Connection vlido y que la consulta b l
ra
SQL producir al menos una fila, cul es el resultado?nsfe
a. Cada valor itemCount para el cliente Bob Smith n - tra
n o
b. Error del compilador a
c. Error de tiempo de ejecucin ) h
as ide
o m G u
d. SQLException ilc den t
a
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i( e
r a v
in Ma
w
Ed

Programacin Java SE 7 14-38


Visin general de la prctica 14-2:
Uso del patrn de objeto de acceso a datos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta prctica, se abordan los siguientes temas:


Refactorizacin de la aplicacin DAO basado en memoria
para usar JDBC.
Uso de la aplicacin cliente Employee interactiva, prueba
del cdigo.
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
En esta prctica, refactorizar el DAO basado en memoria desde excepciones y afirmaciones
para usar JDBC en su lugar. Se proporciona un cliente interactivo para que pueda experimentar
w i n
con la creacin, lectura, actualizacin y supresin de registros mediante JDBC.
Ed

Programacin Java SE 7 14-39


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Ed
w i n M
ara
v i
( e m a r a
u
@
s
a
vi e thi
il c o
gm s Stu
d
)
e n
s
m tG
o
ha uide
an
tr n -
a n s fe
r
a b l el
ic
e n s e
to
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Localizacin

e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
Objetivos

Al finalizar esta leccin, debera estar capacitado para:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Describir las ventajas de localizar una aplicacin


Definir lo que representa una configuracin regional
Leer y definir la configuracin regional mediante el objeto
Locale
Crear un grupo de recursos para cada configuracin regional
Llamar a un grupo de recursos desde una aplicacin e to
n s
Cambiar la configuracin regional para un grupo de recursos e l ice
Aplicar formato a texto para la localizacin mediante r a bl
NumberFormat y DateFormat n s fe
ra n -t
o
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 15-2


Por qu localizar?
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

La decisin de crear una versin de una aplicacin para uso


internacional se suele presentar al inicio de un proyecto de
desarrollo.
Software que tiene en cuenta el idioma y la regin
Fechas, nmeros y monedas con formato para pases
especficos
e to
Capacidad para conectarse a datos especficos del pas e n s
lic
sin cambiar el cdigo ble ra
f e
tra ns
n -
a no
h a s de
m ) Gui
o
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
La localizacin es el proceso de adaptacin de software para una regin o idioma especfico
mediante la adicin de componentes especficos de la configuracin regional y la traduccin del
w i n
texto.
Ed Adems de los cambios de idioma, los componentes culturales, como fechas, nmeros, monedas,
etc. se deben traducir.
El objetivo es disear la localizacin de modo que no se requieren cambios de codificacin.

Programacin Java SE 7 15-3


Aplicacin de ejemplo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Localizar una aplicacin de ejemplo:


Interfaz de usuario basada en texto
Localizacin de mens
Muestra de localizaciones de moneda y fecha
=== Localization App ===
e to
1. Set to English
e n s
2. Set to French
elic
3. Set to Chinese
a b l
fe r
4. Set to Russian
a n s
5. Show me the date
o n -tr
an
6. Show me the money!
q. Enter q to quit s
ha uide
Enter a command:
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
En el resto de esta leccin, esta sencilla interfaz de usuario basada en texto se localizar en
francs, chino simplificado y ruso. Introduzca el nmero que indica el men y dicha opcin de
w i n
men se aplicar a la aplicacin. Introduzca q para salir de la aplicacin.
Ed

Programacin Java SE 7 15-4


Locale

Locale especifica un idioma y pas determinado:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Idioma
Cdigo ISO 639: Alfa-2 o Alfa-3
en para ingls, es para espaol
Siempre utiliza minscula
Pas e to
e n s
Utiliza el cdigo de pas ISO 3166: Alfa-2 o el cdigo
le lic
de rea numrico UN M.49 b
r a
"US" para Estados Unidos, "ES" para Espaa nsfe
a
Siempre utiliza mayscula n-tr no
Consulte los tutoriales de Java para
s a obtener
ms
a e
h uid utilizados
informacin sobre todos los )estndares
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
En Java, se especifica una configuracin regional mediante dos valores: idioma y pas. Consulte
el tutorial de Java para ver los estndares utilizados:
w i n
http://download.oracle.com/javase/tutorial/i18n/locale/create.html
Ed Ejemplos de idiomas
de: alemn
en: ingls
fr: francs
zh: chino
Ejemplos de pas
DE: Alemania
US: Estados Unidos
FR: Francia
CN: China

Programacin Java SE 7 15-5


Grupo de recursos

La clase ResourceBundle asla los datos especficos


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

de la configuracin regional:
Devuelve pares clave/valor almacenados de forma
independiente.
Puede ser una clase o un archivo .properties.
Pasos que usar: to
Crear archivos de grupo para cada n s e
ic e
configuracin regional.
b l el
Llamar a una configuracin regional fe r a
especfica desde la aplicacin. a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
El diseo para la localizacin comienza con el diseo de la aplicacin, de modo que todo el texto,
los sonidos y las imgenes se pueden sustituir en tiempo de ejecucin por los elementos
w i n
adecuados para la regin y la cultura deseada. Los grupos de recursos contienen pares
Ed clave/valor que se pueden codificar en una clase o localizar en un archivo .properties.

Programacin Java SE 7 15-6


Archivo de grupo de recursos

El archivo de propiedades contiene un juego de pares


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

clave/valor.
Cada clave identifica un componente de aplicacin especfico.
Los nombres de archivo especiales utilizan cdigos de idioma
y pas.
Valor por defecto para la aplicacin de ejemplo:
Men convertido en grupo de recursos e to
e n s
MessageBundle.properties
elic
menu1 = Set to English
a b l
fe r
menu2 = Set to French
a n s
menu3 = Set to Chinese
o n -tr
an
menu4 = Set to Russian
menu5 = Show the Date s
ha uide
menu6 = Show me the money!
m tG )
c o n
menuq = Enter q to quit
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
La diapositiva muestra un archivo del grupo de recursos de ejemplo para esta aplicacin. Cada
opcin de men se ha convertido en un par nombre/valor. Se trata del archivo por defecto para la
w i n
aplicacin. Para idiomas alternativos, se utiliza una convencin de nomenclatura especial:
Ed
MessageBundle_xx_YY.properties

donde xx es el cdigo de idioma e YY es el cdigo de pas.

Programacin Java SE 7 15-7


Archivos del grupo de recursos de ejemplo
Ejemplos para francs y chino
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

MessagesBundle_fr_FR.properties
menu1 = Rgler l'anglais
menu2 = Rgler au franais
menu3 = Rglez chinoise
menu4 = Dfinir pour la Russie
menu5 = Afficher la date
menu6 = Montrez-moi l'argent!
menuq = Saisissez q pour quitter
e to
e n s
MessagesBundle_zh_CN.properties
elic
menu1 =
a b l
menu2 =
fe r
menu3 =
a n s
menu4 =
o n -tr
menu5 =
s an
ha uide
menu6 =
menuq = q
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
La diapositiva muestra los archivos del grupo de recursos para francs y chino. Tenga en cuenta
que los nombres de archivo incluyen idioma y pas. La opcin de men ingls se ha sustituido por
w i n
las alternativas francs y chino.
Ed

Programacin Java SE 7 15-8


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Qu archivo del grupo representa el idioma espaol y el


cdigo de pas de Estados Unidos?
a. MessagesBundle_ES_US.properties
b. MessagesBundle_es_es.properties
c. MessagesBundle_es_US.properties
d. MessagesBundle_ES_us.properties
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 15-9


Inicializacin de la aplicacin de ejemplo
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

PrintWriter pw = new PrintWriter(System.out, true);


// More init code here

Locale usLocale = Locale.US;


Locale frLocale = Locale.FRANCE;
Locale zhLocale = new Locale("zh", "CN");
Locale ruLocale = new Locale("ru", "RU");
Locale currentLocale = Locale.getDefault();
e to
e n s
ResourceBundle messages = ResourceBundle.getBundle("MessagesBundle",
elic
currentLocale);
a b l
fe r
// more init code here
a n s
o n -tr
an
public static void main(String[] args){
SampleApp ui = new SampleApp();
s
ha uide
ui.run();
m tG )
}
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
Con los grupos de recursos creados, simplemente necesita cargar los grupos en la aplicacin. El
cdigo de origen en la diapositiva muestra los pasos. En primer lugar, cree un objeto Locale que
w i n
especifique el idioma y el pas. A continuacin, cargue el grupo de recursos especificando el
Ed nombre del archivo base para el grupo y el Locale actual.
Tenga en cuenta que hay dos formas de definir un objeto Locale. La clase Locale incluye
constantes por defecto para algunos pases. Si no est disponible una constante, puede usar el
cdigo de idioma con el cdigo de pas para definir la ubicacin. Finalmente, puede usar el
mtodo getDefault() para obtener la ubicacin por defecto.

Programacin Java SE 7 15-10


Aplicacin de ejemplo: bucle principal

public void run(){


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

String line = "";


while (!(line.equals("q"))){
this.printMenu();
try { line = this.br.readLine(); }
catch (Exception e){ e.printStackTrace(); }

switch (line){
e to
case "1": setEnglish(); break;
e n s
case "2": setFrench(); break;
el ic
a b l
case "3": setChinese(); break;
fe r
case "4": setRussian(); break;
a n s
case "5": showDate(); break;
o n -tr
case "6": showMoney(); break;
s an
}
) ha uide
}
c o m tG
}
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i( e
Para esta
r a v
aplicacin, un mtodo de ejecucin contiene el bucle principal. El bucle se ejecuta
a
M que se introduce la letra "q" como entrada. Una conmutacin de cadena se utiliza para
hasta
w i nrealizar una operacin segn el nmero introducido. Se realiza una simple llamada a cada
Ed mtodo para realizar los cambios de configuracin regional y mostrar la salida con formato.

Programacin Java SE 7 15-11


Mtodo printMenu
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En lugar de texto, se utiliza el grupo de recursos.


messages es un grupo de recursos.
Se utiliza una clave para recuperar cada opcin de men.
El idioma se selecciona segn la definicin de Locale.
public void printMenu(){
pw.println("=== Localization App ===");
e to
pw.println("1. " + messages.getString("menu1"));
e n s
pw.println("2. " + messages.getString("menu2"));
elic
pw.println("3. " + messages.getString("menu3"));
a b l
fe r
pw.println("4. " + messages.getString("menu4"));
a n s
-tr
pw.println("5. " + messages.getString("menu5"));
pw.println("6. " + messages.getString("menu6"));
o n
pw.println("q. " + messages.getString("menuq"));
s an
ha uide
System.out.print(messages.getString("menucommand")+" ");
)
}
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
En lugar de imprimir el texto, se llama al grupo de recursos (messages) y el objeto Locale actual

i n M
determina el idioma presente para el usuario.
w
Ed

Programacin Java SE 7 15-12


Cambio de Locale

Para cambiar Locale:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Defina currentLocale en el idioma deseado.


Vuelva a cargar el grupo mediante la configuracin
regional actual.

public void setFrench(){


e to
currentLocale = frLocale;
e n s
messages = ResourceBundle.getBundle("MessagesBundle",
elic
currentLocale);
a b l
fe r
}
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
Una vez que se actualiza el grupo del men con la configuracin regional correcta, el texto de la
interfaz se agrega con el idioma seleccionado.
w i n
Ed

Programacin Java SE 7 15-13


Interfaz de ejemplo con francs
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Despus de seleccionar la opcin de francs, la interfaz de


usuario actualizada es parecida a la siguiente:

=== Localization App ===


1. Rgler l'anglais
2. Rgler au franais
3. Rglez chinoise
e to
4. Dfinir pour la Russie
e n s
5. Afficher la date
elic
a b l
6. Montrez-moi l'argent!
fe r
q. Saisissez q pour quitter
a n s
Entrez une commande:
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
La interfaz de usuario actualizada se muestra en la diapositiva. La primera y la ltima lnea de la
aplicacin tambin se podran localizar.
w i n
Ed

Programacin Java SE 7 15-14


Formato de fecha y moneda
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Los nmeros se pueden localizar y mostrar en su


formato local.
Las clases de formato especial incluyen:
DateFormat
NumberFormat
Cree objetos mediante Locale. e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
El cambio de texto no es la nica herramienta de localizacin disponible. Las fechas y nmeros
tambin se pueden formatear segn los estndares locales.
w i n
Ed

Programacin Java SE 7 15-15


Inicializacin de fecha y moneda
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

La aplicacin puede mostrar la moneda y la fecha con formato


local. Las variables se inicializan de la siguiente forma:

// More init code precedes


NumberFormat currency;
Double money = new Double(1000000.00); e to
e n s
elic
Date today = new Date();
a b l
DateFormat df;
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
Antes de realizar ninguna accin de formato, se deben configurar los objetos de fecha y nmero.
Tanto la fecha actual como un objeto Double se utilizan en esta aplicacin.
w i n
Ed

Programacin Java SE 7 15-16


Visualizacin de fecha

Aplicacin de formato a una fecha:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Obtenga un objeto DateFormat basado en el objeto


Locale.
Llame al mtodo format transfiriendo la fecha al formato.
public void showDate(){

df = DateFormat.getDateInstance(DateFormat.DEFAULT, currentLocale);
e to
pw.println(df.format(today) + " " + currentLocale.toString());
e n s
}
elic
a b l
fe r
Fechas de ejemplo:
a n s
o n -tr
an
20 juil. 2011 fr_FR
20.07.2011 ru_RU
s
ha uide
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
Cree un objeto con formato de fecha mediante la configuracin regional y la fecha se formatear
para la configuracin regional.
w i n
Ed

Programacin Java SE 7 15-17


Personalizacin de fechas
Las constantes DateFormat incluyen:
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

SHORT: es completamente numrica, como 12.13.52 o 3:30


p.m.
MEDIUM: es ms larga, como 12 ene, 1952
LONG: es ms larga, como 12 de enero,1952 o 3:30:32 p.m.
FULL: se especifica completamente, como martes, 12 de
abril, 1952 DC o 3:30:42 p.m. PST
e to
SimpleDateFormat: n s
l i ce
Una subclase de una clase DateFormat bl e
f e ra
Letra Fecha u hora Presentacin Ejemplos
t r a ns
o n -
G Era Texto
s an AD
y Ao Ao
) ha uide 1996; 96
M Mes en ao c o mMes t G Julio; Jul; 07
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i( e
El objeto
r a v
DateFormat incluye un nmero de constantes que puede usar para aplicar formato a la
a
in M
salida de fecha.
w La clase SimpleDateFormat es una subclase de DateFormat y permite un mayor control de la
Ed salida de fecha. Consulte la documentacin para obtener las opciones disponibles.
En algunos casos, el nmero de letras pueden determinar la salida. Por ejemplo, con el mes:
MM 07
MMM Jul
MMMM July

Programacin Java SE 7 15-18


Visualizacin de moneda
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Aplicacin de formato a la moneda:


Obtenga una instancia de moneda de NumberFormat.
Transfiera Double al mtodo format.

public void showMoney(){


currency = NumberFormat.getCurrencyInstance(currentLocale);
pw.println(currency.format(money) + " " + currentLocale.toString());
e to
}
e n s
elic
a b l
Salida de moneda de ejemplo: fe r
1 000 000 . ru_RU
a n s
1 000 000,00 fr_FR
o n -tr
1,000,000.00 zh_CN
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Cree un objeto NumberFormat mediante la configuracin regional seleccionada y obtenga la

i n M
salida con formato.
w
Ed

Programacin Java SE 7 15-19


Prueba
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Qu constante de formato de fecha proporciona la


informacin ms detallada?
a. LONG
b. FULL
c. MAX
d. COMPLETE
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 15-20


Resumen

En esta leccin, debe haber aprendido a hacer lo siguiente:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Describir las ventajas de localizar una aplicacin


Definir lo que representa una configuracin regional
Leer y definir la configuracin regional mediante el objeto
Locale
Crear un grupo de recursos para cada configuracin to
regional n s e
lice
Llamar a un grupo de recursos desde una aplicacin ble
Cambiar la configuracin regional para un grupo f e
de
ra
recursos t r a ns
o n -
an
Aplicar formato a texto para la localizacin
s
ha ide
mediante NumberFormat y)DateFormat
u
o m t G
a ilc den
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
e ma us
a v i(
a r
i n M
w
Ed

Programacin Java SE 7 15-21


Visin general de la prctica 15-1:
Creacin de una aplicacin de fecha localizada
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Esta prctica trata la creacin de una aplicacin localizada


que muestra las fecha en diferentes formatos.

e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 15-22


(Opcional) Visin general de la prctica 15-2:
Localizacin de una aplicacin JDBC
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Esta prctica trata la creacin de una versin localizada de


una aplicacin JDBC de la leccin anterior.

e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 15-23


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Ed
w i n M
ara
v i
( e m a r a
u
@
s
a
vi e thi
il c o
gm s Stu
d
)
e n
s
m tG
o
ha uide
an
tr n -
a n s fe
r
a b l el
ic
e n s e
to
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Descripcin general de SQL

e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed
Objetivos
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Al finalizar esta leccin, debera estar capacitado para:


Describir la sintaxis de comandos SQL-92/1999 bsicos,
incluidos:
SELECT
INSERT
UPDATE
e to
DELETE e n s
elic
CREATE TABLE
a b l
fe r
DROP TABLE
a n s
Definir tipos de datos
o n -tr
SQL-92/1999
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 A-2


Uso de SQL para consultar la base de datos

El lenguaje de consulta estructurado (SQL) es:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Lenguaje estndar de ANSI para el funcionamiento


de bases de datos relacionales
Uso y aprendizaje sencillos y eficaces
Funcionalidad completa (con SQL, puede definir,
recuperar y manipular datos en las tablas) to
n s e
ic e
SELECT department_name
b l el
FROM departments;
fer a
n s
Base de
n
datos- tra
a no
h a s de
m ) Gui
o
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
e ma us
a v i(
En una base de datos relacional, no es necesario especificar la ruta de acceso a las tablas y
a r
n Mtampoco es necesario saber cmo se organizan los datos de forma fsica.
wi Para acceder a la base de datos, ejecute una sentencia de lenguaje de consulta estructurado
Ed (SQL), que es el lenguaje estndar de ANSI (American National Standards Institute) para el
funcionamiento de bases de datos relacionales. SQL es un juego de sentencias con el que todos
los programas y usuarios acceden a los datos de Oracle Database. Los programas y las
herramientas de Oracle a menudo permiten el acceso de usuarios a la base de datos sin utilizar
directamente SQL, pero estas aplicaciones a su vez deben utilizar SQL al ejecutar la solicitud del
usuario.
SQL proporciona sentencias para distintas tareas, que incluyen las siguientes:
Consulta de datos
Insercin, actualizacin y supresin de filas en una tabla
Creacin, sustitucin, modificacin y borrado de objetos
Control de acceso a la base de datos y sus objetos
Garanta de integridad y consistencia de la base de datos
SQL unifica todas las tareas anteriores en un lenguaje consistente y permite trabajar con datos en
el nivel lgico.

Programacin Java SE 7 A-3


Sentencias SQL

SELECT
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

INSERT
UPDATE Lenguaje de manipulacin de datos (DML)
DELETE
MERGE

CREATE
ALTER
DROP Lenguaje de definicin de datos (DDL)
e to
RENAME
e n s
TRUNCATE
elic
COMMENT
a b l
fer
GRANT
n s
REVOKE Lenguaje de control de datos (DCL)
n - tra
n o
COMMIT a
s de
ROLLBACK h
) Gui
Control de transaccionesa
SAVEPOINT
o m
a ilc dent
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
e ma us
a v i(
Sentencias SQL soportadas por el cumplimento de Oracle de los estndares de la industria
a r
Oracle Corporation asegura el cumplimiento futuro con la evolucin de los estndares mediante la
i n M
implicacin de forma activa del personal clave en los comits de estndares SQL. Los comits
w
Ed aceptados por la industria son ANSI e ISO (International Standards Organization). Tanto ANSI
como ISO han aceptado SQL como el lenguaje estndar de las bases de datos relacionales.
Statement Description
SELECT Retrieves data from the database, enters new rows, changes existing rows, and
INSERT removes unwanted rows from tables in the database, respectively. Collectively
UPDATE known as data manipulation language (DML)
DELETE
MERGE
CREATE Sets up, changes, and removes data structures from tables. Collectively known as
ALTER data definition language (DDL)
DROP
RENAME
TRUNCATE
COMMENT
GRANT Provides or removes access rights to both the Oracle Database and the structures
REVOKE within it
COMMIT Manages the changes made by DML statements. Changes to the data can be
ROLLBACK grouped together into logical transactions
SAVEPOINT
Programacin Java SE 7 A-4
Sentencia SELECT bsica
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

SELECT *|{[DISTINCT] column|expression [alias],...}


FROM table;

SELECT identifica las columnas que se van a mostrar.


FROM identifica la tabla que contiene estas columnas.
e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
En su formato ms simple, una sentencia SELECT debe incluir lo siguiente:

i n M
Una clusula SELECT, que especifica las columnas que se van a mostrar.
w Una clusula FROM, que identifica la tabla que contiene las columnas que se muestran en la
Ed clusula SELECT.
En la sintaxis:
SELECT es una lista de una o ms columnas.
* selecciona todas las columnas.
DISTINCT suprime los duplicados.
column|expression selecciona la columna o expresin especificada.
alias proporciona diferentes cabeceras de las columnas
seleccionadas.
FROM table especifica la tabla que contiene las columnas.

Programacin Java SE 7 A-5


Nota: a lo largo de este curso, las palabras palabra clave, clusula y sentencia se utilizan como
se describe a continuacin:
Una palabra clave hace referencia a un elemento SQL individual (por ejemplo, SELECT y
FROM son palabras clave).
Una clusula es parte de una sentencia SQL (por ejemplo, SELECT employee_id,
last_name, etc.).
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Una sentencia es una combinacin de dos o ms clusulas, por ejemplo, SELECT * FROM
employees.

e to
e n s
el ic
a b l
fe r
a n s
n - tr
o
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
r a vi e thi
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 A-6


Limitacin de las filas seleccionadas

Restringir las filas devueltas al utilizar la clusula WHERE:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

SELECT *|{[DISTINCT] column|expression [alias],...}


FROM table
[WHERE condition(s)];

La clusula WHERE sigue a la clusula FROM.


e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Puede restringir las filas que devuelve la consulta al utilizar la clusula WHERE. Una clusula

i n M
WHERE contiene una condicin que se debe cumplir e, inmediatamente despus, le sigue la
clusula FROM. Si la condicin es verdadera, se devolver la fila que cumpla con la condicin.
w
Ed En la sintaxis:
WHERE restringe la consulta a filas que cumplan con una condicin.

condition est compuesto por nombres de columna, expresiones,


constantes y un operador de comparacin. Una condicin
especifica una combinacin de una o ms expresiones y operadores
lgicos (booleanos) y devuelve un valor de TRUE, FALSE o
UNKNOWN.
La clusula WHERE puede comparar valores en columnas, literales, expresiones aritmticas o
funciones. Consta de tres elementos:
Nombre de la columna
Condicin de comparacin
Nombre de la columna, constante o lista de valores

Programacin Java SE 7 A-7


Uso de la clusula ORDER BY

Ordenar las filas recuperadas con la clusula ORDER BY:


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

ASC: orden ascendente, valor por defecto


DESC: orden descendente
La clusula ORDER BY es la ltima en una sentencia
SELECT:
e to
SELECT last_name, job_id, department_id, hire_date
e n s
FROM employees
elic
ORDER BY hire_date ;
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
e
ilas( filas devueltas en un resultado de consulta no est definido. La clusula ORDER
El ordena v
de
r utilizar para ordenar las filas. Sin embargo, si utiliza la clusula ORDER BY, debe ser
M
BY apuede
se
w inla ltima clusula de la sentencia SQL. Adems, puede especificar una expresin, un alias o una
Ed posicin de columna como la condicin de ordenacin.
Sintaxis
SELECT expr
FROM table
[WHERE condition(s)]
[ORDER BY {column, expr, numeric_position} [ASC|DESC]];
En la sintaxis:
ORDER BY especifica el orden en el que aparecen las filas recuperadas.
ASC ordena las filas en orden ascendente (orden por defecto).
DESC ordena las filas en orden descendente.
Si la clusula ORDER BY no se utiliza, el orden no est definido y puede que el servidor de Oracle
no recupere dos veces las filas en el mismo orden para la misma consulta. Utilice la clusula
ORDER BY para mostrar las filas en un orden especfico.
Nota: utilice las palabras clave NULLS FIRST o NULLS LAST para especificar si las filas
devueltas que contengan valores nulos deben aparecer en primer o en ltimo lugar en la
secuencia de ordenacin.

Programacin Java SE 7 A-8


Sintaxis de las sentencias INSERT
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Agregar nuevas filas a una tabla mediante la sentencia


INSERT:

INSERT INTO table [(column [, column...])]


VALUES (value [, value...]);

Con esta sintaxis, solo se inserta una fila cada vez.


e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Puede agregar nuevas filas a una tabla emitiendo la sentencia INSERT.

i n Mla sintaxis:
En
w table
Ed column
es el nombre de la tabla.
es el nombre de la columna de la tabla que se debe rellenar.
value es el valor correspondiente para la columna.
Nota: esta sentencia con la clusula VALUES agrega solo una fila cada vez a la tabla.

Programacin Java SE 7 A-9


Sintaxis de sentencias UPDATE
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Modificar los valores existentes en una tabla con la


sentencia UPDATE:

UPDATE table
SET column = value [, column = value, ...]
[WHERE condition];

e to
Actualizar ms de una fila cada vez (si es necesario). e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Puede modificar los valores existentes en una tabla mediante la sentencia UPDATE.

i n Mla sintaxis:
En
w table
Ed column
es el nombre de la tabla.
es el nombre de la columna de la tabla que se debe rellenar.
value es el valor o subconsulta correspondiente para la columna.
condition identifica las filas que se deben actualizar y se compone de nombres de
columna, expresiones, constantes, subconsultas y operadores de
comparacin.
Para confirmar la operacin de actualizacin, consulte la tabla para visualizar las filas
actualizadas.
Nota: en general, la primera columna de clave primaria se utiliza en la clusula WHERE para
identificar una nica fila para la actualizacin. El uso de otras columnas puede provocar una
actualizacin inesperada de varias filas. Por ejemplo, identificar una fila de la tabla EMPLOYEES
por nombre es peligroso, ya que puede que ms de un empleado tengan el mismo nombre.

Programacin Java SE 7 A-10


Sentencia DELETE
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Puede eliminar filas existentes de una tabla mediante la


sentencia DELETE:

DELETE [FROM] table


[WHERE condition];

e to
e n s
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
Sintaxis de sentencias DELETE
M eliminar filas existentes de una tabla mediante la sentencia DELETE.
Puede
w i n
Ed En la sintaxis:
table es el nombre de la tabla.
condition identifica las filas que se deben suprimir y se compone de nombres de
columna, expresiones, constantes, subconsultas y operadores de
comparacin.

Programacin Java SE 7 A-11


Sentencia CREATE TABLE
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Debe tener:
El privilegio CREATE TABLE
Un rea de almacenamiento
CREATE TABLE [schema.]table
(column datatype [DEFAULT expr][, ...]);
Debe especificar: e to
El nombre de tabla e n s
le lic
El nombre de columna, tipo de dato de columna y tamao
r a b
de columna sfe an
- t r
n on
s a
) a
h uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
e ma us
a v i(
Puede crear tablas para almacenar datos ejecutando la sentencia SQL CREATE TABLE. Esta
a r
i n M
sentencia es una de las sentencias DDL, que son un subjuego de sentencias SQL que se utilizan
w para crear, modificar o eliminar estructuras de Oracle Database. Estas sentencias tienen un
Ed efecto inmediato en la base de datos y registran informacin en el diccionario de datos.
Para crear una tabla, un usuario debe tener el privilegio CREATE TABLE y un rea de
almacenamiento en la que crear los objetos. El administrador de la base de datos (DBA) utiliza
sentencias de lenguaje de control de datos (DCL) para otorgar privilegios a los usuarios.
En la sintaxis:
schema es el mismo nombre que el del propietario.
table es el nombre de la tabla.
DEFAULT expr especifica un valor por defecto si se omite un valor en la sentencia
INSERT.
column es el nombre de la columna.
datatype es el tipo de dato y la longitud de la columna.

Programacin Java SE 7 A-12


Definicin de restricciones
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Sintaxis:
CREATE TABLE [schema.]table
(column datatype [DEFAULT expr]
[column_constraint],
...
[table_constraint][,...]);

Sintaxis de restriccin a nivel de columna: e to


e n s
column [CONSTRAINT constraint_name] constraint_type, elic
a b l
Sintaxis de restriccin a nivel de tabla: fe r
a n s
column,...
o n -tr
[CONSTRAINT constraint_name] constraint_type
s an
(column, ...),
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
En la diapositiva se proporciona la sintaxis para la definicin de restricciones al crear una tabla.
Puede crear las restricciones a nivel de columna o de tabla. Las restricciones definidas a nivel de
w i n
columna se incluyen al definir la columna. Las restricciones a nivel de tabla se definen al final de
Ed la definicin de tabla y deben hacer referencia a la columna o las columnas a las que pertenece la
restriccin en un juego de parntesis. Se trata principalmente de la sintaxis que diferencia a las
dos; de lo contrario, funcionalmente, una restriccin a nivel de columna es lo mismo que una
restriccin a nivel de tabla.
Las restricciones NOT NULL se deben definir a nivel de columna.
Las restricciones que se aplican a ms de una columna se deben definir a nivel de tabla.

Programacin Java SE 7 A-13


En la sintaxis:
schema es el mismo nombre que el del propietario.
table es el nombre de la tabla.
DEFAULT expr especifica un valor por defecto para utilizarlo si se omite un valor en la
sentencia INSERT.
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

column es el nombre de la columna.


datatype es el tipo de dato y la longitud de la columna.
column_constraint es una restriccin de integridad como parte de la definicin de
columna.
table_constraint es una restriccin de integridad como parte de la definicin de tabla.

e to
e n s
el ic
a b l
fe r
a n s
n - tr
o
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
r a vi e thi
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 A-14


Definicin de restricciones
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Ejemplo de una restriccin a nivel de columna:


CREATE TABLE employees(
employee_id NUMBER(6)
CONSTRAINT emp_emp_id_pk PRIMARY KEY, 1
first_name VARCHAR2(20),
...);
Ejemplo de una restriccin a nivel de tabla: e to
e n s
CREATE TABLE employees( elic
a b l
employee_id NUMBER(6),
fe r
first_name VARCHAR2(20),
a n s
...
o n -tr 2
an
job_id VARCHAR2(10) NOT NULL,
CONSTRAINT emp_emp_id_pk s
ha uide
PRIMARY KEY (EMPLOYEE_ID));
m tG )
c o n
a il d e
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
M ara
Las restricciones se crean normalmente al mismo tiempo que la tabla. Las restricciones se
pueden agregar a una tabla despus de su creacin y se pueden desactivar temporalmente.
i n
w Ambos ejemplos de la diapositiva crean una restriccin de clave primaria en la columna
Ed EMPLOYEE_ID de la tabla EMPLOYEES.
1. En el primer ejemplo se utiliza la sintaxis de nivel de columna para definir la restriccin.
2. En el segundo ejemplo se utiliza la sintaxis de nivel de tabla para definir la restriccin.
Encontrar ms informacin sobre la restriccin de clave primaria ms adelante en esta leccin.

Programacin Java SE 7 A-15


Inclusin de restricciones
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Las restricciones aplican reglas a nivel de tabla.


Las restricciones impiden la supresin de una tabla
si hay dependencias.
Los siguientes tipos de restricciones son vlidos:
NOT NULL
UNIQUE e to
e n s
PRIMARY KEY
elic
FOREIGN KEY a b l
fe r
CHECK
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ElM
ara
Restricciones
servidor de Oracle utiliza restricciones para evitar la introduccin de datos no vlidos en las
i n
w tablas.
Ed Puede utilizar restricciones para realizar lo siguiente:
Aplicar reglas a los datos de la tabla cuando se inserta, actualiza o suprime una fila de la
misma. La restriccin se debe cumplir para que la operacin sea correcta.
Evitar la supresin de una tabla si hay dependencias de otras tablas.
Proporcionar reglas para las herramientas de Oracle, como Oracle Developer.

Programacin Java SE 7 A-16


Restricciones de integridad de datos

Constraint Description
NOT NULL Specifies that the column cannot contain a null value

UNIQUE Specifies a column or combination of columns whose values


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

must be unique for all rows in the table


PRIMARY KEY Uniquely identifies each row of the table
FOREIGN KEY Establishes and enforces a referential integrity between the
column and a column of the referenced table such that values
in one table match values in another table.
Specifies a condition that must be true
CHECK
e to
e n s
elic
a b l
fer
a n s
n - tr
o
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
r a vi e thi
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 A-17


Tipos de datos

Tipo de dato Descripcin


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

VARCHAR2(size) Datos de caracteres de longitud variable


CHAR(size) Datos de caracteres de longitud fija
NUMBER(p,s) Datos numricos de longitud variable
DATE Valores de fecha y hora
Datos de caracteres de longitud variable (hasta 2 GB)
LONG
e to
CLOB Datos binarios (hasta 4 GB)
e n s
elic
RAW and LONG Datos binarios no procesados
a b l
RAW
fer
BLOB Datos binarios (hasta 4 GB) a n s
BFILE Datos binarios almacenados en un archivo externo o n -tr
(hasta 4 GB)
s an
Sistema numrico de ) a -64 que
hbase i derepresenta la
ROWID
direccin nicaode muna filat G u
en su tabla correspondiente
i l c e n
g ma Stud
a v i@
Copyright t h isy/o sus filiales. Todos los derechos reservados.
2011, Oracle

m ar use
v i (e
Tipos de
a radatos
M
Al identificar una columna para una tabla, debe proporcionar un tipo de dato para la columna. Hay
winvarios tipos de datos disponibles:
Ed Data Type Description
VARCHAR2(size) Variable-length character data (A maximum size must be
specified: minimum size is 1; maximum size is 4,000.)
CHAR [(size)] Fixed-length character data of length size bytes (Default and
minimum size is 1; maximum size is 2,000.)
NUMBER [(p,s)] Number having precision p and scale s (Precision is the total
number of decimal digits and scale is the number of digits to
the right of the decimal point; precision can range from 1 to
38, and scale can range from 84 to 127.)
DATE Date and time values to the nearest second between January 1,
4712 B.C., and December 31, 9999 A.D.
LONG Variable-length character data (up to 2 GB)

CLOB Character data (up to 4 GB)

Programacin Java SE 7 A-18


D ata T ype D escription
RAW(size) R aw binary data of length size (A m axim um size m ust be specified: m axim um
size is 2,000.)
LONG RAW R aw binary data of variable length (up to 2 G B )
BLOB B inary data (up to 4 G B )
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

BFILE B inary data stored in an external file (up to 4 G B )

ROWID A base-64 num ber system representing the unique address of a row in its table

Directrices
Las columnas LONG no se copian al crear una tabla mediante una subconsulta.
Las columnas LONG no se pueden incluir en una clusula GROUP BYu ORDER BY.
Solo se puede utilizar una columna LONG por tabla. e to
e n s
No se pueden definir restricciones en las columnas LONG.
el ic
Puede que desee utilizar una columna CLOB en lugar de una columna LONG.
a b l
fe r
a n s
n - tr
o
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
r a vi e thi
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 A-19


Borrado de una tabla
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Mueve una tabla a la papelera de reciclaje.


Elimina la tabla y todos sus datos completamente si se
especifica la clusula PURGE.
Invalida objetos dependientes y elimina privilegios de
objeto en la tabla.
e to
e n s
DROP TABLE dept80;
elic
a b l
fe r
a n s
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
ara
La sentencia DROP TABLE mueve una tabla a la papelera de reciclaje o elimina la tabla y todos

i n M
sus datos de la base de datos completamente. A menos que especifique la clusula PURGE, la
sentencia DROP TABLE no vuelve a liberar espacio en los tablespaces para que lo utilicen otros
w
Ed objetos y el espacio sigue contando en la cuota de espacio del usuario. El borrado de una tabla
invalida objetos dependientes y elimina privilegios de objeto en la tabla.
Al borrar una tabla, la base de datos pierde todos los datos de la tabla y los ndices asociados
a los mismos.
Sintaxis
DROP TABLE table [PURGE]
En la sintaxis, table es el nombre de la tabla.
Directrices
Se suprimen todos los datos de la tabla.
Se mantienen las vistas y los sinnimos, pero no son vlidos.
Se confirman las transacciones pendientes.
Solo el creador de la tabla o un usuario con el privilegio DROP ANY TABLE puede eliminar
una tabla.

Programacin Java SE 7 A-20


Resumen
Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

En esta leccin, debe haber aprendido a hacer lo siguiente:


Describir la sintaxis de comandos SQL-92/1999 bsicos,
incluidos:
SELECT
INSERT
UPDATE
e to
DELETE e n s
elic
CREATE TABLE
a b l
fe r
DROP TABLE
a n s
Definir tipos de datos SQL-92/1999
o n -tr
s an
) ha uide
c o m tG
a il d e n
@ gm s Stu
a
Copyright
r hi y/o sus filiales. Todos los derechos reservados.
vi 2011,e Oracle
t
m a u s
i ( e
v
Mara
w i n
Ed

Programacin Java SE 7 A-21


Unauthorized reproduction or distribution prohibited Copyright 2013, Oracle and/or its affiliates

Ed
w i n M
ara
v i
( e m a r a
u
@
s
a
vi e thi
il c o
gm s Stu
d
)
e n
s
m tG
o
ha uide
an
tr n -
a n s fe
r
a b l el
ic
e n s e
to

You might also like