Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la...

56
Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2

Transcript of Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la...

Page 1: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … -

Ingeniería de la Programación

Práctica 2

Page 2: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

2

Objetivos

Manejar excepciones en Java.

Utilizar clases que implementan colecciones de datos en memoria.

Programar la entrada/salida de datos por consola y fichero.

Page 3: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

3

Contenidos

Manejo de excepciones.

Bibliotecas de Java

Paquete java.lang (núcleo principal de java)

Paquete java.util (utilidades, colecciones)

Paquete java.io (Entrada / Salida)

Page 4: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

4

Manejo de excepciones Una excepción es una condición anormal que ocurre durante la

ejecución de un programa que interrumpe el flujo de ejecución normal.

Manejo de excepciones: método estructurado para capturar excepciones, es decir, para detectar y gestionar errores/situaciones anormales durante la ejecución de un programa.

Método donde ocurre una excepción/error

Método sin un manejador de excepción

Método con un manejador de excepción

main()

Llamada a método

Levanta una excepción

Transmite la excepción

Captura la excepción

Page 5: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

5

Manejo de excepciones

Las excepciones son objetos de Java descendientes de la clase Throwable.

Existe un conjunto de excepciones predefinidas (explicado después), pero los programadores pueden definir excepciones nuevas en sus métodos.

Con la palabra throw se lanza una excepción, es decir, se crea un objeto (con información asociada al tipo de excepción) que se devuelve al método que hizo la llamada.

Cuando un método puede devolver excepciones éstas se declaran en su cabecera utilizando:

throws TipoExcepción1, TipoExcepción2

Page 6: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

6

Manejo de excepciones

try {

llamada a método_m()

}

catch( Exception1 e) { ….. }

catch( Exception2 e) { ….. }

finally { ….. }

método_m() throws Exception1

{

throw new Exception1()

}

Bloque donde puede producirse una excepción

Manejadores

Bloque opcional

Page 7: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

7

Manejo de excepciones: Jerarquía parcial

Object

Throwable

Error Exception

RuntimeExceptionVirtualMachineError

OutOfMemoryError

StackOverflowError

AWTError

NullPointerException

ClassCastException

IOException

Page 8: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

8

Manejo de excepciones

Las excepciones que se lanzan o declaran explícitamente deben capturarse. Si no, el programa no compilará.

Las excepciones que no se capturan explícitamente pueden provocar que se detenga la ejecución del programa.

Existen dos categorías: Verificadas: el compilador obliga a su verificación.

Cualquier excepción definida por el programador y que se lanza explícitamente.

No Verificadas: el compilador no obliga a su verificación. Por ejemplo, Arithmetic Exception, NullPointerException, etc.

Page 9: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

9

Manejo de excepciones try{ ... }

Marca un bloque de código donde puede producirse una excepción. Si se lanza una excepción el control se transfiere a un bloque catch.

catch( Excepción e ){ ... } Bloque de código que captura la excepción del tipo “Excepción”. Pueden definirse varios bloques catch para tratar distintas excepciones. Se ejecuta el primer bloque cuyo argumento es compatible.

finally{ ... } SIEMPRE se ejecuta, se lance o no una excepción en el bloque try. Código de finalización o de limpieza.

throw ObjetoExcepción Lanza explícitamente una excepción.

throws listaExcepciones Indica que un método A, que es llamado por un método B, puede generar

alguna excepción de la lista, pero no la captura. Será capturada por el método por el cual es llamado (método B). Sólo deben indicarse las excepciones “verificadas”. El resto no es

necesario.

Page 10: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

10

class MiExcepcion extends Exception { int datoInformacion; // Constructor MiExcepcion( int datos ) { datoInformacion = datos; } // Sobreescribe el método getMessage() heredado de Throwable public String getMessage() { return( "La máxima es: Compra Barato, Vende Caro\n" +

"El valor de datoInformacion es: " + datoInformacion );

}}

Manejo de excepciones (Ejemplo1)

Page 11: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

11

