Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Tema 1. Introduccin al anlisis y diseo de programas Tema 2. Clases y objetos Tema 3. Herencia y Polimorfismo Tema 4. Tratamiento de errores Tema 5. Aspectos avanzados de los tipos de datos Tema 6. Modularidad y abstraccin: aspectos avanzados Tema 7. Entrada/salida con ficheros Tema 8. Verificacin y prueba de programas
Prcticas de Programacin
Prcticas de Programacin
7.1 Ficheros
Fichero: secuencia de bytes en un dispositivo de almacenamiento: disco duro, CD, DVD, memoria USB, ... se puede leer y/o escribir se identifica mediante un nombre (pathname) - /home/pepe/documentos/un_fichero Tipos de ficheros: programas: contienen instrucciones datos: contienen informacin, como nmeros (enteros o reales), secuencias de caracteres, ... en algunos sistemas operativos (como Linux) tambin son ficheros los directorios, los dispositivos, las tuberas, ...
M. Aldea y M. Gonzlez 18/05/10
Prcticas de Programacin
Para entender los contenidos de un fichero es necesario conocer de antemano el tipo de datos que contiene
Prcticas de Programacin M. Aldea y M. Gonzlez 18/05/10
Ejemplo:
lectura de un int (4 bytes) lectura de un short (2 bytes)
puntero de lectura
Prcticas de Programacin
puntero de lectura
puntero de lectura 5
Prcticas de Programacin
bytes
FileOutputStream
Fichero Fichero
FileInputStream
Objeto
ObjectInputStream
bytes
De Texto: String
FileWriter
Fichero caracteres
PrintWriter
String
BufferedReader
Prcticas de Programacin
Fichero
FileReader
M. Aldea y M. Gonzlez 18/05/10
FileOutputStream
Prcticas de Programacin
ObjectOutputStream
FileInputStream
M. Aldea y M. Gonzlez 18/05/10
ObjectInputStream 9
FileWriter
Prcticas de Programacin
PrintWriter
FileReader
M. Aldea y M. Gonzlez 18/05/10
BufferedReader 10
11
bytes
FileOutputStream
Fichero
Prcticas de Programacin
12
Clase FileOutputStream
Operaciones ms habituales:
Descripcin Declaracin
FileOutputStream(String s) Constructor. Requiere el nombre del throws FileNotFoundException fichero. Lo crea si no existe. Si existe se borran sus contenidos. Lanza FileNotFoundException si el fichero no se puede crear FileOutputStream(String s, Igual que el anterior, salvo en que boolean aade) cuando aade es true no se borran los throws FileNotFoundException contenidos, sino que los datos se aaden al final del fichero
Sincronizar Cerrar
Prcticas de Programacin
13
Clase ObjectOutputStream
Operaciones ms habituales:
Descripcin
Constructor. Requiere un OutputStream Escribir un booleano Escribir un double Escribir un int Escribir un objeto Se escriben tambin los objetos a los que el objeto obj se refiere (y as recursivamente) Sincronizar (llama a out.flush()) Cerrar (llama a out.close())
Declaracin
ObjectOutputStream( OutputStream out) void writeBoolean(boolean b) void writeDouble(double d) void writeInt(int i) void writeObject(Object obj)
Todos los mtodos (incluido el constructor) lanzan IOException error al acceder al OutputStream (normalmente un fichero)
Prcticas de Programacin M. Aldea y M. Gonzlez 18/05/10
14
Prcticas de Programacin
15
Tema 7. Entrada/salida con ficheros 7.3 Salida binaria Ejemplo de escritura de objeto (cont.)
El mtodo a aadir a la clase Agenda es: public void salvaAFichero(String nomFich) throws IOException { ObjectOutputStream sal = null; try { // abre los streams iniciador y filtro sal = new ObjectOutputStream( new FileOutputStream(nomFich)); // graba el objeto actual sal.writeObject(this); } finally { if (sal != null) { sal.close(); // cierra los streams } } }
Prcticas de Programacin M. Aldea y M. Gonzlez 18/05/10
16
bytes
FileInputStream
Fichero
Prcticas de Programacin
17
Clase FileInputStream
Operaciones ms habituales:
Descripcin
Constructor. Requiere el nombre del fichero. Si el fichero no existe lanza FileNotFoundException
Declaracin
FileInputStream(String s) throws FileNotFoundException
Prcticas de Programacin
18
Clase ObjectInputStream
Descripcin
Constructor. Requiere un InputStream
Declaracin
ObjectInputStream( InputStream in) Leer un booleano boolean readBoolean() Leer un double double readDouble() Leer un int int readInt() Leer un objeto (o un string). Al leer un objeto Object readObject()
se leen tambin los objetos a los que ste se refiere Cerrar
void close()
Los mtodos lanzan las excepciones: - IOException: problema al acceder al InputStream - EOFException: alcanzado el fin de fichero - ClassNotFoundException: slo producida por readObject
Prcticas de Programacin M. Aldea y M. Gonzlez 18/05/10
19
20
Fichero caracteres
PrintWriter
Prcticas de Programacin
21
Clase FileWriter
Operaciones ms habituales:
Descripcin Declaracin
FileWriter(String s) Constructor. Requiere el nombre del throws IOException, fichero. Lo crea si no existe. Si existe se FileNotFoundException borran sus contenidos. Lanza FileNotFoundException si el fichero no se puede crear FileWriter(String s, Igual que el anterior, salvo en que boolean aade) cuando aade es true no se borran los throws IOException, contenidos, sino que los datos se aaFileNotFoundException den al final del fichero
Prcticas de Programacin
22
Clase PrintWriter
Operaciones ms habituales:
Descripcin
Constructor. Requiere un Writer
Declaracin
PrintWriter(Writer writer)
Constructor. Crea el FileWriter interna- PrintWriter(String nomFich) mente Escribir un string Escribir un string con retorno de lnea Escribe los argumentos con el formato deseado Sincronizar Cerrar
void print(String str) void println(String str) printf(String formato, Object... args)
Los mtodos no lanzan IOException: - para saber si ha habido un error hay que llamar a checkError
Prcticas de Programacin M. Aldea y M. Gonzlez 18/05/10
23
24
Tema 7. Entrada/salida con ficheros 7.5 Salida de texto Ejemplo: escritura fichero de texto (cont.)
Fichero generado:
Prcticas de Programacin
25
String
BufferedReader
caracteres
FileReader
Fichero
En muchos casos ser ms prctico utilizar la clase Scanner en lugar de BufferedReader lo veremos en "Lectura con la clase Scanner" en la pgina 40
Prcticas de Programacin M. Aldea y M. Gonzlez 18/05/10
26
Clase FileReader
Operaciones habituales:
Descripcin
Constructor. Requiere el nombre del fichero. Si no existe lanza FileNotFoundException
Declaracin
FileReader(String s) throws FileNotFoundException
Prcticas de Programacin
27
Clase BufferedReader
Operaciones habituales
Descripcin
Constructor. Requiere un Reader Leer un string. Retorna null si se ha llegado al final Lanza IOException si se produce un error al acceder al Reader
Declaracin
BufferedReader(Reader reader) String readLine() throws IOException
Cerrar. Lanza IOException si se pro- void close() throws IOException duce un error al acceder al Reader
La lectura se realiza lnea a lnea con readLine() luego cada lnea se procesa (con split(), indexOf(), ...) y los trozos se convierten a otros datos con las operaciones parseInt(), parseDouble(), ... existe una forma alternativa de procesado: clase Scanner
Prcticas de Programacin M. Aldea y M. Gonzlez 18/05/10
28
Prcticas de Programacin
29
Tema 7. Entrada/salida con ficheros 7.6 Entrada de texto Ejemplo de lectura de fichero de texto (cont.)
public static void main(String[] args) throws IOException { String str, num; double x; BufferedReader ent = null; try { ent = new BufferedReader( new FileReader("d2.txt")); do { str=ent.readLine(); // lee una lnea // si hay ms lneas seguimos procesando if (str!=null) { // escribe la lnea de texto System.out.println("Texto: "+str);
Prcticas de Programacin M. Aldea y M. Gonzlez 18/05/10
30
Tema 7. Entrada/salida con ficheros 7.6 Entrada de texto Ejemplo de lectura de fichero de texto (cont.)
// lee lnea y la convierte a nmero num=ent.readLine(); try { x=Double.parseDouble(num); System.out.println("Numero:"+x); } catch (NumberFormatException e) { System.out.println ("Error al "+ "leer el numero real: "+num); } // try } // if } while (str!=null); } finally { if (ent!=null) { ent.close(); } } // try } // main } // clase
Prcticas de Programacin M. Aldea y M. Gonzlez 18/05/10
31
Tema 7. Entrada/salida con ficheros 7.6 Entrada de texto Ejemplo de lectura de fichero de texto (cont.)
El programa muestra lo siguiente en la pantalla: Texto: primero Numero: 1.0 Texto: segundo Numero: 3.0 Texto: tercero Numero: 4.5 Texto: cuarto Numero: 8.0 Texto: quinto Error al leer el nmero real: 34R.5 Texto: sexto Numero: 1.0
Prcticas de Programacin
32
Ejemplo System.out.printf ("%s de %3d aos", nombre, edad); Produce la salida (suponiendo nombre="Pedro", edad=18) Pedro de 18 aos
Prcticas de Programacin M. Aldea y M. Gonzlez 18/05/10
33
String de formato
Contiene caracteres que se muestran tal cual y especificaciones de formato que se sustituyen por los sucesivos parmetros Especificaciones de formato ms habituales: %d enteros %c caracteres %s string %f float y double, coma fija %e float y double, notacin exponencial %g float y double, exponencial o coma fija %n salto de lnea en el formato del sist. operat. %% el carcter %
Prcticas de Programacin
34
Tema 7. Entrada/salida con ficheros 7.7 Entrada/Salida de texto con formato String de formato (cont.)
Puede lanzarse IllegalFormatException si el formato no corresponde al parmetro Despus del carcter % se puede poner un carcter de opciones: alinear a la izquierda 0 rellenar con ceros (nmeros slo) + poner signo siempre (nmeros slo)
Para forzar la utilizacin del punto como separador de las cifras decimales: import java.util.Locale; ... Locale.setDefault(Locale.ENGLISH); ... // usa printf
Prcticas de Programacin M. Aldea y M. Gonzlez 18/05/10
35
Salida
Prcticas de Programacin
36
... +Alumno(nombre: String, dni: String, nota: double) +nombre: String +dni: String +nota: double +generaListado (nomFich: String): void
Prcticas de Programacin
37
Tema 7. Entrada/salida con ficheros 7.7 Entrada/Salida de texto con formato Ejemplo de uso de printf (cont.)
public void generaListado(String nomFich) throws IOException { PrintWriter out = null; try { // abre el fichero de texto out = new PrintWriter(new FileWriter(nomFich)); // escribe el listado alumno por alumno for(Alumno a: listaAlumnos) { // nombre con 25 carac. justificado a la izq. // nota con 4 carac. totales con un decimal out.printf("%-25s DNI:%s Nota:%4.1f%n", a.nombre(),a.dni(), a.nota()); } } finally { if (out!=null) out.close(); } }
Prcticas de Programacin M. Aldea y M. Gonzlez 18/05/10
38
Tema 7. Entrada/salida con ficheros 7.7 Entrada/Salida de texto con formato Ejemplo de uso de printf (cont.)
Fichero de texto generado: Pepe Garca Hernndez Lolo Hernndez Garca Manu Lpez Gmez Pepito Gmez Lpez DNI:123456789 DNI:234567890 DNI:345678901 DNI:456789012 Nota: 5.0 Nota: 0.0 Nota:10.0 Nota: 7.5
Prcticas de Programacin
39
Prcticas de Programacin
40
Scanner
InputStream
Fichero binario
Dato
caracteres
Scanner
FileReader
Fichero de texto
Dato
Scanner
String
Scanner se comporta como un stream filtro de caracteres aunque tcnicamente no lo es, ya que no extiende a Reader
M. Aldea y M. Gonzlez 18/05/10
Prcticas de Programacin
41
Declaracin
Scanner(Readable source)
Scanner useLocale( Configura el formato de los nmeros. Locale locale) Usar Locale.ENGLISH para leer nmeros que utilicen el carcter . como punto decimal
Prcticas de Programacin
42
Tema 7. Entrada/salida con ficheros 7.7 Entrada/Salida de texto con formato Principales operaciones de la clase Scanner (cont.)
Descripcin
Leer una lnea Indica si quedan ms lneas por leer Leer un booleano Indica si es posible leer una palabra que se interprete como un booleano Leer una palabra Leer un double Indica si es posible leer una palabra que se interprete como un double Leer un int Indica si es posible leer una palabra que se interprete como int Cambia el delimitador que separa los tems
Prcticas de Programacin
Declaracin
String nextLine() boolean hasNextLine() boolean nextBoolean() boolean hasNextBoolean() String next()
43
Tema 7. Entrada/salida con ficheros 7.7 Entrada/Salida de texto con formato Principales operaciones de la clase Scanner (cont.)
Excepciones que pueden lanzar NoSuchElementException: no quedan ms palabras IllegalStateException: el scanner est cerrado InputMismatchException: el dato ledo no es del tipo esperado
Prcticas de Programacin
44
45
Tema 7. Entrada/salida con ficheros 7.7 Entrada/Salida de texto con formato Ejemplo de procesado de fichero de texto con la clase Scanner (cont.)
// lee nmeros while (in.hasNextDouble()) { // lee un double double d = in.nextDouble(); System.out.println("Nmero:"+d); } } // while (in.hasNext()) } catch (FileNotFoundException e) { System.out.println("Error abriendo el fichero " +nomFich); } finally { if (in!=null){ in.close(); } } // try } // main
Prcticas de Programacin M. Aldea y M. Gonzlez 18/05/10
46
Tema 7. Entrada/salida con ficheros 7.7 Entrada/Salida de texto con formato Ejemplo de procesado de fichero de texto con la clase Scanner (cont.)
Para el fichero: azul 1.0 3.5 7.7 rojo 2 verde 10.0 11.1 La salida producida ser: Palabra:azul Nmero:1.0 Nmero:3.5 Nmero:7.7 Palabra:rojo Nmero:2.0 Palabra:verde Nmero:10.0 Nmero:11.1
Prcticas de Programacin
47
Prcticas de Programacin
48
Prcticas de Programacin
49
Prcticas de Programacin
50
Principales operaciones
Descripcin Declaracin
RandomAccessFile Constructor. El String fich (String fich, String modo) indica el nombre del fichero. El throws FileNotFoundException String modo ser "r" para leer y "rw" para leer y escribir
Retorna el tamao actual en bytes del fichero Cambia el tamao del fichero al indicado, en bytes
Pone el puntero de lectura/escri- void seek(long pos) throws IOException tura a pos Retorna el puntero de lectura/ escritura
long getFilePointer() throws IOException
Prcticas de Programacin
51
Principales operaciones
Descripcin
Intenta leer un array de bytes. Retorna el nmero de bytes ledos, o -1 si no quedan ms
Declaracin
int read(byte[] b) throws IOException
void readFully(byte[] b) Lee repetidamente hasta rellenar el throws IOException array de bytes completo. Lanza EOFException si se acaba el fichero y no se ha podido leer todo
Lee un double. Lanza EOFException si se acaba el fichero Lee un int Lanza EOFException si se acaba el fichero Lee bytes convirtindolos a caracteres hasta encontrar un final de lnea
double readDouble() throws IOException int readInt() throws IOException String readLine() throws IOException
Prcticas de Programacin
52
Principales operaciones
Descripcin
Escribe un array de bytes Escribe un double Escribe un int Escribe los caracteres de un string convirtindolos primero a bytes (slo vale para caracteres de 8 bits) Cerrar el fichero
Declaracin
void write(byte[] b) throws IOException void writeDouble(double d) throws IOException void writeInt(int i) throws IOException void writeBytes(String s) throws IOException void close() throws IOException
Prcticas de Programacin
53
54
Tema 7. Entrada/salida con ficheros 7.8 Uso de ficheros como tablas Ejemplo: Tabla de datos persistente (cont.)
/** * Constructor al que se le pasan los datos del * libro */ public Libro(String titulo, int publicado, double precio) { // asegurarse de que el titulo no supera // maxCaracteresTtulo if (titulo.length()>maxCaracteresTtulo) { this.titulo= titulo.substring(0,maxCaracteresTtulo); } else { this.titulo=titulo; } this.publicado=publicado; this.precio=precio; }
M. Aldea y M. Gonzlez 18/05/10
Prcticas de Programacin
55
Tema 7. Entrada/salida con ficheros 7.8 Uso de ficheros como tablas Ejemplo: Tabla de datos persistente (cont.)
/** * Lee de fichero */ public static Libro leeDeFichero( RandomAccessFile fich) throws IOException { // lee los tres datos, por orden int publi=fich.readInt(); double prec=fich.readDouble(); String tit=fich.readLine().trim(); // crea y retorna el libro return new Libro(tit,publi,prec); }
Prcticas de Programacin
56
Tema 7. Entrada/salida con ficheros 7.8 Uso de ficheros como tablas Ejemplo: Tabla de datos persistente (cont.)
/** * Escribe en el fichero */ public void escribeEnFichero( RandomAccessFile fich) throws IOException { // escribe los tres datos, por orden fich.writeInt(publicado); fich.writeDouble(precio); fich.writeBytes(titulo+'\n'); } mtodos observadores, toString, ... } // clase Libro
Prcticas de Programacin
57
Tema 7. Entrada/salida con ficheros 7.8 Uso de ficheros como tablas Ejemplo: Tabla de datos persistente (cont.)
import java.io.*; import fundamentos.*; /** * Tabla de libros persistente almacenada en * un fichero de acceso aleatorio */ public class TablaLibros { // atributos privados private RandomAccessFile fich; /** * Constructor al que se le pasa el nombre * del fichero */ public TablaLibros(String nombreFichero) throws FileNotFoundException { fich = new RandomAccessFile(nombreFichero,"rw"); }
Prcticas de Programacin M. Aldea y M. Gonzlez 18/05/10
58
Tema 7. Entrada/salida con ficheros 7.8 Uso de ficheros como tablas Ejemplo: Tabla de datos persistente (cont.)
/** * Obtener el elemento de la tabla que esta en * "ndice" */ public Libro obten(int ndice) throws IOException { // posiciona el contador de lectura/escritura long pos=indice*Libro.tamaoEnBytes; fich.seek(pos); // lee y retorna el libro return Libro.leeDeFichero(fich); }
Prcticas de Programacin
59
Tema 7. Entrada/salida con ficheros 7.8 Uso de ficheros como tablas Ejemplo: Tabla de datos persistente (cont.)
/** Escribir un libro en la posicin "ndice" * de la tabla */ public void almacena(int ndice, Libro l) throws IOException { // posiciona el contador de lectura/escritura long pos=indice*Libro.tamaoEnBytes; fich.seek(pos); // escribe el libro l.escribeEnFichero(fich); } /** Cerrar la tabla */ public void cerrar() throws IOException { fich.close(); } } // clase TablaLibros
Prcticas de Programacin M. Aldea y M. Gonzlez 18/05/10
60
Tema 7. Entrada/salida con ficheros 7.8 Uso de ficheros como tablas Ejemplo: Tabla de datos persistente (cont.)
// ejemplo de uso de TablaLibros TablaLibros t = null; try { t = new TablaLibros("random.dat"); Libro libro1 = new Libro("Java", 2006, 15.0); Libro libro2 = new Libro("1984", 1949, 25.0); t.almacena(0,libro1); t.almacena(1,libro2); Libro l1= t.obten(0); Libro l2= t.obten(1); } finally { if (t != null) { t.cerrar(); } }
Prcticas de Programacin M. Aldea y M. Gonzlez 18/05/10
61
Prcticas de Programacin
62
Ejemplo de serializacin
// serializa un libro y le escribe en un fichero RandomAccessFile fich = null; try { // abre el fichero de acceso aleatorio fich = new RandomAccessFile (nomFich, "rw"); // pone el puntero al principio fich.seek(0L); // serializa el libro convirtindolo a una // secuencia de bytes ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(bos); out.writeObject(libro); out.close();
Prcticas de Programacin M. Aldea y M. Gonzlez 18/05/10
63
Tema 7. Entrada/salida con ficheros 7.8 Uso de ficheros como tablas Ejemplo de serializacin (cont.)
// obtiene los bytes del libro serializado byte[] buf = bos.toByteArray(); // escribe los bytes en el fichero fich.write(buf); } finally { if (fich!=null) { fich.close(); } }
Prcticas de Programacin
64
Ejemplo de deserializacin
// recupera del fichero un libro serializado RandomAccessFile fich = null; try { // abre el fichero de acceso aleatorio fich = new RandomAccessFile (nomFich, "r"); // pone el puntero al principio fich.seek(0L); // Lee un array de bytes del fichero byte[] bytes = new byte[(int) fich.length()]; fich.readFully(bytes);
Prcticas de Programacin
65
Tema 7. Entrada/salida con ficheros 7.8 Uso de ficheros como tablas Ejemplo de serializacin (cont.)
// Deserializa el array de bytes ObjectInputStream in = new ObjectInputStream( new ByteArrayInputStream(bytes)); libro=(Libro) in.readObject(); in.close(); } finally { if (fich!=null) { fich.close(); } }
Prcticas de Programacin
66
7.9 Resumen
Tipos de acceso a ficheros: lectura de ficheros binarios escritura de ficheros binarios lectura de ficheros de texto lnea a lnea escritura de ficheros de texto lectura de ficheros de texto palabra a palabra (clase Scanner) lectura de ficheros binarios de acceso aleatorio escritura de ficheros binario de acceso aleatorio
Prcticas de Programacin
67
Ficheros Binarios
Escritura
Objeto bytes
ObjectOutputStream FileOutputStream
Fichero
bytes
Fichero
FileInputStream
Prcticas de Programacin
68
Ficheros de texto
Escritura
String
PrintWriter
caracteres
Fichero
FileWriter
Prcticas de Programacin
69
Ficheros de texto
Lectura (lnea a lnea)
String caracteres
(cont.)
Fichero
BufferedReader
FileReader
Scanner
caracteres
FileReader
Fichero de texto
Operaciones: nextDouble, hasNextDouble, nextInt, hasNextInt, nextBoolean, hasNextBoolean, next, hasNext la clase Scanner tambin puede usarse como filtro de ficheros binarios o de strings
Prcticas de Programacin M. Aldea y M. Gonzlez 18/05/10
70
Fichero Binario
Fichero Binario
71
7.10 Bibliografa
King, Kim N. Java programming: from the beginning. W. W. Norton & Company, cop. 2000 The Java Turorials. Basic I/O. http://java.sun.com/docs/books/tutorial/essential/io/index.html Francisco Gutirrez, Francisco Durn, Ernesto Pimentel. Programacin Orientada a Objetos con Java. Paraninfo, 2007. Ken Arnold, James Gosling, David Holmes, El lenguaje de programacin Java, 3 edicin. Addison-Wesley, 2000. Eitel, Harvey M. y Deitel, Paul J., Cmo programar en Java, quinta edicin. Pearson Educacin, Mxico, 2004.
Prcticas de Programacin
72