Documentos de Académico
Documentos de Profesional
Documentos de Cultura
IBM Training
Worldwide Certified Material
Core Java
Contenido
Volumen 3: Manejo de Excepciones .................................................................1
Unidad 1: Manejo de Excepciones y Tipos de Excepciones...........................3
Objetivos de Aprendizaje
1. Introduccin
14
17
17
8. Manejo de Excepciones
19
21
Resumen
23
24
27
29
1. Introduccin
30
30
32
34
36
39
42
45
Resumen
50
51
53
55
Ejercicios de Laboratorio
56
Core Java
Objetivos de Aprendizaje
56
1. Introduccin
56
2. Archivos
56
3. Flujos
56
4. La Clase InputStream
56
5. La Clase OutputStream
56
6. La Clase Reader
56
7. La Clase Writer
56
8. La Clase Scanner
56
Resumen
56
56
56
56
Ejercicios de Laboratorio
56
56
1. Introduccin
56
2. Serializacin de Objetos
56
56
56
Resumen
56
56
56
56
Ejercicios de Laboratorio
56
ii
Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.
Core Java
Core Java
Core Java
1. Introduccin
En el Volumen 2 Programacin Orientada a Objetos, se revis Java como lenguaje de
programacin y se identificaron los conceptos de clases, objetos, modificadores de
acceso, herencia en java, interfaces y paquetes. En esta unidad, se discutir como se
manejan los errores en un programa.
Los programas no estn siempre libres de errores, en Java cuando ocurre una
condicin de error, se lanza una excepcin. Las excepciones son eventos anormales
que ocurren durante el curso de la ejecucin de un programa y rompen la secuencia
normal de ejecucin del programa.
Algunas de las preguntas inherentes a las excepciones, que le pueden surgir al
programador son las siguientes:
El cdigo para el manejo de errores debe asociarse con cul parte del
programa?
Core Java
Cuando un nmero es dividido entre cero. Esto puede ser detectado slo en
tiempo de ejecucin, ya que las operaciones se efectan durante la ejecucin
del programa.
Cuando se accede a un elemento de un arreglo que esta fuera del lmite del
arreglo.
Estos son solo algunos ejemplos de cuando puede ocurrir una excepcin en un
programa. Algunas de estas no son lo suficientemente serias y la ejecucin del
programa puede continuar, una vez manejadas, pero hay excepciones que no permiten
que contine la ejecucin del programa.
A continuacin se discute el soporte provisto por Java para el manejo de excepciones.
Core Java
Figura 1.1 muestra la secuencia de acciones que ocurren cuando se presenta una
condicin anormal.
Core Java
Core Java
Si la lista es null.
Si la lista esta disponible, pero vaca.
Si el valor de 'N' no es un ndice vlido en la lista.
Si el elemento N no es un string.
Ahora se expande el algoritmo anterior para incluir el manejo de errores.
El algoritmo comienza aqu
1. String recuperarNEsimoElemento(List lista, int n) {
2.
3.
4.
String str;
5.
6.
7.
8.
9.
10.
if (lista == null)
11.
12.
13.
14.
15.
16.
17.
}
return str;
}
7.
8.
Core Java
9.
10.
11.
12.
13.
14.
} catch (elemento_no_es_String) {
1) Manejo de la excepcion cuando el elemento a
recuperar no es un String;
15.
16. }
Core Java
try {
recuperarNEsimoElemento(lista, n);
// Otras sentencias
} catch (lista_es_nula) {
// Manejo de la excepcion cuando la lista es nula;
} catch (lista_esta_vacia) {
// Manejo de la excepcion cuando la lista esta vacia;
} catch (indice_invalido) {
// Manejo de la excepcion cuando el indice es invalido;
} catch (elemento_no_es_String) {
// Manejo de la excepcion cuando el elemento a
// recuperar no es un String;
}
}
Se puede ver del cdigo anterior que el bloque try-catch se uso en el mtodo
validarLista() en lugar de en el mtodo recuperarNEsimoElemento(). Si
validarLista() no maneja la excepcin, necesita especificar usando la clusula
throws las excepciones que no maneja. Finalmente, las excepciones deben ser
manejadas en algn punto del programa, dentro de la pila de llamadas. Si ningn
manejador esta disponible la JVM maneja la excepcin, y finaliza.
Se explic como manejar excepciones usando los bloques try y catch, adems de
como el mtodo que lanza una excepcin, lo indica, usando la clusula throws. A
continuacin se explica como se puede lanzar una excepcin.
Core Java
else {
// Continuar
}
}
El algoritmo termina aqu
En el algoritmo anterior, cuando algunaCondicion es verdadera, se lanza una
excepcin usando la sentencia throw. La sentencia throw lanza un objeto de la clase
excepcin NombreExcepcion. Este objeto debe pertenecer a la clase excepcin
especificada en la clusula throws. En el ejemplo anterior, la sentencia throw crea un
objeto de la clase NombreExcepcion y lo lanza. A menos que una excepcin sea
arrojada en el programa, no puede ser tomada o manejada en ningn lugar.
Un mtodo puede lanzar ms de una excepcin de la siguiente manera:
El algoritmo comienza aqu
tipoDeRetorno nombreMetodo(tipoDeDato nombreArgumento)
throws NombreExcepcion1,
NombreExcepcion2 {
// Declaraciones
// Algunas sentencias
if (algunaCondicion1)
throw new NombreExcepcion1();
else {
// Continuar
if (algunaCondicion2)
throw new NombreExcepcion2();
else
// Continuar
}
}
El algoritmo termina aqu
En el algoritmo anterior, el mtodo lanza dos excepciones mediante el uso de dos
sentencias throw en el cuerpo del mtodo. Si alguno de los mtodos en una clase
lanza un objeto excepcin que no concuerda con las clases excepcin especificadas en
la clusula throws del mtodo, se genera un error en tiempo de compilacin.
El mtodo recuperarNEsimoElemento() usado anteriormente se muestra ahora con
las sentencias throw incluidas:
Core Java
Core Java
Core Java
La Figura 1.2 muestra dos escenarios en los cuales se invoca el cdigo en el bloque
finally. Se explica a continuacin cada uno de ellos.
En el primer escenario, el mtodo lanza todas las excepciones, ya que no hay un bloque
catch. El bloque finally es ejecutado siempre. Aqu, la organizacin esta
garantizada, al quedar separado el manejo de excepciones.
El segundo escenario muestra sentencias catch adems del bloque finally. El
mtodo captura las excepciones que coincidan con las del bloque catch. El bloque
catch lanza una nueva excepcin. La pulcritud esta todava garantizada.
Java tambin permite a los programadores crear sus propias excepciones. Esto les
ayuda a manejar situaciones de error que podran surgir de acuerdo al comportamiento
de los objetos de las clases escritas por ellos. Se discutir en detalle esta caracterstica
poderosa en la Unidad 2- Lanzamiento y Manejo de Excepciones.
A continuacin se explica como se pueden agrupar las excepciones.
Core Java
La Figura 1.4 representa los errores que ocurren en la lectura y escritura de archivos.
Nota: Las excepciones en las sub-clases deben ser manejadas antes que las
excepciones en las superclases. Si las superclases son manejadas primero, el cdigo
que maneja las subclases nunca alcanzar las excepciones en la subclase.
Aunque es til clasificar las excepciones en categoras y manejar una categora
particular de excepciones, algunas veces la situacin puede demandar que cada
excepcin se maneje separadamente.
Por esto, hay dos formas en las que se puede capturar y manejar excepciones. El
primer mtodo es capturar cada excepcin separadamente, comenzando desde el nodo
Core Java
Core Java
}
catch (FileException x) {/*
// Cdigo para manejar la excepcin
}
El algoritmo termina aqu
Una vez entendidos los conceptos de excepciones, se explican ahora las excepciones
verificadas y las no verificadas.
Core Java
Los objetos de las clases Error y Exception son las excepciones lanzadas en los
programas Java. Los errores causan que los objetos Error sean lanzados y las
excepciones causan que los objetos Exception sean lanzados. Los errores son
excepciones de bajo nivel, lanzados por la JVM.
Java provee pocas clases excepcin como parte de su librera, se explican ahora
brevemente.
Los programas Java que se escriben pueden lanzar y capturar solo excepciones, y no
errores. La clase RuntimeException es un tipo especial de excepcin que indica las
excepciones ocurridas en la JVM en tiempo de ejecucin. La clase
NullPointerException es un tipo de RuntimeException que ocurre cuando un
mtodo intenta acceder a un objeto a travs de una referencia a null. No es necesario
para los programadores capturar y manejar excepciones del tiempo de ejecucin, ya
que es difcil seguirlas y capturarlas. Se ha discutido acerca de las excepciones, ahora
Unidad 1: Manejo de Excepciones y Tipos de Excepciones
Core Java
pasando a los errores, algunos ejemplos de errores son: errores de AWT, errores de
enlace, error de hilo muerto, y error de la mquina virtual. Java tiene clases separadas
para manejar todos estos tipos de errores. AWT (Abstract Window Toolkit) ser cubierto
en el Volumen 5, Unidad 1 Componentes y Contenedores AWT.
A continuacin se resumen las posibles acciones que se pueden tomar cuando se
encuentra una excepcin en el programa.
8. Manejo de Excepciones
Los programadores pueden manejar las excepciones en cuatro formas, que son:
Core Java
Core Java
Core Java
Core Java
Resumen
Ahora que ha completado esta unidad, usted debe ser capaz de:
Core Java
Core Java
Core Java
10) Cul palabra clave se usa para indicar que un mtodo lanza una excepcin?
a)
throw.
b)
thrown.
c)
throws.
d)
Core Java
Core Java
Core Java
1. Introduccin
En la Unidad 1 Manejo de Excepciones y Tipos de Excepciones, se explicaron las
excepciones, la importancia de manejar excepciones y las clases excepcin en Java. Se
mostraron las sentencias bsicas en Java try, catch y finally, que ayudan a
manejar las excepciones y tambin se discutieron las excepciones verificadas y no
verificadas.
En esta unidad, se discutirn algunos ejemplos que ilustran el manejo de las
excepciones de Java. Tambin se explicar el mtodo para definir, capturar y manejar
excepciones definidas por el usuario.
Igualmente se explic que Java provee soporte para manejar excepciones en la forma
de excepciones verificadas y no verificadas. Estas forman parte de la clasificacin
general de las excepciones estndar en Java. Java tambin le proporciona al
programador la posibilidad de definir excepciones, que son llamadas excepciones
definidas por el usuario. Antes, de proceder se explican las excepciones estndar en
Java.
Core Java
8.
9.
10.
11.
12.
13.
14.
15.
16.
i = Integer.parseInt(args[0]);
miArregloFloat[i - 1] = (float) 11.234;
System.out.println(miArregloFloat[i]);
17.
18.
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println(
19.
20.
21.
22.
23.
24.
Core Java
Core Java
Core Java
Core Java
6.
7.
8.
9.
10.
11.
System.out.println(
"Invocando dividirEnteros " +
"para dividir 12 entre 0");
12.
13.
14.
dividirEnteros(12, 0);
}/* Metodo main termina aqui */
15.
16.
17.
18.
19.
20.
int z = x / y;
System.out.println("Cociente: " + z);
}// Fin del bloque try
21.
22.
23.
catch (Exception e) {
System.out.println(
"Ocurrio una excepcion efectuando la division");
24.
25.
26.
27.
28.
System.out.println(
"Ejecucion del bloque finally");
}// Fin del bloque finally
29.
}/* Metodo dividirEnteros termina aqui */
30. }/* Definicion de la clase termina aqui */
El cdigo Java termina aqu
La salida del cdigo anterior ser como sigue:
Invocando dividirEnteros para dividir 12 entre 3
Cociente: 4
Ejecucion del bloque finally
Libro 2: Core Java
Core Java
Core Java
Por ejemplo, asuma que la excepcin A tiene las subclases B y C. Otra clase llamada
Super en su mtodo miMetodo lanza una excepcin de tipo A. Cualquier clase
derivada de Super, cuando sobrescriba miMetodo, puede lanzar una excepcin de tipo
A, o las subclases de A, que son B y C. Las subclases de Super no pueden lanzar
ninguna otra excepcin en el mtodo miMetodo.
El mtodo en la subclase puede lanzar menos excepciones que el mtodo en la
superclase o puede no lanzar ninguna excepcin.
Sin embargo, el mtodo declarado en la subclase no puede lanzar una excepcin que
sea superclase de la excepcin lanzada en el mtodo de la superclase. Se presenta el
Ejemplo 2.4 para entender esto claramente.
Nota: Estas reglas aplican solo para excepciones verificadas, y solo para mtodos
sobrescritos no sobrecargados.
Ejemplo 2.4
El siguiente cdigo ilustra el concepto de lanzar excepciones en superclase y subclases.
El cdigo Java comienza aqu
1.
2.
3.
import javax.naming.LinkException;
import javax.naming.NamingException;
4.
5.
6.
7.
8.
9.
10.
}/* Metodo miMetodo termina aqui */
11. }/* Definicion de la clase SuperClase termina aqui */
12.
13. /*Definicion de la clase SubClase comienza aqui*/
14. public class SubClase extends SuperClase{
15.
/* Metodo miMetodo comienza aqui */
16.
17.
18.
19.
20.
21.
Core Java
22.
23.
24.
25.
26.
27.
28.
}// Fin del bloque catch
29.
}/* Metodo main termina aqui */
30. }/* Definicion de la clase SubClase termina aqui */
El cdigo Java termina aqu
Este programa no compilar (lnea 16 en SubClase) porque el mtodo miMetodo en
SuperClase lanza LinkException, y el mtodo miMetodo en SubClase lanza
NamingException, que es superclase de LinkException.
Suponga que el mtodo miMetodo en SuperClase lanza NamingException, y el de
SubClase lanza LinkException, entonces el programa compilar. Vea las lneas
que cambiaran en el ejemplo anterior:
El cdigo Java comienza aqu
.
.
1. /*Definicion de la clase SuperClase comienza aqui*/
2. class SuperClase{
3.
/* Metodo miMetodo comienza aqui */
4.
5.
6.
7.
}/* Metodo miMetodo termina aqui */
8. }/* Definicion de la clase SuperClase termina aqui */
9.
10. /*Definicion de la clase SubClase comienza aqui*/
11. public class SubClase extends SuperClase{
12.
13.
14.
15.
16.
.
Core Java
.
El cdigo Java termina aqu
Asuma que el mtodo miMetodo en SubClase no lanza ninguna excepcin. An as, el
programa compila, ya que el mtodo sobrescrito puede lanzar menos nmero de
excepciones o ninguna excepcin. Esto se ilustra en el siguiente fragmento de cdigo:
El cdigo Java comienza aqu
.
.
1. /*Definicion de la clase SuperClase comienza aqui*/
2. class SuperClase{
3.
/* Metodo miMetodo comienza aqui */
4.
public static void miMetodo(int a)
5.
throws LinkException{
6.
7.
.
.
El cdigo Java termina aqu
En el programa anterior, aunque miMetodo(), definido en la clase SubClase, no
lanza ninguna excepcin, el programa compila.
Fin del Ejemplo 2.4
Se discute a continuacin como las excepciones definidas por el usuario pueden ser
creadas para adaptarse a los programas.
Core Java
5.
6.
7.
super();
}/* Constructor MiBaseExcepcion termina aqui */
8.
9.
10.
Core Java
11.
}/* Constructor MiBaseExcepcion termina aqui */
12. }/* Definicion de la clase MiBaseExcepcion termina aqui */
13.
14. /*Definicion de la clase MiSubExcepcion comienza aqui*/
15. public class MiSubExcepcion extends MiBaseExcepcion{
16.
/* Constructor MiSubExcepcion comienza aqui */
17.
18.
19.
public MiSubExcepcion() {
super();
}/* Constructor MiSubExcepcion termina aqui */
20.
21.
22.
23.
24.
public MiSubExcepcion(String s) {
super(s);
}/* Constructor MiSubExcepcion termina aqui */
super();
}/* Constructor ProximaExcepcion termina aqui */
34.
35.
36.
37.
}/* Constructor ProximaExcepcion termina aqui */
38. }/* Definicion de la clase ProximaExcepcion termina aqui */
El cdigo Java termina aqu
Aqu, se tiene tres excepciones creadas, MiSubExcepcion es subclase de
MiBaseExcepcion, que a su vez es subclase de Exception. Por esto,
MiSubExcepcion es indirectamente una subclase de la clase Exception.
MProximaExcepcion es una subclase directa de la clase Exception.
Fin del Ejemplo 2.5
Core Java
Core Java
Tmese el ejemplo de la clase Stack. Las principales operaciones que se hacen con
una pila son push cuando se coloca un elemento en la pila y pop cuando se toma el
elemento que est en el tope de la pila. Java provee excepciones estndar para indicar
las excepciones que podran ser lanzadas durante las operaciones de push y pop.
Defnase un mtodo llamado top, que se usa para obtener el elemento del tope de la
pila sin removerlo de la pila. Se debe lanzar una excepcin si se intenta obtener el
elemento en el tope de una pila vaca. Se escribe una clase propia de excepcin
(PilaVaciaExcepcion), que ser lanzada cuando se intenta obtener el elemento tope
de una pila vaca. El siguiente programa ilustra esto:
El cdigo Java comienza aqu
1. import java.io.BufferedReader;
2. import java.io.IOException;
3. import java.io.InputStreamReader;
4. import java.util.Stack;
5.
6. /*Definicion de la clase PilaVaciaExcepcion comienza aqui*/
7. class PilaVaciaExcepcion extends Exception{
8.
/* Constructor PilaVaciaExcepcion comienza aqui */
9.
10.
11.
public PilaVaciaExcepcion() {
System.out.println("La pila esta vacia");
}/* Constructor PilaVaciaExcepcion termina aqui */
throws PilaVaciaExcepcion{
21.
22.
23.
24.
25.
26.
27.
28.
if (pe.isEmpty()){
}
}/* Metodo top termina aqui */
/* Metodo main comienza aqui */
Core Java
29.
30.
31.
32.
33.
34.
35.
36.
37.
new InputStreamReader(System.in));
System.out.println(
"Ingrese la cantidad de elementos de la pila");
38.
39.
total = Integer.parseInt(br.readLine());
40.
41.
42.
if (total != 0) {
System.out.println("Ingrese los numeros");
43.
44.
45.
46.
47.
48.
total--;
}
49.
50.
51.
System.out.print(
"El elemento que esta en el " +
"tope de la pila es: ");
52.
53.
54.
55.
56.
57.
}
} catch (PilaVaciaExcepcion pv) {
58.
59.
60.
System.out.println(pv);
} catch (IOException e) {
e.printStackTrace();
61.
62.
} catch (NumberFormatException e) {
System.out.println("Valor invalido");
63.
64.
65.
pila.top(pila);
System.exit(0);
}
}/* Metodo main termina aqui */
Core Java
Core Java
Core Java
En la seccin anterior se vio como la clusula throws se puede usar para manejar
excepciones definidas por el usuario. Antes de seguir examinando la definicin de
excepciones en clases definidas por el usuario, se presenta una breve discusin sobre
usar clases excepcin en Java con un ejemplo.
Recuerde que todas las excepciones son subclases de la clase Throwable. Existen
algunas cosas que se deben tener en cuenta cuando se usa la jerarqua de
excepciones. Considere el Ejemplo 2.7.
Ejemplo 2.7
Escriba un programa que usa la jerarqua de excepciones, para entender los aspectos
involucrados en esto.
El cdigo Java comienza aqu
1. /*Definicion de la clase MiBaseExcepcion comienza aqui*/
2. class MiBaseExcepcion extends Exception{
3.
/* Constructor MiBaseExcepcion comienza aqui */
4.
public MiBaseExcepcion() {
5.
6.
7.
super();
}/* Constructor MiBaseExcepcion termina aqui */
8.
9.
10.
super(s);
11.
}/* Constructor MiBaseExcepcion termina aqui */
12. }/* Definicion de la clase MiBaseExcepcion termina aqui */
13.
14. /*Definicion de la clase MiSubExcepcion comienza aqui*/
15. class MiSubExcepcion extends MiBaseExcepcion{
16.
17.
18.
19.
20.
21.
22.
23.
24.
public MiSubExcepcion(String s) {
super(s);
}/* Constructor MiSubExcepcion termina aqui */
Core Java
26.
27. /*Definicion de la clase ExcepcionEjemplo comienza aqui*/
28. public class ExcepcionEjemplo {
29.
30.
31.
32.
33.
34.
35.
36.
System.out.println(e.getMessage());
System.out.println("Manejado en el metodo1");
37.
38.
39.
40.
41.
42.
43.
44.
45.
int resultado;
try {
46.
47.
48.
49.
50.
51.
} catch (MiSubExcepcion e) {
System.out.print("MiSubExcepcion: ");
System.out.println(e.getMessage());
52.
53.
54.
System.out.println("Manejado en el metodo2");
} finally {
System.out.print("\n");
55.
56.
57.
}
}/* Metodo metodo2 termina aqui */
58.
59.
60.
61.
62.
63.
64.
65.
Core Java
66.
67.
68.
else
return i + i;
}/* Metodo metodo3 termina aqui */
69.
70.
71.
72.
73.
try {
metodo1(99);
74.
} catch (Exception e) {}
75.
}/* Metodo main termina aqui */
76. }/* Definicion de la clase ExcepcionEjemplo termina aqui */
El cdigo Java termina aqu
En el programa anterior, MiBaseExcepcion define dos constructores una que no
toma parmetros, y otro que toma un parmetro de tipo String. La excepcin
MiSubExcepcion que es subclase de MiBaseExcepcion sobrescribe los dos
constructores de MiBaseExcepcion.
La clase ExcepcionEjemplo define tres mtodos: metodo1(), metodo2() y
metodo3(). metodo1() invoca a metodo2() que a su vez invoca a metodo3().
metodo3()
lanza
dos
excepciones,
llamadas,
MiBaseExcepcion
y
MiSubExcepcion. La excepcin MiSubExcepcion, que es lanzada por metodo3(),
es manejada por metodo2(). La excepcin MiBaseExcepcion que es lanzada por
metodo3() se pasa a metodo2(), que a su vez la pasa a metodo1(), que finalmente
maneja la excepcin.
Si metodo2() manejara MiBaseExcepcion, entonces manejara ambas
MiBaseExcepcion y MiSubExcepcion cuando metodo3() lance estas excepciones.
En este caso las excepciones no se pasarn a metodo1().
Fin del Ejemplo 2.7
Core Java
Resumen
Ahora que ha completado esta unidad, usted ser capaz de:
Core Java
Core Java
Core Java
Core Java
Manejar excepciones.
Core Java
Ejercicios de Laboratorio
1) Escriba un programa en Java que tenga una clase abstracta llamada Cuenta. Esta
clase debe tener los siguientes miembros:
private int id;
private float saldo;
abstract void depositar(float monto) throws
MontoAnormalException;
abstract void retirar(float monto) throws
MontoInsuficienteException;
El programa debe tener tambin dos clases concretas llamadas
CuentaCorriente y CuentaAhorro que son subclases de la clase Cuenta. Los
objetos de la clase CuentaCorriente pueden llegar a tener el saldo negativo
luego de un retiro, al contrario de los objetos de la clase CuentaAhorro que no
pueden llegar a tener saldo negativo. Las clases MontoAnormalException y
MontoInsuficienteException son clases excepciones que deben ser
manejadas en el programa.
Debe escribir una clase Principal que permita crear instancias de
CuentaCorriente y CuentaAhorro para verificar el manejo correcto de las
excepciones.
Recomendaciones tiles:
Escriba una clase llamada Cuenta que defina los miembros mencionados y
mtodos que permitan acceder a las variables private (geter y seter).
El mtodo depositar() acepta un dato float que representa el monto que se
desea depositar en la cuenta. Este mtodo lanza MontoAnormalException
como advertencia cuando el monto a depositar excede los 10 millones de Bs.
El mtodo retirar() acepta una dato float que representa el monto que se
desea
retirar
de
la
cuenta.
Este
mtodo
lanza
MontoInsuficienteException cuando el monto a retirar es mayor al saldo
disponible en la cuenta.
Crear dos clases excepciones llamadas MontoInsuficienteException y
MontoAnormalException que tengan mensajes acordes con el evento
sucedido.
Crear dos subclases de Cuenta llamadas CuentaCorriente y
CuentaAhorro. Estas clases deben ser concretas, para esto deben
implementar los mtodos abstractos de su superclase.
La clase CuentaCorriente debe permitir crear instancias de ella en donde sea
posible tener saldos negativos sin lanzar ninguna excepcin.
Core Java
2) Escriba un programa en Java que tenga una clase llamada Autentica. Esta clase
tiene los nombres de usuario y sus correspondientes palabras claves guardadas
en arreglos String (declarados private). Tambin tiene una variable boolean,
accesoPermitido, cuyo valor por defecto es false. Existe un mtodo llamado
chequearClave() que verifica la palabra clave ingresada contra el nombre de
usuario. Si la palabra clave ingresada es correcta, entonces imprime
Autenticacin Verificada. Acceso al Usuario Permitido en la
salida estndar cambia el valor de accesoPermitido a true.
Si la palabra clave ingresada es incorrecta entonces accesoPermitido se hace
false y se lanza una excepcin llamada PropiedadPrivadaExcepcion.
PropiedadPrivadaExcepcion es una excepcin definida por el usuario. La
clase Usuario instancia la clase Autentica, e invoca al mtodo
chequearClave()para validar la palabra clave a fin de obtener acceso a
DatoSecreto. Los datos en la clase DatoSecreto solo puede ser accedidos
cuando accesoPermitido de Autentica es true, de otra forma se lanza una
excepcin AlertaDeIntrusoExcepcion, tambin definida por el usuario.
Ambas
excepciones
PropiedadPrivadaExcepcion
y
AlertaDeIntrusoExcepcion tienen informacin que puede ser usada por
Usuario cuando son capturadas.
Recomendaciones tiles:
Escriba una clase llamada DatoSecreto que tenga una variable private y
mtodos para obtener y asignar valor a la variable private.
Escriba una clase Autentica y dentro de ella, declare dos arreglos de String
que sean inicializadas con nombres de usuario y sus correspondientes palabras
clave.
Escriba una clase, Usuario que acepte un nombre de usuario y una palabra
clave y use el mtodo chequearClave para autenticar al usuario.
Core Java
Si
el
mtodo
chequearClave
retorna
PropiedadPrivadaExcepcion es lanzada.
3)
la
false,
excepcin
accede cuando
la
excepcin
Escriba un programa en Java que invierta una cadena dada. Si la cadena original
y la cadena invertida son iguales, entonces lanza una excepcin Palindrome,
que es una excepcin definida por el usuario.
Recomendaciones tiles:
Core Java
Core Java
Describir FileDescriptor.
Core Java
1. Introduccin
Esta unidad se ocupa de la entrada y salida en Java.
La mayora de las aplicaciones requieren de datos que sean ledos de una fuente
externa o datos que sean almacenados en una fuente externa. Los archivos se usan
para almacenar, leer y escribir datos. Para hacer esto, primero se debe acceder a los
archivos, la unidad trata con dos categoras de clases, que estn relacionadas con
archivos:
Archivos.
Flujos.
Core Java
File,
FileDescriptor,
RandomAccessFile,
ObjectStream,
OutputStream, Reader y Writer derivan de la clase Object.
InputStream,
Core Java
2. Archivos
Java provee soporte a archivos usando tres clases, llamadas, File, FileDescriptor
y RandomAccessFile para usar el sistema de archivos en una computadora. A
continuacin se explicar primero la clase File.
Serializable
Comparable
Core Java
import java.io.File;
2.
3. /*Definicion de la clase DetalleArchivo comienza aqui*/
4. public class DetalleArchivo {
5.
/* Metodo main comienza aqui */
6.
public static void main(String[] args) {
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
}
20.
}/* Metodo main termina aqui */
21. }/* Definicion de la clase DetalleArchivo termina aqui */
El cdigo Java termina aqu
La salida del programa ser la siguiente:
* * * Datos del Archivo * * *
Nombre: ejemplo.txt
Ruta Completa: /home/student1/ejemplo.txt
Directorio Padre: /home/student1
Tamano (en Bytes): 16
Nota: El objeto File es una abstraccin de los archivos en el sistema. La creacin de
un objeto File no crear ningn archivo en el sistema de archivos.
Core Java
FileDescriptor.in
FileDescriptor.out
FileDescriptor.err
Core Java
try {
FileDescriptor fd = FileDescriptor.out;
FileWriter fw = new FileWriter(fd);
fw.write("Hola mundo!");
fw.close();
} catch (Exception e) {
e.printStackTrace();
}
37.
}/* Metodo main termina aqui */
38. }/*Definicion de la clase FileDescriptorEjemplo termina aqui*/
El cdigo Java termina aqu
El objeto fd se crea usando el manejador para el flujo de salida
FileDescriptor.out. fd y se le pasa entonces a FileWriter como argumento,
durante su instanciacin. Como resultado de compilar y ejecutar este programa se
imprime en la consola de salida la frase Hola mundo!
Fin del Ejemplo 1.2
En esta seccin se aprendi acerca de la clase FileDescriptor, ahora se continuar
con archivos que son accedidos de forma aleatoria.
Core Java
DataOutput
DataInput
Los argumentos que se usan cuando se instancia una clase, ayudan a decidir si el
objeto ser usado para lectura o escritura.
La siguiente lnea de cdigo crea un RandomAccessFile que se usa para leer del
archivo entrada.txt.
new RandomAccessFile("entrada.txt", "r");
La siguiente lnea crea una clase RandomAccessFile que se usa para lectura y
escritura en el archivo salida.txt:
new RandomAccessFile("salida.txt", "rw");
El r y rw indican el modo de apertura del archivo de acceso aleatorio. Aqu r denota
slo lectura, y rw denota lectura-escritura.
La clase RandomAccessFile provee soporte para el concepto de apuntador a archivo
para indicar la ubicacin actual en el archivo. En el momento de creacin del archivo, el
puntero de archivo se establece en 0, lo que indica el inicio del archivo. Luego el
nmero de bytes que son ledos o escritos mueve el apuntador del archivo.
Esta manipulacin del apuntador a archivo se lleva a cabo en esta clase, usando los
siguientes tres mtodos: skipBytes(), seek() y getFilePointer().
El mtodo skipBytes() mueve el apuntador de archivo hacia adelante el nmero de
bytes especificado. El mtodo seek() posiciona el apuntador de archivo exactamente
antes del byte especificado. El mtodo getFilePointer() permite obtener la
ubicacin actual del apuntador a archivo. En caso de que el fin de archivo se alcance
antes de leer el nmero de bytes especificado, entonces se lanza una EOFException y
en caso de no leer o escribir un byte, entonces se lanza una IOException. Una
IOException puede ser lanzada tambin cuando un flujo est cerrado.
Ejemplo 1.3
Este programa ilustra como leer y escribir datos a un archivo de acceso aleatorio.
Core Java
12.
13.
14.
15.
16.
17.
18.
19.
20.
} catch (Exception e) {
System.out.println(e);
}
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
System.out.println(
"\nAlfabeto desde el archivo " +
nombreArchivo);
32.
33.
34.
35.
36.
Libro 2: Core Java
i += 2 * POSICION_CARACTER) {
Core Java
37.
38.
39.
raf.seek(i);
System.out.println(raf.readChar());
}// Fin del ciclo for
40.
41.
42.
raf.close();
} catch (FileNotFoundException e) {
System.out.println("No se encuentra el archivo");
43.
44.
45.
System.exit(0);
} catch (IOException e) {
System.out.println(e);
46.
47.
}
} /* Metodo leerAlfabeto termina aqui */
48.
49.
50.
51.
52.
53.
54.
55.
56.
System.out.println(
"Los datos a escribir en el archivo " +
nombreArchivo + " son:");
57.
58.
59.
60.
61.
62.
63.
}/* Metodo escribirAlfabeto termina aqui */
64. }/* Definicion de la clase termina aqu */
El cdigo Java termina aqu
La salida del programa anterior es como sigue:
Los datos a escribir en el archivo aleatorio.txt son:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Alfabeto desde el archivo aleatorio.txt
B
D
Core Java
F
H
J
L
N
P
R
T
V
X
Z
Fin del Ejemplo 1.3
En este programa, el archivo aleatorio.txt tiene las letras de la A a la Z.
RandomAccessFile se usa para acceder en forma no secuencial cada segundo
carcter almacenado en el archivo e imprimir en la salida estndar, sin pasar por cada
carcter en forma secuencial.
Ahora que se sabe como trabajar con archivos en Java, se explican los flujos y como se
manejan en Java.
3. Flujos
La entrada/salida en Java est basada en flujos. Java trata toda la informacin,
independientemente de la fuente o el destino, como flujos. Los datos que son ledos y
escritos en un programa Java son tratados como un flujo de datos, bytes continuos de
datos que vienen y van. Estos bytes son ledos o escritos a archivos, conectores o
conexiones en Internet.
Los flujos son independientes del dispositivo.
Un flujo en Java es cualquier ruta de informacin desde la fuente al destino. Los
siguientes son algunos pares de fuentes y destinos:
Core Java
Core Java
Flujos de Byte.
Flujos de Carcter.
Estos dos tipos de flujos permiten acceder datos de una manera secuencial.
Los flujos de byte se usan para transferir 8-bits de datos, mientras que los flujos de
caracteres trabajan con caracteres de 16-bit Unicode. Los flujos de byte son
representados en Java con las clases:
InputStream.
OutputStream.
Reader.
Writer.
Java considera un enfoque internacional para los caracteres; se usan dos bytes para
representar un carcter. Las clases InputStream y OutputStream no pueden
procesar caracteres Unicode de una forma eficiente, para esto fueron creadas las
clases Reader y Writer en Java.
La Figura 1.3 muestra los flujos de byte y de carcter en Java.
Core Java
4. La Clase InputStream
La clase InputStream es una clase abstracta que permite leer bytes (8-bit) de datos.
Esta clase extiende de la clase Object. Las clases que heredan de InputStream
deben implementar un mtodo que retorne el prximo byte de datos del flujo que se
est leyendo.
Las subclases de la clase InputStream se muestran en la Figura 1.4.
Core Java
Ejemplo 1.4
El ejemplo ilustra la lectura en un string que el usuario introduce y se muestra el string
usando un objeto ByteArrayInputStream.
El cdigo Java comienza aqu
1.
import java.io.ByteArrayInputStream;
2.
3. /*Definicion de la clase comienza aqui*/
4. public class ByteArrayInputStreamEjemplo {
5.
/* Metodo main comienza aqui */
6.
public static void main(String[] args) {
7.
8.
9.
10.
11.
12.
13.
14.
15.
ByteArrayInputStream bais;
bais = new ByteArrayInputStream(arregloBytes);
16.
17.
18.
19.
20.
21.
/* Leer de ByteArrayInputStream
y mostrar en mayuscula */
22.
23.
24.
25.
26.
}
bais.reset();
27.
}/* Metodo main termina aqui */
28. }/* Definicion de la clase termina aqui */
El cdigo Java termina aqu
La salida del programa anterior es como sigue:
ByteArrayInputStream obtuvo:
Libro 2: Core Java
Core Java
HOLA MUNDO!
Fin del Ejemplo 1.4
El programa del Ejemplo 1.4 toma el string hola mundo! como entrada, y lo lee
usando el ByteArrayInputStream y se imprime en la salida estndar usando letras
maysculas.
La prxima clase que se estudia es la FileInputStream.
import java.io.FileInputStream;
2. import java.io.FileNotFoundException;
3. import java.io.InputStream;
4.
5. /*Definicion de la clase comienza aqui*/
6. public class FileInputStreamEjemplo {
7.
8.
9.
10.
11.
12.
int cantidad;
String nombreArchivo = "miArchivo.txt";
InputStream ie;
13.
14.
15.
ie = new FileInputStream(nombreArchivo);
cantidad = ie.available();
System.out.println(
16.
17.
18.
19.
Core Java
20.
21.
22.
cantidad + "\n");
/* Mostrar los datos de byte
23.
24.
25.
26.
27.
28.
}
/* Cerrar el InputStream */
29.
30.
ie.close();
} catch (FileNotFoundException e) {
31.
32.
33.
System.out.println("Archivo no encontrado");
System.exit(0);
} catch (Exception e) {
34.
35.
36.
System.out.println(e);
} // Fin del bloque Exception
}/* Metodo main termina aqui */
Core Java
12.
13.
14.
super(in);
}/* Constructor FilterInputStreamEjemplo termina aqui */
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
/* Imprimir Alfabeto */
if ((valor >= 'A' && valor <= 'Z') ||
(valor >= 'a' && valor <= 'z'))
return valor;
/* Retorno de carro, nueva linea,
26.
27.
28.
29.
30.
31.
32.
33.
34.
Core Java
return valor;
/* Caracteres no imprimibles */
else
return '?';
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
;
/* Caracteres no imprimibles */
else if (datos[i] < 32 || datos[i] > 126)
datos[i] = (byte) '?';
}
55.
56.
57.
return resultado;
} /* Metodo read sobrecargado termina aqui */
58.
59.
60.
61.
62.
Core Java
63.
64.
65.
66.
67.
68.
69.
70.
71.
while (true) {
int c = fise.read();
72.
73.
if (c == -1)
break;
74.
75.
76.
System.out.print((char) c);
}
}
77.
}/* Metodo main termina aqui */
78. }/* Definicion de la clase termina aqui */
El cdigo Java termina aqu
Este programa filtra el flujo de entrada para permitir solo letras. El archivo
palabras.txt que se pasa como argumento por la lnea de comandos tiene el
siguiente contenido:
Bienvenido a IBM, este programa ilustra el uso de
FileInputStream
Al introducir el siguiente comando:
java FilterInputStreamEjemplo palabras.txt
La salida del programa ser la siguiente:
Bienvenido?a?IBM??este?programa?ilustra?el?uso?de?FileInpu
tStream
Fin del Ejemplo 1.6
El programa del Ejemplo 1.6 lee el contenido del archivo palabras.txt carcter por
carcter y los imprime en la salida estndar nicamente si son letras del alfabeto. Si
FilterInputStream lee un carcter no imprimible, el carcter es filtrado y se imprime
un signo de interrogacin (?) en la salida estndar.
A continuacin se explican las cuatro subclases de la clase FilterInputStream.
Core Java
import java.io.BufferedInputStream;
2. import java.io.FileInputStream;
3. import java.io.IOException;
4.
5. /*Definicion de la clase comienza aqui*/
6. public class BufferedInputStreamEjemplo {
7.
/* Metodo main comienza aqui */
8.
9.
10.
11.
12.
13.
14.
15.
16.
try {
BufferedInputStream bis;
17.
18.
19.
20.
21.
);
int contador = 1;
int b;
22.
23.
Core Java
24.
25.
26.
if (b == '\n')
contador++;
}
27.
28.
29.
bis.close();
System.out.println(
30.
31.
32.
33.
34.
} catch (IOException e) {
System.err.println(e);
35.
}
36.
}/* Metodo main termina aqui */
37. }/* Definicion de la clase termina aqui */
El cdigo Java termina aqu
Suponiendo que el archivo palabras.txt tenga lo siguiente:
Bienvenido a
IBM
La salida del programa anterior ser la siguiente:
El archivo contiene 2 lineas
Fin del Ejemplo 1.7
El programa anterior acepta un nombre de archivo de la lnea de comandos. Abre el
archivo especificado usando BufferedInputStream, lee el contenido del archivo,
byte a byte. Cuando se encuentra el carcter \n, el valor del contador de lneas es
incrementado. Finalmente, muestra el total de lneas en la salida estndar.
Ejemplo 1.8
Unidad 1: Archivos y Flujos
Core Java
12.
13.
14.
15.
16.
17.
in = new DataInputStream(
new BufferedInputStream(
new FileInputStream(nombreArchivo)
18.
19.
20.
)
);
21.
22.
23.
System.out.println(
"Leyendo el archivo: " +
nombreArchivo +
24.
25.
26.
27.
28.
+ "\n");
29.
30.
31.
} catch (FileNotFoundException e) {
System.out.println("Archivo no encontrado");
System.exit(0);
32.
33.
34.
} catch (IOException e) {
System.err.println("IOException");
}
35.
}/* Metodo main termina aqui */
36. }/* Definicion de la clase termina aqui */
Libro 2: Core Java
Core Java
Ejemplo 1.9
Core Java
10.
11.
12.
13.
14.
15.
16.
17.
ByteArrayInputStream bais;
bais = new ByteArrayInputStream(arregloBytes);
18.
19.
20.
21.
22.
23.
int caracter;
while ((caracter = pis.read()) != -1) {
24.
25.
26.
if (caracter == '=') {
if ((caracter = pis.read()) == '=')
System.out.print(".eq.");
27.
28.
29.
else {
System.out.print("<-");
pis.unread(caracter);
30.
31.
32.
}
} else {
System.out.print((char) caracter);
33.
Core Java
34.
35.
36.
}
} catch (IOException e) {
System.out.println(e);
37.
}
38.
}/* Metodo main termina aqui */
39. }/* Definicion de la clase termina aqui */
El cdigo Java termina aqu
La salida de este programa es la siguiente:
if (marca.eq.75)
resultado<-distincion;
Fin del Ejemplo 1.9
En el programa anterior, se le asigna el string "if (marca==75)\n" +
"resultado=distincion;\n", a texto (lnea 10). Este string se lee byte-por-byte
usando PushbackInputStream y se imprime en la salida estndar. Si dos = son
ledos subsecuentemente, entonces se imprime .eq. en la salida estndar. Si un solo
= es ledo, entonces se imprime <- en la salida estndar y el carcter siguiente(d) se
coloca de nuevo en el flujo.
La prxima subclase de InputStream, que se estudia es la clase PipedInputStream.
Core Java
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
return false;
}/* Metodo hasMoreElements termina aqui */
27.
28.
29.
30.
31.
if (!hasMoreElements())
Core Java
32.
33.
34.
35.
36.
37.
38.
39.
40.
} catch (FileNotFoundException e) {
System.err.println(
"No se puede abrir el archivo: " +
41.
42.
43.
44.
45.
proximoArchivo);
System.exit(0);
}
}
46.
return in;
47.
} /* Metodo nextElement termina aqui */
48. }/* Definicion de la clase Archivo termina aqui */
49.
50. /* Definicion de la clase comienza aqui */
51. public class SequenceInputStreamEjemplo {
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
Core Java
int c;
while ((c = s.read()) != -1)
72.
73.
74.
System.out.print((char) c);
/* Cerrar SequenceInputStream */
75.
76.
77.
s.close();
} catch (IOException e) {
e.printStackTrace();
78.
79.
}
}/* Metodo main termina aqui */
Los archivos listados como argumentos para lnea de comandos son miArchivo.txt
y Empleado.txt.
Libro 2: Core Java
Core Java
4.10
La Clase StringBufferInputStream
Una aplicacin puede crear este flujo de un string y leer los contenidos en la forma de
bytes. Esta clase slo usa los ocho bits bajos usados para representar un carcter. La
clase StringBufferInputStream extiende de Inputstream. Esta clase est
actualmente desaprobada (deprecated) y por esto no es recomendable usarla.
Ahora, se discute en detalle la clase OutputStream.
5. La Clase OutputStream
La clase OutputStream es una clase abstracta que permite escribir datos en la forma
de bytes (8-bits). Las clases que son subclases de OutputStream deben implementar
un mtodo que retorne al menos un byte de datos como salida. Sin embargo, las
subclases pueden sobrescribir los mtodos proporcionados por OutputStream para
tener mayor eficiencia o para aadir algunas caractersticas.
La clase OutputStream extiende de la clase Object. Las subclases de la clase
OutputStream se muestran en la Figura 1.5.
Core Java
import java.io.BufferedReader;
2. import java.io.ByteArrayOutputStream;
3. import java.io.IOException;
4. import java.io.InputStreamReader;
5.
6. /* Definicion de la clase comienza aqui */
Core Java
try {
String texto;
/* Crear instancia de BufferedReader */
BufferedReader br;
br = new BufferedReader(
new InputStreamReader(System.in)
);
18.
19.
20.
do {
System.out.println("Ingrese texto:");
texto = br.readLine();
21.
22.
23.
texto = texto.trim();
} while (texto.length() == 0);
24.
25.
26.
27.
28.
29.
30.
31.
32.
aros.write(arregloBytes1);
System.out.println(
"Contenido del ByteArrayOutputStream : " +
33.
34.
35.
System.out.println(
36.
37.
38.
39.
40.
41.
42.
43.
aros.toString());
44.
45.
46.
Core Java
System.out.println();
} catch (IOException e) {
System.out.println(e);
47.
}
48.
}/* Metodo main termina aqui */
49. }/* Definicion de la clase termina aqui */
El cdigo Java termina aqu
La salida de este programa es la siguiente:
Ingrese texto:
Bienvenido a IBM
Contenido del ByteArrayOutputStream : Bienvenido a IBM
Se copia el ByteArrayOutputStream a un arreglo de byte:
Bienvenido a IBM
Fin del Ejemplo 1.11
El programa anterior toma el string Bienvenido a IBM como entrada del usuario.
Este es convertido en un arreglo de byte. Un ByteArrayOutputStream se abre sobre
este arreglo de byte, y sus contenidos son impresos en la salida estndar usando el
mtodo ByteArrayOutputStream.toString(). Los contenidos de este flujo son
ledos byte-por-byte e impresos en la salida estndar.
A continuacin se explica la clase FileOutputStream.
Core Java
try {
FileOutputStream salida;
PrintStream ps;
13.
14.
15.
16.
17.
18.
19.
20.
br = new BufferedReader(
new InputStreamReader(System.in)
);
21.
22.
23.
do {
System.out.println("Ingrese texto");
24.
25.
26.
texto = br.readLine();
texto = texto.trim();
} while (texto.length() == 0);
27.
28.
29.
30.
31.
32.
33.
34.
35.
ps = new PrintStream(salida);
ps.println(texto);
System.out.println(
36.
37.
38.
39.
40.
41.
42.
43.
Core Java
44.
}/* Metodo main termina aqui */
45. }/* Definicion de la clase termina aqui */
El cdigo Java termina aqu
El archivo archivoSalida.txt ser creado si no existe, dependiendo de la
plataforma en la cual se ejecute la JVM, y contendr el siguiente string, si el string de
entrada introducido es Bienvenido a IBM.
Ingrese texto
Bienvenido a IBM
Texto escrito en el archivo archivoSalida.txt
Fin del Ejemplo 1.12
En el ejemplo anterior, el string Bienvenido a IBM se toma como entrada del usuario
y
se
escribe
a
un
archivo
llamado
archivoSalida.txt,
usando
FileOutputStream.
A continuacin se estudia FilterOutputStream y sus subclases.
Core Java
Ejemplo 1.13
El programa en este ejemplo imprime los caracteres correspondientes a los valores
enteros del 65 al 90.
El cdigo Java comienza aqu
1.
import java.io.BufferedOutputStream;
2. import java.io.DataOutputStream;
3. import java.io.FileNotFoundException;
4. import java.io.FileOutputStream;
5. import java.io.IOException;
6.
7. /* Definicion de la clase comienza aqui */
8. public class BufferedOutputStreamEjemplo {
9.
/* Metodo main comienza aqui */
10.
public static void main(String[] args) {
11.
12.
13.
14.
15.
16.
try {
/* Debe ingresar dos argumentos en
linea de comandos */
if (args.length != 2) {
System.err.println(
"Debe ingresar algo asi:");
17.
18.
System.err.println(
"java BufferedOutputStreamEjemplo " +
19.
20.
21.
"nombreArchivo cantidadBuffer");
System.exit(1);
}
22.
23.
24.
25.
26.
27.
commando a entero */
int cantidadBuffer = Integer.parseInt(args[1]);
28.
29.
30.
31.
32.
Core Java
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
System.out.println();
dos.close();
44.
45.
46.
} catch (FileNotFoundException e) {
System.out.println(
"Archivo no encontrado");
47.
48.
49.
System.exit(0);
} catch (IllegalArgumentException e) {
System.out.println(
50.
51.
52.
53.
54.
55.
56.
57.
58.
Core Java
que
almacena
los
caracteres
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
3.
4.
5.
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
6.
7.
8.
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
9. import java.io.PrintStream;
10.
11. /* Definicion de la clase PrintStreamEjemplo comienza aqui */
12. public class PrintStreamEjemplo {
13.
/* Metodo main comienza aqui */
14.
15.
16.
Core Java
17.
18.
19.
20.
21.
22.
23.
24.
new FileInputStream(archivoOrigen)
);
25.
26.
27.
28.
29.
30.
ps = new PrintStream(
new BufferedOutputStream(
new FileOutputStream(archivoDestino)
31.
32.
33.
)
);
34.
35.
36.
37.
38.
39.
System.setErr(ps);
40.
41.
42.
BufferedReader br;
br = new BufferedReader(
new InputStreamReader(System.in)
43.
44.
45.
/* Leer de BufferedReader */
46.
47.
48.
49.
50.
System.out.println(
"Salida escrita en este archivo");
);
Core Java
51.
52.
53.
/* Cerrar el PrintStream */
ps.close();
54.
55.
56.
} catch (FileNotFoundException e) {
System.out.println("Archivo no encontrado");
System.exit(0);
57.
58.
59.
} catch (IOException e) {
System.out.println("Error de Entrada/Salida");
System.exit(0);
60.
61.
}
}/* Metodo main termina aqui */
Core Java
6. La Clase Reader
Se han visto hasta ahora formas de leer y escribir datos como bytes. Los flujos tambin
se usan para ello. Se puede querer realizar estas operaciones sobre datos de tipo
caracter en vez de bytes. En estos casos, se usan las clases Reader y Writer.
Reader es una superclase abstracta para los flujos de caracteres que se usan para la
lectura de caracteres. La clase abstracta Reader provee el API junto con la
implementacin parcial para todos los flujos de lectura que se usan para leer caracteres
de 16-bit. Los lectores estn adecuados para manejar caracteres unicode y por esto son
preferibles a utilizar un flujo de entrada de objeto.
La clase Reader extiende de la clase Object. La Figura 1.6 muestra la clase Reader
y sus subclases.
Core Java
try {
/* Declaracion de variables */
String dato;
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
} catch (FileNotFoundException e) {
System.out.println("Archivo no encontrado");
System.exit(0);
30.
31.
32.
} catch (IOException e) {
System.out.println("Error de Entrada/Salida");
System.exit(0);
33.
Core Java
34.
}/* Metodo main termina aqui */
35. }/*Definicion de la clase BufferedReaderEjemplo termina aqui*/
El cdigo Java termina aqu
El archivo de entrada miArchivo.txt contiene el siguiente texto:
El BufferedReader es un tipo de Reader(lector).
Se utiliza para leer los caracteres o Strings
desde el flujo de entrada
La salida del programa ser la siguiente:
El BufferedReader es un tipo de Reader(lector).
Se utiliza para leer los caracteres o Strings
desde el flujo de entrada
Fin del Ejemplo 1.15
El programa del Ejemplo 1.15 lee el contenido del archivo miArchivo.txt a travs de
BufferedReader y lo muestra en la salida estndar.
A continuacin se explica la clase LineNumberReader, que ayuda a saber el nmero
de lneas dentro de un archivo.
import java.io.FileNotFoundException;
2. import java.io.FileReader;
3. import java.io.IOException;
Libro 2: Core Java
Core Java
4. import java.io.LineNumberReader;
5.
6. /*Definicion de la clase comienza aqui*/
7. public class LineNumberReaderEjemplo {
8.
/* Metodo main comienza aqui */
9.
public static void main(String[] args) {
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
try {
/* Crear instancia de fileReader */
FileReader fReader = new FileReader(nombreArchivo);
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
if (texto.indexOf(palabraABuscar) != -1) {
/* Extraer el numero de linea donde
la busqueda encontro la palabra */
Core Java
41.
42.
43.
44.
45.
46.
"[" +
numeroLinea +
"]: " +
47.
48.
49.
texto);
/* Establecer la bandera */
50.
51.
encontrada = true;
}
52.
53.
54.
55.
56.
57.
if (!encontrada)
System.out.println(
"La palabra " +
58.
59.
60.
palabraABuscar +
" no fue encontrada en " +
nombreArchivo);
61.
62.
63.
/* Cerrar el LineNumberReader */
lnReader.close();
64.
65.
66.
} catch (FileNotFoundException e) {
System.err.println(
"Archivo " +
67.
68.
69.
70.
71.
72.
73.
74.
nombreArchivo +
" no encontrado");
System.exit(0);
} catch (IOException e) {
System.out.println(
"Error de Entrada/Salida");
System.exit(0);
}
75.
}/* Metodo main termina aqui */
76. }/* Definicion de la clase termina aqui */
El cdigo Java termina aqu
Libro 2: Core Java
Core Java
Core Java
4. import java.io.InputStreamReader;
5.
6. /*Definicion de la clase comienza aqui*/
7. public class CharArrayReaderEjemplo {
8.
/* Metodo main comienza aqui */
9.
public static void main(String[] args) {
10.
11.
12.
try {
/* Crear una instancia de BufferedReader */
BufferedReader br;
13.
14.
br = new BufferedReader(
new InputStreamReader(System.in)
15.
16.
17.
);
/* Declaracion de variable */
18.
19.
20.
String texto;
int longitudTexto;
do {
21.
22.
23.
24.
25.
26.
texto = texto.trim();
27.
28.
29.
longitudTexto = texto.length();
System.out.println(
"La longitud del texto es: " +
30.
31.
32.
longitudTexto);
} while (longitudTexto == 0);
33.
34.
35.
36.
37.
38.
39.
40.
CharArrayReader caReader1;
caReader1 = new CharArrayReader(arregloChar);
Core Java
41.
42.
43.
int i;
44.
45.
46.
47.
48.
49.
50.
51.
do {
System.out.println(
"\nIngrese el indice del " +
52.
53.
54.
55.
56.
57.
if (inicio < 0)
System.out.println(
"El indice no puede ser negativo");
58.
59.
60.
61.
62.
63.
64.
65.
66.
do {
System.out.println(
"\nIngrese el numero de " +
67.
68.
69.
70.
71.
72.
if (numCaracteres < 0)
System.out.println(
"El numero de caracteres " +
73.
74.
75.
76.
77.
System.out.println(
"El numero de caracteres no puede " +
"ser mayor que la longitud de la cadena");
Core Java
78.
79.
80.
81.
82.
83.
CharArrayReader caReader2;
caReader2 = new CharArrayReader(
arregloChar,
84.
85.
86.
inicio,
numCaracteres
);
87.
88.
89.
90.
91.
92.
93.
94.
} catch (NumberFormatException e) {
System.out.println("Valor ingresado invalido");
System.exit(0);
95.
96.
97.
} catch (IOException e) {
System.out.println("Error de Entrada/Salida");
System.exit(0);
98.
}
99.
}/* Metodo main termina aqui */
100. }/* Definicion de la clase termina aqui */
El cdigo Java termina aqu
La salida de este cdigo con las entradas de prueba ser la siguiente:
Ingrese una linea de texto
Bienvenido a IBM
La longitud del texto es: 16
Contenido de caReader1:
Bienvenido a IBM
Ingrese el indice del caracter desde donde quiere copiar
13
Ingrese el numero de caracteres que quiere copiar
3
Contenido de caReader2:
IBM
Fin del Ejemplo 1.17
Core Java
Al usuario, primero, se le pide una lnea de texto. La lnea del usuario es:
Core Java
12.
13.
14.
15.
16.
17.
CharArrayReader car;
car = new CharArrayReader(buffer);
PushbackReader pr;
18.
19.
20.
21.
22.
System.out.println(letra);
23.
24.
25.
26.
27.
28.
/* "Desleer" un caracter */
pr.unread(letra);
29.
30.
31.
32.
System.out.println(letra);
33.
}/* Metodo main termina aqui */
34. }/*Definicion de la clase PushbackReaderEjemplo termina aqui*/
El cdigo Java termina aqu
La salida del programa anterior es la siguiente:
I
B
B
Fin del Ejemplo 1.18
Este programa lee caracteres usando PushbackReader, que se abre sobre un
CharArrayReader, abierto sobre un arreglo de caracteres. El arreglo de caracteres
tiene tres caracteres I, B y M. PushbackReader lee el primer carcter I y lo
muestra en la salida estndar, luego, lee el prximo carcter B y los muestra en la
salida estndar. Posteriormente, des-lee el segundo carcter. Ahora
PushbackReader lee el prximo caracter, que es B en vez de M. Finalmente el
carcter ledo, B, se imprime en la salida estndar.
Core Java
Figura 1.7: InputStreamReader como Puente entre Flujos de Byte y Flujos de Caracter
Core Java
La entrada del usuario tomada del teclado se lee usando InputStreamReader y luego
es convertida en caracteres. El contenido de un archivo en un disco (disco duro o disco
flexible) puede ser ledo carcter por carcter usando FileReader.
Los datos ledos pueden ser transferidos a otras computadoras conectadas a la red a
travs de conexiones de conectores (socket). Los datos pueden ser mostrados como
caracteres en la salida estndar (monitor) en la misma computadora o mostrados en la
salida estndar de una computadora diferente en la red usando PrintStream.
Esto se ilustra en la Figura 1.9.
Core Java
Ejemplo 1.19
En este programa, se le pide al usuario que introduzca una lnea de texto. La lnea del
usuario es 'Bienvenido a IBM'. Este texto se lee y se muestra en la salida estndar.
El cdigo Java comienza aqu
1.
import java.io.BufferedReader;
2. import java.io.IOException;
3. import java.io.InputStreamReader;
4.
5. /*Definicion de la clase comienza aqui*/
6. public class InputStreamReaderEjemplo {
7.
8.
9.
10.
11.
12.
13.
14.
15.
new InputStreamReader(System.in)
);
16.
17.
18.
19.
20.
21.
/* Leer el texto */
String texto = br.readLine();
22.
23.
24.
25.
26.
27.
28.
29.
30.
}
31.
}/* Metodo main termina aqui */
32. }/* Definicion de la clase termina aqui */
Unidad 1: Archivos y Flujos
Core Java
14.
15.
16.
System.err.println(
"Debe ingresar algo asi:");
System.err.println(
17.
18.
19.
20.
Libro 2: Core Java
}
Unidad 1: Archivos y Flujos 115
Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.
Core Java
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
File archivoSalida
32.
33.
34.
35.
36.
37.
38.
39.
40.
System.out.println(
"Contenido de " +
41.
42.
43.
= new File(nombreArchivoDestino);
nombreArchivoOrigen +
"\n");
44.
45.
46.
47.
48.
49.
50.
51.
52.
System.out.println("\n\n");
/* Cerrar todos los archivos abiertos */
entrada.close();
53.
54.
salida.close();
55.
56.
57.
Core Java
58.
59.
60.
new File(nombreArchivoDestino)
);
61.
62.
63.
System.out.println(
"Contenido de " +
nombreArchivoDestino +
64.
65.
66.
67.
68.
69.
70.
71.
System.out.println();
entrada.close();
72.
73.
74.
"\n");
} catch (FileNotFoundException e) {
System.out.println(
"Archivo fuente " +
75.
76.
77.
78.
79.
80.
81.
82.
83.
args[0] +
" no encontrado");
System.exit(0);
} catch (IOException e) {
System.out.println(
"Error de Entrada/Salida");
System.exit(0);
}
}/* Metodo main termina aqui */
Core Java
Contenido de tuArchivo.txt
El BufferedReader es un tipo de Reader(lector).
Se utiliza para leer los caracteres o Strings
desde el flujo de entrada
Fin del Ejemplo 1.20
El programa del Ejemplo 1.20 es muy simple. Abre un FileReader en
miArchivo.txt, y un FileWriter en tuArchivo.txt. El archivo de entrada
miArchivo.txt tiene el siguiente texto:
El BufferedReader es un tipo de Reader(lector).
Se utiliza para leer los caracteres o Strings
desde el flujo de entrada
Despus de copiar en el archivo de salida, tuArchivo.txt tiene el siguiente texto:
El BufferedReader es un tipo de Reader(lector).
Se utiliza para leer los caracteres o Strings
desde el flujo de entrada
Core Java
Ejemplo 1.21
El cdigo Java comienza aqu
1. /*Definicion de la clase StringReaderEjemplo comienza aqui*/
2. public class StringReaderEjemplo {
3.
/* Metodo main comienza aqui */
4.
5.
6.
7.
8.
9.
10.
11.
12.
/* Leer de StringReader */
while ((i = sReader.read()) != -1)
System.out.print((char) i);
13.
14.
15.
16.
17.
} catch (IOException e) {
System.out.println("Error de Entrada/Salida");
System.exit(0);
}
}/* Metodo main termina aqui */
7. La Clase Writer
Hasta ahora, se han visto formas de leer y escribir datos de tipo carcter en vez bytes.
Writer es una superclase abstracta para los flujos de caracteres que se usan para
escribir datos de tipo carcter. Las clases Writer estn adecuadas para manejar
Core Java
caracteres Unicode y por esto son preferibles a los flujos de salida de objetos. La Figura
1.10 muestra a Writer y sus subclases.
Core Java
preferible usar el mtodo newLine() definido en esta clase para marcar el fin de cada
lnea en la salida.
Usualmente cuando se hace una solicitud de escritura al Writer, este instruye al flujo
de carcter o byte subyacente para llevar a cabo esta solicitud. Por esto, un
BufferedWriter puede envolver a un escritor costoso, como un FileWriter o un
OutputStreamWriter, como se muestra:
PrintWriter pw = new PrintWriter(
new BufferedWriter(
new FileWriter("salida.txt")
)
);
Este cdigo enva de un PrintWriter a un archivo salida.txt para manejo de
buffer. En caso de que no se emplee el buffer, los caracteres sern escritos uno por uno
en el archivo. Esto puede ser ineficiente.
Considere el Ejemplo 1.22, que muestra el uso de la clase BufferedWriter:
Ejemplo 1.22
El cdigo Java comienza aqu...
1. import java.io.BufferedReader;
2. import java.io.BufferedWriter;
3. import java.io.FileWriter;
4. import java.io.IOException;
5. import java.io.InputStreamReader;
6. import java.io.PrintWriter;
7. import java.io.Writer;
8.
9. /*Definicion de la clase BufferedWriterEjemplo comienza aqui*/
10. public class BufferedWriterEjemplo {
11.
/* Metodo main comienza aqui */
12.
13.
14.
15.
16.
17.
18.
new InputStreamReader(System.in)
Core Java
19.
20.
21.
String empNombre;
22.
23.
24.
int empEdad;
float empSalario;
boolean empCasado;
25.
26.
27.
int estado = 0;
28.
29.
);
30.
31.
32.
empNombre = br.readLine();
empNombre = empNombre.trim();
33.
34.
35.
System.out.print("Edad: ");
empEdad = Integer.parseInt(br.readLine());
36.
37.
38.
System.out.print("Salario: ");
empSalario = Float.parseFloat(br.readLine());
39.
40.
41.
42.
43.
44.
empCasado = true;
else
empCasado = false;
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
Core Java
56.
57.
58.
empSalida.println(empNombre);
empSalida.println(empEdad);
empSalida.println(empSalario);
59.
60.
61.
empSalida.println(empCasado);
62.
63.
64.
empSalida.close();
System.out.println(
"Los datos del Empleado " +
/* Cerrar PrintWriter */
65.
66.
67.
68.
69.
} catch (NumberFormatException e) {
System.out.println("Numero invalido");
System.exit(0);
70.
71.
72.
} catch (IOException e) {
System.out.println("Error de Entrada/Salida");
System.exit(0);
73.
}
74.
}/* Metodo main termina aqui */
75. }/*Definicion de la clase BufferedWriterEjemplo termina aqui*/
El cdigo Java termina aqu
La salida son los detalles de un empleado almacenados en Empleado.txt.
Ingrese datos de Empleado
Nombre: Alvaro
Edad: 23
Salario: 200000
Casado (Si-0, No-1): 1
Los datos del Empleado fueron escritos en Empleado.txt
Fin del Ejemplo 1.22
En el programa del Ejemplo 1.22, los detalles del empleado como: nombre, edad,
salario y estado civil, se toman como entradas del usuario y se escriben al archivo
Empleado.txt.
Ahora, se estudiar la clase CharArrayWriter, que permite escribir arreglos de
caracteres a un flujo.
Core Java
12.
13.
14.
15.
16.
17.
18.
19.
br = new BufferedReader(
new InputStreamReader(System.in)
);
20.
21.
22.
String texto;
do {
23.
24.
25.
26.
27.
System.out.println(
"Ingrese una linea de texto: ");
texto = br.readLine();
texto = texto.trim();
} while (texto.length() == 0);
28.
29.
30.
Core Java
31.
32.
33.
caWriter.write(buffer);
System.out.println(
34.
35.
36.
"\nCharArrayWriter contiene:\n" +
caWriter.toString() +
"\n");
37.
38.
39.
40.
41.
caWriter.writeTo(fWriter);
fWriter.close();
caWriter.reset();
42.
43.
44.
System.out.println(
"El contenido del arreglo " +
45.
46.
47.
48.
49.
50.
Core Java
Core Java
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
4.
5.
6.
import java.io.IOException;
import java.io.OutputStreamWriter;
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
System.err.println(
"Escriba en la linea de comando algo asi:");
System.err.println(
18.
19.
20.
21.
22.
23.
24.
25.
26.
System.out.println(
"Asociando OutputStreamWriter " +
"con la salida standard\n");
27.
28.
29.
OutputStreamWriter osw;
osw = new OutputStreamWriter(System.out);
30.
31.
32.
33.
while (c != -1) {
Core Java
34.
35.
36.
bw.write(c);
c = fr.read();
} // Fin del ciclo while
37.
38.
39.
40.
41.
42.
bw.close();
} catch (FileNotFoundException e) {
System.out.println(
43.
44.
"Archivo " +
args[0] +
45.
46.
47.
" no encontrado");
System.exit(0);
} catch (IOException e) {
48.
49.
50.
System.out.println(
"Error de Entrada/Salida");
System.exit(0);
51.
}
52.
}/* Metodo main termina aqui */
53. }/* Definicion de la clase termina aqui */
El cdigo Java termina aqu
La salida del programa anterior ser la siguiente:
Asociando OutputStreamWriter con la salida standard
El BufferedReader es un tipo de Reader(lector).
Se utiliza para leer los caracteres o Strings
desde el flujo de entrada
Fin del Ejemplo 1.24
Este programa lee caracteres de un archivo y los imprime en la salida estndar.
El archivo de entrada contiene los siguientes datos:
El BufferedReader es un tipo de Reader(lector).
Se utiliza para leer los caracteres o Strings
desde el flujo de entradaAsociando
Asuma que se quiere leer los caracteres del archivo miArchivo.txt.
Al introducir el siguiente comando en la lnea de comandos:
Unidad 1: Archivos y Flujos
Core Java
import java.io.BufferedReader;
2. import java.io.FileWriter;
3. import java.io.IOException;
4. import java.io.InputStreamReader;
5. import java.io.Reader;
6. import java.io.StringReader;
7. import java.io.Writer;
8.
9. /*Definicion de la clase FileWriterEjemplo comienza aqui*/
10. public class FileWriterEjemplo {
11.
12.
13.
14.
15.
16.
17.
18.
19.
);
String texto;
20.
21.
new InputStreamReader(System.in)
Core Java
22.
23.
24.
do {
System.out.println(
"Ingrese una linea de texto: ");
25.
26.
27.
texto = br.readLine();
texto = texto.trim();
} while (texto.length() == 0);
28.
29.
30.
31.
32.
33.
34.
35.
Writer salida;
salida = new FileWriter("FileWriterEjemplo.txt");
int caracter;
36.
37.
38.
char c;
System.out.println(
"\nEl contenido del archivo es: ");
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
System.out.println();
56.
57.
58.
59.
60.
61.
Core Java
62.
63.
64.
65.
66.
67.
} catch (IOException e) {
System.out.println("Error de Entrada/Salida");
System.exit(0);
68.
69.
}
}/* Metodo main termina aqui */
Core Java
El mtodo printf():
public PrintWriter printf(String formato, Object ... args)
Este mtodo provee gran poder y flexibilidad a la forma en que se ver la salida, tiene
muchas opciones y un nmero variable de parmetros. Es un mtodo de salida usado
para escribir una cadena de caracteres formateada utilizando una cadena de formato y
una lista de argumentos especificados. Si el flujo automtico es habilitado, las llamadas
a este mtodo vaciarn hacia el buffer de salida.
Core Java
Parmetros:
l Es el objeto Locale para aplicar durante el formateo. Si l es null entonces no se
aplica la localizacin.
formato Es una cadena de formato la cual puede contener texto fijo y uno o ms
Core Java
8. La Clase Scanner
La clase Scanner permite hacer lectura formateada desde un flujo de entrada. Esta
clase est presente a partir de Java 5.0. La lectura se basa en un delimitador, que por
defecto es uno o varios espacios en blanco.
Considere el Ejemplo 1.26, que muestra su uso:
Ejemplo 1.26
El cdigo Java comienza aqu...
1.
2.
import java.util.Scanner;
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Unidad 1: Archivos y Flujos
21.
22.
23.
Core Java
24.
}/* Metodo main termina aqui */
25. }/* Definicion de la clase ScannerEjemplo termina aqui */
El cdigo Java termina aqu
La salida de este programa es la siguiente:
Ingrese Nombre y Edad:
Pedro <ENTER>
25 <ENTER>
Su Nombre es: Pedro
Su Edad es: 25
Fin del Ejemplo 1.26
En el programa anterior, se toma del usuario su nombre y su edad. Esta informacin se
extrae a travs de los mtodos next() y nextInt() de la clase Scanner. Luego se
cierra el flujo y se procede a mostrar el resultado de los datos ingresados por el usuario.
Core Java
Resumen
Ahora que ha completado esta unidad, usted debe ser capaz de:
Describir FileDescriptor.
Core Java
Core Java
new
BufferedReader(new
new
BufferedReader(new
File(
9) Cul de los siguientes mtodos se pueden usar para obtener los datos escritos
usando un ByteArrayOutputStream?
a) toByteArray()
b) toString()
c) toArray()
d) Ninguno de los anteriores
10) La clase RandomAccessFile se usa para ____________.
a) Lectura de archivos
b) Escritura a archivos
c) Ambos anteriores
d) Ninguna de las anteriores
Core Java
Core Java
Crear archivos.
Core Java
Ejercicios de Laboratorio
1) Escribir un programa en Java que lea el contenido de un archivo e invierta cada
palabra leda y la escriba a un archivo destino, cuyo contenido se lee y muestra
usando el mtodo printf de la clase PrintWriter.
Recomendaciones tiles:
2) Escribir un programa en Java que lea el contenido de los archivos dat1 y dat2,
ambos con el mismo nmero de lneas. Las lneas de dat1 y dat2 se leen
alternativamente y se escriben a otro archivo dat3. Finalmente, el contenido del
archivo dat3 se imprime usando el mtodo printf de la clase PrintWriter.
Recomendaciones tiles:
Escriba una clase llamada Fusion.
Core Java
3) Escribir un programa en Java que liste todos los subdirectorios del directorio actual.
Recomendaciones tiles:
Declare una variable string e inicialcela con la ruta del directorio actual.
Comience un ciclo for que se ejecute tantas veces como nmero de elementos
tenga el arreglo de string.
pedro
maria
juan
s2m
s3t
s1n
Cree un mtodo esttico que reciba un String que ser el nombre del archivo.
Mientras exista una nueva lnea en el archivo, extraiga los valores del mismo
teniendo en cuenta los tipos de datos que representa cada columna e
imprimalos usando el mtodo printf de la clase PrintWriter.
Recuerde cerrar el flujo del objeto Scanner despus de culminar la lectura del
archivo.
Core Java
Core Java
1. Introduccin
En Java, se trabaja principalmente con clases y objetos. Los objetos persisten en la
memoria hasta tanto el programa est activo. Una vez que el programa completa su
ejecucin, los objetos son destruidos. Sin embargo, es posible almacenar un objeto en
un archivo durante la primera ejecucin de un programa, de forma que el valor de dicho
objeto est disponible posteriormente. Los objetos pueden ser reconstruidos antes de la
segunda ejecucin del programa al recuperar sus valores del archivo donde se
almacenaron. Este proceso de almacenar y recuperar el valor de un objeto se realiza a
travs de la serializacin de objetos. A continuacin se estudiar esto en detalle.
2. Serializacin de Objetos
La serializacin de objetos es el proceso por el cual el estado actual de un objeto puede
ser guardado en forma persistente. Tambin se puede recuperar el objeto con su estado
de la misma forma en que se guardo. El proceso de almacenar el objeto se llama
serializacin de objetos, mientras que el proceso de leer el objeto y recuperar el valor
que haba sido almacenado se llama deserializacin de objetos.
La serializacin de objetos, aunque es un concepto simple, tiene muchos usos. La
serializacin de objetos se usa al pasar objetos a travs de flujos, en RMI y en
persistencia ligera, que se estar discutiendo ms adelante en esta unidad.
La Figura 3.1 muestra como ocurre la serializacin de objetos en Java.
Hasta tanto el programa este ejecutndose, los objetos viven dentro de la JVM. A travs
de la serializacin, los objetos se hacen persistentes fuera de la JVM an despus de
que el programa finalice su ejecucin. La serializacin ayuda a escribir y leer grafos de
objetos de la memoria al sistema de archivos y recuperar las asociaciones de memoria
del sistema de archivos a los objetos. La serializacin de objetos guarda los siguientes
detalles acerca de un objeto que esta siendo serializado:
Informacin Interna.
Core Java
Core Java
Core Java
// ...
}
En el caso de una relacin de herencia, si una superclase de una clase no es
serializable, entonces la subclase puede tomar la responsabilidad de serializar y
recuperar las variables public, protected y package de la superclase. Las variables
private no son serializables de esta forma.
Nota: Ambas la superclase y la subclase deben estar presentes en el mismo paquete
para lograr esto.
Una subclase puede tomar la responsabilidad de serializar las variables slo cuando la
superclase tiene un constructor que no toma ningn parmetro para inicializar su
estado, y es accesible por la subclase. Si existe una violacin a la regla anterior, se
detectar slo en tiempo de ejecucin.
Las variables que son serializadas son aquellas que se usan para construir el objeto.
Los campos en la superclase del objeto serializado son inicializados por el cdigo en el
constructor public o protected.
Cuando se serializa un objeto, se recorre la jerarqua de clases de este objeto para
serializar los campos y mtodos heredados por este objeto. En la jerarqua de herencia
de este objeto, se puede encontrar una clase que no implemente la interfaz
Serializable y por esto no puede ser serializada. Cuando esto ocurre, se lanza una
NotSerializableException. Durante la serializacin y deserializacin de objetos,
algunas clases pueden necesitar manejar situaciones excepcionales en una forma
especial. Estas clases pueden implementar los mtodos writeObject() y
readObject().
Los mtodos readObject() y writeObject() sirven bsicamente para personalizar
el proceso de serializacin. El mtodo writeObject() permite controlar la forma de
guardar el estado del objeto serializado en ObjectOutputStream y el estado de ese
objeto se puede restaurar usando el mtodo readObject() usando
ObjectInputStream. Se puede usar el mtodo writeObject() o los mtodos
declarados en la interfaz DataOutput para escribir al ObjectOutputStream para
serializar los campos del objeto.
Si no se quiere controlar la manera en la que los campos son serializados y es
suficiente usar el mtodo por defecto de serializacin, se puede usar el mtodo
defaultWriteObject(). Si se usa este mtodo, los campos que pertenecen a la
superclase o a la subclase de la clase en consideracin no sern serializados.
El mtodo readObject() restaura el estado del objeto que fue serializado usando el
mtodo writeObject() correspondiente. Tambin permite actualizar el estado del
objeto luego de haber sido restaurado.
Core Java
Core Java
desde una subclase, se siguen las reglas de accesibilidad para los diferentes
especificadores de acceso de Java.
No se puede serializar los campos de un objeto que no implemente la interfaz
Serializable. Una clase no serializable puede tener una subclase serializable. En
este caso, la clase no serializable necesita tener un constructor que no tome ningn
argumento, para inicializar sus campos. La subclase de esta clase no serializable debe
hacerse cargo de serializar los campos de esta clase y recuperarlos. Usualmente, los
campos de la superclase sern accesibles (public, protected, package). Si los
campos no son accesibles, la superclase deber tener los mtodos get y set que
puedan ser usados para serializar y recuperar los campos de la superclase no
serializable.
Core Java
Core Java
Core Java
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
new InputStreamReader(System.in)
);
26.
27.
28.
// Declaracin de variables
long empCodigo;
String empNombre;
29.
30.
31.
int empEdad;
32.
33.
34.
System.out.println(
"Ingrese los datos del Empleado:");
35.
36.
37.
System.out.print("Codigo: ");
empCodigo = Long.parseLong(br.readLine());
38.
39.
40.
System.out.print("Nombre: ");
empNombre = br.readLine().trim();
41.
42.
System.out.print("Edad: ");
empEdad = Integer.parseInt(br.readLine());
43.
44.
45.
Core Java
46.
47.
48.
oos.writeObject(empNombre);
oos.writeInt(empEdad);
49.
50.
51.
System.out.println(
"Los datos del empleado fueron " +
"escritos en ObjetoEmpleado.txt");
52.
53.
54.
// Cerrar el ObjectOutputStream
oos.flush();
55.
56.
oos.close();
} catch (NumberFormatException e) {
57.
58.
59.
System.out.println("Valor invalido");
System.exit(0);
} catch (IOException e) {
60.
61.
62.
System.out.println("Error de Entrada/Salida");
System.exit(0);
}
63.
}/* Metodo main termina aqui */
64. }/* Definicion de la clase termina aqui */
El cdigo Java termina aqu
El programa anterior acepta detalles del empleado y escribe el siguiente texto en el
archivo ObjetoEmpleado.txt.
Ingrese los datos del Empleado:
Codigo: 123
Nombre: Alvaro
Edad: 23
Los datos del empleado fueron escritos en
ObjetoEmpleado.txt
ObjetoEmpleado.txt contiene los siguientes datos:
Core Java
import java.io.FileInputStream;
import java.io.FileNotFoundException;
3.
4.
import java.io.IOException;
import java.io.ObjectInputStream;
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Core Java
16.
17.
18.
ObjectInputStream ois;
ois = new ObjectInputStream(fis);
19.
20.
21.
// Declaracion de variables
long empCodigo;
String empNombre;
22.
23.
24.
int empEdad;
System.out.println(
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
} catch (ClassNotFoundException e) {
System.out.println(e);
} catch (FileNotFoundException e) {
42.
43.
44.
45.
46.
47.
System.out.println("Error de Entrada/Salida");
System.exit(0);
}
48.
}/* Metodo main termina aqui */
49. }/* Definicion de la clase termina aqui */
El cdigo Java termina aqu
Core Java
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
4.
5.
6.
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
7.
8.
9.
import java.io.ObjectOutputStream;
import java.io.Serializable;
16.
17.
18.
19.
20.
21.
Core Java
super();
this.codigo = codigo;
this.nombre = nombre;
22.
23.
24.
this.sueldo = sueldo;
}/* Constructor Empleado termina aqui */
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
return datos.toString();
}/* Metodo toString termina aqui */
36.
37.
38.
39.
40.
41.
}
public void setCodigo(int codigo) {
this.codigo = codigo;
42.
43.
44.
45.
46.
47.
48.
49.
50.
this.nombre = nombre;
}
51.
52.
53.
54.
55.
}
public void setSueldo(float sueldo) {
this.sueldo = sueldo;
Core Java
56.
}
57. }/* Definicion de la clase Empleado termina aqui */
58.
59. /*Definicion de la clase SerializableEjemplo comienza aqui*/
60. public class SerializableEjemplo {
61.
/* Metodo main comienza aqui */
62.
63.
64.
65.
66.
String empNombre;
float empSueldo;
67.
68.
69.
70.
71.
72.
br = new BufferedReader(
new InputStreamReader(System.in)
);
73.
74.
75.
76.
77.
78.
79.
80.
81.
System.out.print("Nombre: ");
empNombre = br.readLine().trim();
System.out.print("Salario: ");
82.
83.
84.
empSueldo = Float.parseFloat(br.readLine());
85.
86.
87.
Empleado emp1;
emp1 = new Empleado(
empCodigo,
88.
89.
empNombre,
empSueldo
90.
91.
92.
);
// Crear una instancia de FileOutputStream
93.
94.
95.
Core Java
FileOutputStream fos;
fos = new FileOutputStream(
"SerializadoEmpleado.txt
96.
97.
98.
");
// Crear una instancia de ObjectOutputStream
99.
100.
101.
ObjectOutputStream oos;
oos = new ObjectOutputStream(fos);
102.
103.
104.
105.
106.
System.out.println(
"\nLos datos del Empleado fueron " +
"serializados en SerializadoEmpleado.txt");
107.
108.
109.
// Cerrar ObjectOutputStream
oos.flush();
110.
111.
112.
oos.close();
} catch (NumberFormatException e) {
System.out.println("Valor invalido");
113.
114.
115.
System.exit(0);
} catch (Exception e) {
System.out.println(
116.
117.
118.
119.
120.
121.
122.
123.
124.
try {
// Crear una referencia de la clase Empleado
Empleado emp2;
125.
126.
127.
128.
129.
FileInputStream fis;
fis = new FileInputStream(
"SerializadoEmpleado.txt"
Core Java
130.
131.
132.
);
// Crear una instancia de ObjectInputStream
133.
134.
135.
ObjectInputStream ois;
ois = new ObjectInputStream(fis);
136.
137.
138.
139.
140.
// Cerrar ObjectInputStream
ois.close();
141.
142.
143.
144.
145.
146.
System.out.println(
"\nEmpleado deserealizado desde " +
"SerializadoEmpleado.txt\n" +
147.
148.
149.
emp2);
} catch (FileNotFoundException e) {
System.out.println(
150.
151.
152.
"Archivo no encontrado");
System.exit(0);
} catch (Exception e) {
153.
154.
155.
System.out.println(
"Exception durante la deserializacion: " + e);
System.exit(0);
156.
}
157.
}/* Metodo main termina aqui */
158. }/*Definicion de la clase SerializableEjemplo termina aqui*/
El cdigo Java termina aqu
La clase Empleado es inicializada con los datos introducidos por el usuario. La clase
SerializableEjemplo escribe los datos al archivo SerializadoEmpleado.txt
usando ObjectOutputStream. El programa lee los contenidos de este archivo usando
ObjectInputStream, y los imprime en la salida estndar.
El contenido del SerializadoEmpleado.txt es el siguiente:
Core Java
import java.io.Externalizable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
4.
5.
import java.io.IOException;
import java.io.ObjectInput;
6.
7.
8.
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
9.
10. /*Definicion de la clase Brazil comienza aqui*/
11. class Brazil implements Externalizable {
12.
13.
14.
15.
16.
17.
Core Java
18.
19.
20.
21.
22.
23.
System.out.println("Brazil.writeExternal");
} /* Metodo writeExternal termina aqui */
24.
25.
26.
27.
28.
ClassNotFoundException {
29.
System.out.println("Brazil.readExternal");
30.
} /* Metodo readExternal termina aqui */
31. }/* Definicion de la clase Brazil termina aqui */
32.
33. /* Definicion de la clase comienza aqui */
34. public class FutbolExternalizableEjemplo {
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
oos.writeObject(objBrazil);
oos.close();
50.
51.
// Ahora regreselos:
ObjectInputStream entrada;
52.
53.
54.
55.
56.
57.
Core Java
)
);
58.
59.
60.
System.out.println("Recuperando objeto:");
objBrazil = (Brazil) entrada.readObject();
} catch (IOException e) {
61.
62.
63.
System.out.println(e);
} catch (ClassNotFoundException e) {
System.out.println(e);
64.
65.
} catch (Exception e) {
e.printStackTrace();
66.
}
67.
}/* Metodo main termina aqui */
68. }/* Definicion de la clase termina aqui */
El cdigo Java termina aqu
En este programa, se crea el objeto Brazil. Este objeto es serializado
persistentemente y escrito en el archivo Futbol.txt. El contenido de Futbol.txt es
el siguiente:
Core Java
Resumen
Ahora que ha completado esta unidad, usted debe ser capaz de:
Core Java
Core Java
Core Java
Core Java
Core Java
Ejercicios de Laboratorio
1) Escriba un programa en Java para guardar la hora del sistema en un archivo.
Recomendaciones tiles:
Declare una variable string y defina un mtodo para recuperar la variable string.
El valor de la variable string puede ser asignado usando el constructor de
MiClase.
2) La mayora conoce el juego del tenis. Para aquellos que no conocen nada de tenis,
se dar una breve introduccin al juego. El juego se juega usualmente entre dos o
cuatro jugadores. Un match (partido) entre dos jugadores se llama un match sencillo y
entre cuatro jugadores, dos en cada equipo, se llama match doble. Los matches se
clasifican segn el gnero, de forma que se tienen: los matches sencillos y dobles de
hombres, y los matches sencillos y dobles de mujeres, tambin hay matches dobles
mixtos, que involucran a un hombre y una mujer por equipo. Para este ejercicio, se
limitarn las reglas para match sencillo de tenis. El juego del tenis es nico en varios
aspectos, en trminos de puntos, jugadores sirviendo, etc. De nuevo en el contexto de
este ejercicio, nos limitaremos a las reglas sobre los puntos en un match.
El sistema de puntaje en un match sencillo de tenis es diferente a otros juegos como el
ftbol, bsquetbol, voleibol, etc. Un match de tenis consiste de 3 o 5 sets. El jugador
que gane los primeros 6 juegos es declarado ganador del set siempre y cuando el otro
jugador no haya ganado 5 juegos. Si los jugadores estn empatados en los 6 juegos,
se introduce el tiebreak (empate). En un tiebreak, el jugador que gane los primeros
siete puntos gana el juego y el set. Sin embargo, tiene que liderar a su rival por dos
puntos. En el caso de que dos jugadores estn empatados a 6 puntos en el tiebreak, el
juego se extiende hasta que el margen de dos puntos sea alcanzado por alguno de los
jugadores.
La divisin de los puntos en un juego tambin es diferente de otros juegos. El primer
punto que un jugador gana en un juego le otorga 15 puntos. El prximo punto lleva su
puntaje a 30. El tercer punto lleva su puntaje a 40 y el prximo punto gana el juego. En
Libro 2: Core Java
Core Java
caso de que los jugadores estn empatados 40-40, el juego va a deuce, donde el
jugador que gane dos puntos consecutivos gana. Cuando un jugador gana el primer
punto del deuce, se dice que tiene un Advantage (ventaja) sobre su oponente. Si gana
el segundo punto, gana el juego. Si no, si su oponente lo gana, el juego vuelve a
Deuce.
Todos los eventos de tenis femenino y dobles mixtos tienen 3 sets. Los eventos de los
hombres tienen 3 sets o 5 sets. Con esta explicacin acerca del tenis, se va a resolver
el ejercicio.
La copa Grandmaster es un evento anual entre Estados Unidos y Rusia. Escriba un
programa en Java que mantenga el tablero de puntajes de los matches sencillos entre
los jugadores de los dos pases. El programa debe almacenar el tablero de puntajes al
final del juego. La clase PuntajeTablero tiene dos instancias de la clase Equipo. La
primera instancia tendr el puntaje de USA y la segunda, el de Rusia. La clase Equipo
tiene una subclase, MaestroDelTenis. La clase MaestroDelTenis tiene los
nombres de todos los jugadores en el equipo, el nmero de sets ganados por cada
jugador y el nmero de matches ganados por el jugador. La clase tambin tendr
mtodos para actualizar esta informacin. La clase Tenis actualiza al
PuntajeTablero y almacena el PuntajeTablero, al final del da de juego en un
archivo.
Recomendaciones tiles:
Escriba una clase Serializable llamada Equipo que tenga una subclase
Serializable llamada MaestroDelTenis.
Escriba una clase ScoreBoard que tenga el puntaje de ambos USA y Rusia a
travs de los dos objetos Team.
Los
contenidos
de
puntaje.txt
son
deserializados
ObjectInputStream e impresos en la salida estndar.
usando