Вы находитесь на странице: 1из 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