class ejEx01 { public static void main( String args[] ) { try { for( int cnt=0; cnt < 5; cnt++ ) {

if( cnt == 3 ) throw new MiExcepcion( 3 ); System.out.println( "Procesando datos para cnt = :" + cnt );

} System.out.println("Esta línea no debe ejecutarse nunca." ); } catch( MiExcepcion e ) { System.out.println("Controlador de Excepciones. ” +

e.getMessage() ); System.out.println("Controlador de Excepciones. Ejecutando

return." ); return; } finally { System.out.println(”Se entra independientemente de la

sentencia return del Controlador de Excepciones." ); } System.out.println( "Esta sentencia nunca se ejecutará debido

a la sentencia return del controlador de excepciones." );

}}

Manejo de excepciones (Ejemplo1)

Page 12: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

12

Manejo de excepciones: uso de throws

class ejEx02 {

static void demoproc() throws NullPointerException {

// No sería necesario el throws

System.out.println( "Dentro de demoproc" );

throw new NullPointerException( "demo" );

}

public static void main( String args[] ) {

try {

demoproc();

}

catch( NullPointerException e ) {

System.out.println( “Capturo la excepción lanzada en demoproc: " + e );

}

}

}

Page 13: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

13

Manejo de excepciones: uso de throws

class ejEx03 { static void demoproc() throws MiExcepcion {

// SÍ que sería necesario el throws System.out.println( "Dentro de demoproc" ); throw new MiExcepcion( 1 ); } public static void main( String args[] ) { try { demoproc(); } catch( MiExcepcion e ) { System.out.println( “Capturo la excepción lanzada

en demoproc: " + e ); } }}

Page 14: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

14

La biblioteca de clases (paquetes)Plataforma Java 2 Standard Edition (J2SE)

java.lang Núcleo principal de Java.

java.util Utilidades de estructuras de datos.

java.io Entrada / Salida.

java.text Formato y adaptación a idiomas de texto, fechas y números.

java.math Operaciones aritméticas con enteros (BigInteger) y coma flotante (BigDecimal).

java.awt Componentes para el diseño de la interfaz de usuario y gestión de eventos.

javax.swing Nuevas componentes para el diseño de la interfaz de usuario (árbol, tabla, paneles, …).

Page 15: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

15

La biblioteca de clases (paquetes)Plataforma Java 2 Standard Edition (J2SE)

javax Extensiones al lenguaje Java.

java.applet Creación de applets.

java.beans Desarrollo de componentes JavaBeans.

javax.xml Procesado de documentos XML.

java.sqljavax.sql

Compatibilidad para el acceso a base de datos y procesamiento de datos mediante JDBC.

java.rmi Programación distribuida.

javax.net Desarrollo de aplicaciones en red.

java.security Soporte para seguridad criptográfica.

Page 16: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

16

Paquete java.lang

Este paquete contiene el núcleo principal de Java. Se importa automáticamente en los programas. Incluye entre otros elementos de utilidad:

Clases: java.lang.Object: es la clase raíz de la jerarquía de Java. Es la superclase

de cualquier clase. java.lang.Class: instancias de Class son las clases, interfaces, tipos

primitivos y arrays de un programa en tiempo de ejecución. java.lang.System: contiene atributos y métodos de clase útiles. java.lang.Math: contiene métodos para realizar operaciones matemáticas

básicas java.lang.String: instancias de String son cadenas de caracteres. Integer, Float, Double, …: clases que encapsulan tipos primitivos.

Interfaces: Cloneable, Runnable, Comparable, …

Excepciones: Throwable, Exception, ArithmeticException, ArrayIndexOutOfBoundsException,

NullPointerException, …

Page 17: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

17

java.lang.Object

Raíz de la jerarquía de clases Es la superclase de cualquier clase creada por el programador Define los siguientes métodos que son heredados por la clases derivadas

Object clone(): crea y devuelve una copia ‘superficial’ de un objeto. boolean equals(Object obj): indica si dos referencias apuntan al mismo

objeto. String toString(): devuelve una cadena con el nombre de la clase y el

código (hash) del objeto. Normalmente las clases derivadas redefinen este método para mostrar información acerca del objeto.

Class getClass(): devuelve la clase en tiempo de ejecución de un objeto. System.out.print(c.getClass.getName()) mostraría el nombre de la clase a la que pertenece c.

int hashCode(): devuelve el código hash de un objeto. Objetos “iguales” deben tener códigos iguales.

void finalize(): es el método invocado por el garbage collector de Java cuando el objeto ya no es accesible. Puede ser redefinido por el programador para liberar otros recursos (p.e. cerrar archivos).

Page 18: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

18

java.lang.Object (Ejemplo2)

package Figuras;

public class Circulo extends Figura implements Cloneable{ … public Object clone() throws CloneNotSupportedException{ return super.clone(); } public String toString(){ String s= "posx= " + x + " posy= " + y + " radio= " +radio; return s + " hash: " + this.hashCode(); } …}

Para clonar un objeto:

• Indicar que se implementa la interfaz Cloneable

• Redefinir método clone() llamando al método clone de la clase base

• Capturar la excepción CloneNotSupportedException

• El objeto devuelto se promociona al tipo esperado (cast)

Page 19: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

19

java.lang.Object (Ejemplo2_1.java)

import Figuras.Circulo;public class Ejemplo2_1 {public static void main(String[] args) { Circulo c1 = new Circulo(100,100,50); Circulo c2; try { c2 = (Circulo) c1.clone();

if (c1.equals(c2)) System.out.println("C1 = C2"); else System.out.println("C1 != C2");

System.out.println("C1: " + c1); System.out.println("C2: " + c2); } catch (CloneNotSupportedException e) { System.out.println("No se puede clonar este objeto.");}}}

C1 y C2 son distintos

El código hash es diferente

Sus atributos valen lo mismo: tanto tipos primitivos, como arrays o referencias.

System.out.println("C1: " + c1)

es equivalente a

System.out.println("C1: " + c1.toString())

Page 20: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

20

java.lang.Math

Métodos estáticos que implementan funciones matemáticas. double sin(double ), double cos(double ), double tan(double ),

double exp(double ), double log(double ), double pow(double ,

double ),

int max(int, int), float max(float, float ), double max(double,

double ),

int min(int, int), float min(float, float ), double min(double,

double ),

int abs(int ), float abs(float ), double abs(double ),

double random(), double sqrt(double ), int round(float ), long

round(double ).

Constantes:

PI, E

Page 21: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

21

La clase String se utiliza para representar cadenas de caracteres.

Son constantes, por lo que su valor no cambia una vez creadas."...", String(), String(String str), String(char [] str)

int length(): devuelve la longitud en caracteres de la cadena.

String trim(): Elimina blancos, tabuladores y caract. de control al final de la cadena

char charAt(int indice): devuelve el carácter en la posición indice.

String substring(int inicio, int fin): devuelve una subcadena entre las posiciones inicio y fin.

boolean equals(String str): s1.equals(s2) devuelve true si s1 y s2 guardan la misma cadena.

int compareTo(String str): s1.compareTo(s2) devuelve 0 si s1 y s2 guardan la misma cadena, un entero negativo si s1 < s2 y un entero positivo si s1 > s2.

int indexOf(int ch): devuelve la posición de la primera ocurrencia de ch.

String concat(String str): concatena dos cadenas.

String toLowerCase(): transforma los caracteres a minúsculas.

String toUpperCase(): transforma los caracteres a mayúsculas.

java.lang.String

Page 22: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

22

java.lang.String (Ejemplo2_2.java)

String s1 = "Hola mundo.";

String s3 = s1;

String s2 = new String("Hola mundo.");

if (s1==s3) System.out.println("El mismo objeto cadena!");

if (s1.equals(s2)) System.out.println("Cadenas Iguales!");

System.out.println("La longitud de s1 es: " + s1.length());

System.out.println("El carácter en la posición 3 es: " + s1.charAt(3));

System.out.println("El carácter 'a' está en la posición: " + s1.indexOf('a'));

s2= s2.concat(" Adiós"); // s2 <- “Hola mundo. Adiós”

String s4="Hola mundo".substring(2,4); //s4 <- ”la”

Page 23: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

23

La clase StringBuffer también guarda cadenas de caracteres.

Puede modificarse el contenido o la capacidad del objeto.StringBuffer(), StringBuffer(String str), StringBuffer(int long)

void setLength(int nuevaLong)

void setCharAt(int indice, char ch): sustituye el carácter en la posición indice por ch

void insert(int posicion, tipo dato): inserta la representación en cadena del dato a partir de la posición indicada.

int capacity(): capacidad máxima de la cadena.

void append(tipo dato): añade la representación en cadena del argumento al final.

String toString( ): devuelve un objeto String que guarda la misma cadena

java.lang.StringBuffer

StringBuffer sb1 = new StringBuffer(20);

int c=sb1.capacity(); // i <- 20

int l=sb1.length(); // l <- 0

sb1.append("Hoa a Todos"); // s1 <- "Hoa a Todos"l=sb1.length(); // l <- 11 sb1.insert(2,'l'); // s1 <- "Hola a Todos"

Page 24: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

24

Clases “envoltorio”

Las clases “envoltorio” encapsulan un tipo primitivo de datos. Boolean, Byte, Character, Double, Float, Integer, Long, Short.

Cada clase proporciona métodos que devuelven el tipo primitivo. char charValue() int intValue() float floatValue() ...

Proporcionan algunos métodos estándares clone(), toString(), compareTo()

Constantes de clase p.e. MAX_VALUE, MIN_VALUE, en Integer.

Métodos de clase Convertir de número a cadena:

String toString(int i), devuelve el objeto String que representa al entero i Convertir de cadena a número:

int parseInt(String s), devuelve el valor entero correspondiente a s Integer valueOf(String s), devuelve el objeto Integer correspondiente a s

Page 25: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

25

Ejemplo Clases “envoltorio” (Ejemplo2_2.java)

String s_ent = Integer.toString(1234);

String s_real = Double.toString(123.4);

String s5="123a";

String s6="123a";

try {

int i = Integer.parseInt("123");

double d = Double.parseDouble("123,4");// error de formato

}

catch (NumberFormatException e) {

System.out.println(“No es un valor numérico");

}

Page 26: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

26

java.lang.System

La clase System proporciona algunos atributos y métodos de clase útiles. No puede ser instanciada.

Atributos de clase. static InputStream in: entrada estándar static PrintStream out: salida estándar static PrintStream err: salida de error

Métodos de clase static long currentTimeMillis(): devuelve el tiempo en milisegundos

desde 1/1/1970 static void exit(int status): termina la ejecución del programa. static Properties getProperties(): obtiene las propiedades del

sistema (versión de JRE, classpath, sistema operativo, usuario, etc.) static void arraycopy(Object src, int srcPos, Object dest,

int destPos, int length): utilidad para copiar arrays. static void setIn(InputStream in): reasigna la entrada estándar. static void setOut(PrintStream out): reasigna la salida estándar. static void setErr(PrintStream err): reasigna la salida de error.

Page 27: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

27

Paquete java.util

Utilidades para arrays Colecciones de datos Modelo de eventos Fecha y hora Internacionalización Otras (tokenizadores, generador de números

aleatorios, …)

Page 28: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

28

Paquete java.util (Colecciones de datos)

java.util.Arrays Utilidades para manipulación de arrays: ordenación, búsqueda,

copia y comparación. java.util.ArrayList

Lista indexada redimensionable de objetos Implementa las interfaces List, Cloneable y Serializable No está sincronizada, el programador debe controlar la

ejecución concurrente de varios threads sobre la lista java.util.HashSet

Conjunto de objetos que no se pueden repetir Implementa las interfaces Set, Cloneable y Serializable Utiliza una tabla Hash. Coste de inserción, borrado y búsqueda

constante java.util.TreeSet

Conjunto implementado con una estructura de árbol. Coste de inserción, borrado y búsqueda logarítmico.

Implementa las interfaces Set, Cloneable y Serializable

Page 29: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

29

Paquete java.util

java.util.Vector: Lista indexada de objetos redimensionables. Implementa las interfaces List, Cloneable y Serializable. Está sincronizada.

java.util.Hashtable: Implementación de un mapa mediante tablas de

dispersión. Implementa Map, Clonable y Serializable Asocia claves con valores que pueden ser cualquier

objeto.

Interface java.util.Iterator: ofrece métodos para recorrer una colección de objetos.

Page 30: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

30

Clase java.util.ArrayList<E>

ArrayList(), ArrayList(int capacidad_inicial)

boolean add (Object obj), boolean add(int indice, E obj)

void clear()

Object clone(), Object[] toArray()

boolean contains(Object obj)

E get(int i)

int indexOf(Object e), int lastIndexOf(Object e)

boolean isEmpty(),

E remove(int index), boolean remove(Object obj)

E setElementAt(int index, E obj)

int size()

Iterator iterator()

Page 31: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

31

Clase java.util.Vector

Vector(), Vector(int capacidad), Vector(int capacidad, int incremento)

void addElement(Object obj)

boolean removeElement(Object obj)

void removeAllElements()

Object clone(), void copyInto(Object anArray [])

int capacity(), int size(), boolean isEmpty(), void setSize(int newSz)

boolean contains(Object obj)

int indexOf(Object e, int ind), int lastIndexOf(Object e, int ind)

Object elementAt(int index)

Object firstElement(), Object lastElement()

void setElementAt(Object obj, int index)

void removeElementAt(int index)

void insertElementAt(Object obj, int index)

Iterator iterator()

Page 32: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

32

Clase java.util.Hashtable

Hashtable(), Hashtable(int nElementos),

Hashtable(int nElementos, float factorCarga)

int size(), boolean isEmpty()

Enumeration keys(), Enumeration elements()

boolean contains(Object value),

boolean containsKey(Object key)

Object get(Object key)

void rehash()

Object put(Object key, Object value)

Object remove(Object key)

void clear()

Object clone()

String toString()

Page 33: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

33

Interface java.util.Iterator

Facilita el recorrido de las estructuras de datos. Ofrece dos métodos:

public boolean hasNext () public Object next ()

Lanza la excepción NoSuchElementException si no hay más elementos

public void remove() Borra el último elemento devuelto por next() de la colección Lanza la excepción UnsupportedOperationException si la

colección no soporta esta operación Lanza la excepción IllegalStateException si no se ha llamado

a next() o se llama dos veces seguidas a remove().

Los objetos de la enumeración sólo se pueden usar una vez. No se puede retroceder a elementos anteriores.

Page 34: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

34

Ejemplo colección ArrayList (Ejemplo2_3.java)

import java.util.ArrayList;import java.util.Iterator;

public class Ejemplo2_3 {public static void main(String[] arg){...

ArrayList v = new ArrayList();for (int i=0; i<10; i++) {

v.add(new Integer(i));}

// Lista los elementos del vector usando IteratorIterator it = v.iterator();while (it.hasNext ()) {

System.out.print(it.next() + ", ");}System.out.println(); // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,

// Lista los elementos del vector usando get(int index)for (int i=0; i<v.size(); i++) {

System.out.print(v.get(i) + ", ");}System.out.println(); // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,

// Imprime la representación del vector como cadenaSystem.out.print(v.toString()); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

...}}

Page 35: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

35

Entrada / Salida (Flujos de bytes)

Las clases para manejar la E/S derivan de las clases

abstractas InputStream y OutputStream.

Flujos de bytes (byte streams): secuencias de bytes que

se escriben (leen) en (desde) dispositivos externos.

En caso de error en la E/S, los métodos generan la excepción

IOExcepcion. El programador debe escribir el código

necesario para capturarla. P. e. si la fuente de datos no está disponible: el fichero no

existe, o no tiene permisos de escritura, etc.

FileInputStream y FileOutputStream permiten la lectura y

escritura de bytes en ficheros, respectivamente.

Page 36: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

36

Ejemplo flujo de bytes (Ejemplo3, CopiarBytes.java)

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

public class CopiarBytes {

public static void main(String[] args) throws IOException{

FileInputStream entrada=null;

FileOutputStream salida=null;

try {

entrada= new FileInputStream("entrada.txt");

salida= new FileOutputStream("salida.txt");

int c;

while ((c=entrada.read())!=-1){

salida.write(c);

}

} catch(IOException e) {

System.out.println(e.getMessage());

} finally{

if (entrada!=null){ entrada.close(); }

if (salida!=null){ salida.close(); }

}

}

}

close() en el bloque finally garantiza que se cierra el stream

read() devuelve -1 cuando alcanza el final del stream

Page 37: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

37

Flujos de caracteres

Las clases que manejan flujos de caracteres transforman los bytes en caracteres según el juego de caracteres especificado.

InputStreamReader y OutputStreamWriter son de propósito general.

FileReader y FileWriter son orientadas a fichero y transforman bytes en caracteres según el juego de caracteres local.

InputStreamReader y OutputStreamWriter permiten especificar el juego de caracteres. Se definen sobre un flujo de bytes.

InputStreamReader in = new InputStreamReader (new FileInputStream (“fichero”));

Page 38: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

38

Ejemplo flujos de caracteres (Ejemplo3, CopiarCaracteres.java)

import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;

public class CopiarCaracteres {

public static void main(String[] args) throws IOException{

FileReader entrada=null;

FileWriter salida=null;

try {

entrada= new FileReader("entrada.txt");

salida= new FileWriter("salida_car.txt");

int c;

while ((c=entrada.read())!=-1){

salida.write(c);

}

} catch(IOException e) {

System.out.println(e.getMessage());

} finally{

if (entrada!=null){ entrada.close(); }

if (salida!=null){ salida.close(); }

}

}}

La variable entera c guarda un carácter (16 bits)

Page 39: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

39

E/S orientada a líneas

Las clases BufferedReader y PrintWriter están diseñadas para leer y escribir líneas de texto, respectivamente.

Independientes del terminador de línea (“\r”, “\n”, “\r\n”) Se definen sobre un flujo de caracteres (FileReader, FileWriter).

Page 40: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

40

Ejemplo E/S orientada a líneas (Ejemplo3, CopiarLineas.java)

import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;import java.io.BufferedReader;

public class CopiarLineas {

public static void main(String[] args) throws IOException{

BufferedReader entrada=null;

PrintWriter salida=null;

try {

entrada= new BufferedReader(new FileReader("entrada.txt"));

salida= new PrintWriter(new FileWriter("salida_lin.txt"));

String l;

while ((l=entrada.readLine())!=null){

salida.println(l);

}

} catch(IOException e) {

System.out.println(e.getMessage());

} finally{

if (entrada!=null){ entrada.close(); }

if (salida!=null){ salida.close(); }

}

}

}

readLine() lee una línea.null indica el final del fichero println() escribe una línea añadiendo el terminador de línea.

Page 41: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

41

E/S por consola

System.in : Objeto de la clase InputStream. Representa el flujo de entrada estándar (teclado). System.in.read(): lee el siguiente byte.

System.out: Objeto de la clase PrintStream. Representa el flujo de salida estándar (pantalla). System.out.print() y System.out.println(): métodos sobrecargados

para escribir caracteres.

System.err: Objeto de la clase PrintStream. Representa el flujo de salida de error. System.err.print() y System.err.println().

Page 42: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

42

Ejemplos E/S estándar (Ejemplo3, LeerCadena.java)

Leer una cadena de la entrada estándar

import java.io.BufferedReader;import java.io.InputStreamReader;

public class LeerCadena {public static void main(String[] args) {

BufferedReader in= new BufferedReader(new InputStreamReader(System.in));String s="";System.out.println("Escriba su nombre: ");try{

s=in.readLine();}catch(Exception E){ s = ""; } System.out.println("Su nombre es: " + s);

}}

Page 43: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

43

Ejemplos E/S estándar (Ejemplo3, LeerEntero.java)

Leer un entero de la entrada estándar

import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.IOException;

public class LeerEntero {public static void main(String[] args) {

BufferedReader in= new BufferedReader(new InputStreamReader(System.in));String s="";int edad=0;System.out.println("Escriba su edad: ");try{

edad=Integer.parseInt(in.readLine().trim());} catch(NumberFormatException e){

System.out.println("No es un entero."); }

catch (IOException e){System.out.println("Error.");

}System.out.println("Su edad es: " + edad);

}}

Page 44: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

44

Clase java.util.Scanner

Divide la cadena de entrada en tokens separados por un delimitador(espacio en blanco por defecto). El token resultante puede convertirse a un tipo básico utilizando el correspondiente método next.

Un objeto de la clase Scanner se construye sobre un flujo de caracteres, un fichero (File) o sobre la entrada estándar (System.in).

public void Scanner(File source); public void Scanner(InputStream source): construye un objeto Scanner.

public bool hasNext(): devuelve cierto si quedan tokens en la cadena. hasNextDouble(), hasNextInt(), …: devuelven true si el siguiente

token es del tipo esperado. public String next(): devuelve el siguiente token (String) public double nextDouble(), public int nextInt(), …: devuelven

el siguiente token convertido al tipo indicado. public void useDelimiter(String s): modifica mediante una exp.

regular el conjunto de delimitadores. public void useLocale(Locale l): modifica el formato numérico local.

Page 45: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

45

Clase java.util.Scanner (Ejemplo 3, EscanearTeclado.java)

import java.util.InputMismatchException;

import java.util.Scanner;

public class EscaneaTeclado {

public static void main(String[] args) {

Scanner s=null;

try{

s=new Scanner(System.in);

System.out.println("Introduce nombre:");

String nombre = s.nextLine();

System.out.println("Introduce edad:");

int edad= s.nextInt();

System.out.println("Nombre:" + nombre);

System.out.println("Edad:" + edad);

}

catch (InputMismatchException e){

System.out.println("Dato incorrecto");

}

}

}

Page 46: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

46

Formatear la salida

Método format() de PrintWriter (flujo de caracteres) y PrintStream (flujo de bytes).

Una cadena con especificadores de formato y la lista de argumentos.

System.out.format(“La raíz cuadrada de %d es %f. %n”, n, r);

Algunos tipos de especificadores de formato: %d entero %f reales %s cadenas %n terminador de línea (independiente de la plataforma)

Page 47: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

47

Formatear la salida

Elementos opcionales (de izq. a dcha.) Índice del argumento con el que empareja el especificador de

formato. Flags:

+: número con signo Carácter de relleno -: alinea a la derecha ,: formato de número con separadores decimales locales.

Anchura mínima, por defecto se alinea a la izquierda. Precisión: para reales es la precisión matemática, para cadenas

es la anchura máxima. Se trunca por la derecha.

Ejemplo: System.out.format (“%f, %1$+020.10f”, Math.PI) Salida: 3,141593, +0000000003,1415926536

Page 48: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

48

Flujos de objetos: “Serialización”

Permite hacer los objetos persistentes, es decir, almacenar objetos en archivos, para poder recuperarlos en otro momento.

Para “serializar” una clase, ésta debe implementar la interfaz Serializable (java.io).

ObjectOutputStream es el flujo de objetos de salida que se definen sobre FileOutputStream.

ObjectOutputStream(FileOutputStream fich);

writeObject(Object obj);

ObjectInputStream es el flujo de objetos de entrada que se define sobre FileInputStream.

ObjectInputStream(FileInputStream fich);

Object readObject();

La lectura de los objetos desde el archivo debe realizarse en el mismo orden en que se han escrito .

Page 49: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

49

Ejemplo de “Serialización” (Ejemplo 3, Serializacion.java)

import java.util.ArrayList;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import Figuras.Circulo;

public class Serializacion {static ArrayList v;static void GuardarVector(){ try { ObjectOutputStream objout =

new ObjectOutputStream ( new FileOutputStream("prueba.dat"));objout.writeObject(v);objout.close();System.out.println("Archivo guardado.");

} catch (IOException e) { System.out.println("Error guardando archivo: "); }}

Page 50: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

50

Ejemplo de “Serialización” (Ejemplo 3, Serializacion.java)

static void LeerVector(){ try { ObjectInputStream objin =

New ObjectInputStream (new FileInputStream("prueba.dat")); v= (ArrayList) objin.readObject(); objin.close(); System.out.println("Archivo leído.");}

catch (ClassNotFoundException e) { System.out.println("Error!"); } catch (IOException ex) { System.out.println("Error abriendo archivo: "); }

}

Page 51: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

51

Ejemplo de “Serialización” (Ejemplo 3, Serializacion.java)

public static void main(String[] args) { v = new ArrayList(); // ArrayList ya implementa Serializable

for (int i=0;i<10;i++){Circulo c = new Circulo(1,1,i); v.add(c);

}GuardarVector();v.clear(); //borra los elementos del arrayLeerVector();for (int i=0;i<v.size();i++){

((Circulo) v.get(i)).dibujar();}

}}

public class Circulo extends Figura implements Serializable{

Los objetos del Array (Circulo) deben definirse como “serializables”

Page 52: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

52

Ejercicio: Servicio de Mantenimiento

Cree un proyecto nuevo llamado “GestionActivos” Cree el paquete “dominio” que contendrá las clases

del dominio y la lógica de la aplicación. Clase Maquina (fichero Maquina.java)

con los atributos: número (int), marca, modelo, numSerie, observaciones (String),

con un constructor que inicialice los atributos Menú contextual de eclipse: source -> Generate Constructor

using fields Métodos set y get para cada atributo

Menú contextual de eclipse: source -> Generate getters and setters

Redefina el método toString() para que devuelva en una cadena los valores de los atributos de una instancia.

Page 53: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

53

Ejercicio Servicio de Mantenimiento

Clase GestionMaquinas (fichero GestionMaquinas.java) Clase que maneja la lista de avisos de incidencias, que será un

atributo privado de tipo ArrayList. Con getter y setter para su atributo lista. Con los métodos:

void addMaquina(Maquina m) throws MaquinaYaExiste: añade una nueva Máquina a la lista. En caso de que exista ya una máquina con el mismo número, no la añade y lanza la excepción MaquinaYaExiste.

Maquina getMaquinaPorNumero(int num): devuelve la Máquina de la lista cuyo número sea num.

void borraMaquinaPorNumero(int num): borra la Máquina de la lista cuyo número sea num.

void guardaListaMaquinas(String fichero): serializa los objetos de la lista en un fichero.

void cargaListaMaquinas(String fichero): carga en memoria la lista de avisos guardada previamente en un fichero.

Recuerde indicar en la declaración de Maquina que implementa la interfaz Serializable

Page 54: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

54

Ejercicio Servicio de Mantenimiento

Cree el paquete "excepciones" e incluya las excepciones que considere necesarias, p.e.

Clase MaquinaYaExiste (fichero MaquinaYaExiste.java)

Clase que extiende Exception Con constructor vacío. Redefinir el método String getMessage()para que

devuelva el mensaje asociado a la excepción.

Page 55: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

55

Ejercicio Servicio de Mantenimiento

Cree el paquete "interfaz" que incluirá las clases relacionadas con la interfaz de la aplicación con el usuario.

Clase Menu (archivo Menu.java) Con los atributos:

Titulo del menú (string) Lista de opciones de menú (ArrayList)

Con constructor que inicialice los atributos. Con los métodos:

public void escribirMenu(): visualiza por consola el menú de la aplicación.

public int getOption(): devuelve la opción introducida por teclado.

Page 56: Introducción a Java (2ª parte) - excepciones, colecciones, i/o, … - Ingeniería de la Programación Práctica 2.

56

Ejercicio Servicio de Mantenimiento Las opciones del menú serán las siguientes:

1.- Introducir Máquina

2.- Listar Máquinas

3.- Recuperar Máquina por número

4.- Borrar Máquina por número

5.- Guardar Archivo de Incidencias

6.- Cargar Archivo de Incidencias

0.- Salir

Clase PrincipalConsola (archivo PrincipalConsola.java) Inicializa el menú de la aplicación y lo muestra en pantalla.

Pide al usuario los datos necesarios para cada una de las opciones del menú e invoca al método de la clase GestionMaquinas que implementa la funcionalidad requerida.

Realiza las validaciones sintácticas necesarias sobre los datos (datos tipo int o date) y en caso de error informa al usuario.