Documente Academic
Documente Profesional
Documente Cultură
Flujos y
ficheros.
Programación (PRG)
Curso 2018/19
flujo de entrada:
fuente + secuencia de información
Fuente
Programa
flujo de salida:
destino + secuencia de información destino
Programa
InputStream
OutputStream
• Características principales :
– Nombre (p.e. fichero.txt).
– Ruta en el dispositivo de almacenamiento
(p.e. /home/lucas/docs/file.txt).
– Tamaño, típicamente expresado en bytes (Kb, Mbytes, Gbytes, etc.).
• Características adicionales:
– Permisos de acceso (dependientes del sistema de ficheros).
– Fecha de la última modificación.
– …
Programa
FileInputStream
FileOutputStream
Método Descripción
File(String pathname) Crea un nuevo objeto de tipo File a partir de la ruta
boolean delete() Borra el fichero/directorio. Retorna true si se ha podido
borrar, false en caso contrario.
boolean exists() Indica si el fichero/directorio existe
String getName() Retorna el nombre del fichero/directorio (sin la ruta)
String getParent() Retorna la ruta del padre, si es conocida.
long length() Retorna la longitud del fichero. No válido para directorios
File[] listFiles() Retorna un array con la lista de ficheros en el directorio
boolean isDirectory() Indica si se trata de un directorio
. . .
}
}
• Al crear un PrintWriter:
Si el fichero no existe se crea uno nuevo, si existe se trunca su tamaño a
cero.
Si se diera algún error (no se puede crear un nuevo fichero en el sistema,
falla la apertura del fichero, ...) se lanza la excepción comprobada
FileNotFoundException.
... y los análogos para boolean, byte, short, long, float, double ...
PRG. ETSINF. UPV - Curso 2018/19 16
Ficheros de texto. Lectura: Scanner
• Ejemplo.
Un Scanner contiene
un buffer de memoria
(char[]) en donde
dispone los caracteres
que le llegan de la
fuente
' ' 'h' 'o' 'l' 'a' ' ' '1' '\n' ' ' '2' '\n' ...
' ' 'h' 'o' 'l' 'a' ' ' '1' '\n' ' ' '2' '\n' ...
int n1 = entrada.nextInt(); // n1 es 1
' ' 'h' 'o' 'l' 'a' ' ' '1' '\n' ' ' '2' '\n' ...
... '1' '\n' ' ' '2' '\n' ' ' 't' 'r ' 'e' 's' ...
El token erróneo no se extrae del Scanner
PRG. ETSINF. UPV - Curso 2018/19 19
Ficheros de texto. Lectura: Scanner
• Ejemplo. Se intenta leer un real permitiendo que el usuario lo escriba en notación local o
americana. Si se lee un token erróneo en una notación, se intenta una segunda lectura en la otra.
} catch (InputMismatchException e) {
System.out.println("Dato erroneo. Vuelva a intentarlo.");
String basura = teclado.next();
}
} while (!leidoX);
...
... 't' 'o' 't ' 's' '\n' 'H' 'i' '!' '\n' 'H' ...
PRG. ETSINF. UPV - Curso 2018/19 22
Ficheros de texto. Lectura: Scanner
• Ejercicio. Considerar la siguiente clase, cuyo main pide al usuario que introduzca una longitud
máxima de línea en el rango [0,80], y a continuación una línea de texto. Se desea escribir en la
salida la comparación de la longitud de la línea con la máxima longitud introducida.
import java.util.*; import java.io.*;
public class LeerLinea {
public static void main(String[] args){
}
PRG. ETSINF. UPV - Curso 2018/19 23
Ficheros de texto. Lectura: Scanner
• Si se ejecuta el main de la clase, se observa una salida como la siguiente:
import java.io.FileNotFoundException;
import java.util.Scanner;
public class TestPrintWriter1 {
public static void main(String[] args) {
String fichero = "file1.txt";
try {
PrintWriter pw = new PrintWriter(new File(fichero));
for (int i = 0; i < 10 ; i++) { pw.println(i); }
pw.close();
Scanner entrada = new Scanner(new File(fichero));
while (entrada.hasNext()) {
System.out.println("Valor leido: "
+ entrada.nextInt());
}
entrada.close();
} catch (FileNotFoundException e) {
System.err.println("Problemas al abrir " + fichero);
}
} Los tokens se van a leer del fichero de texto de nombre file.txt
} PRG. ETSINF. UPV - Curso 2018/19 25
Ficheros de texto. Lectura: Scanner
• ¿ Qué salida produce el siguiente programa, siendo ejemplo.txt el de la figura?
public class TestScanner {
public static void main(String[] args) {
System.out.println("Se leen 3 numeros y una linea de texto");
Scanner entrada = null;
try {
entrada = new Scanner(new File("ejemplo.txt"));
} catch(FileNotFoundException e) {
System.err.println("El fichero no existe." + e.getMessage());
System.exit(0);
}
int n1 = entrada.nextInt();
int n2 = entrada.nextInt();
int n3 = entrada.nextInt();
entrada.nextLine();
String linea = entrada.nextLine();
System.out.println("Los tres numeros son: " + n1 + ", " + n2
+ ", " + n3);
System.out.println("La linea es: " + linea);
entrada.close(); ejemplo.txt
} 1 2
} 3 4 5
Ultima linea.
PRG. ETSINF. UPV - Curso 2018/19 26
Cierre de ficheros
• Los ficheros siempre deben cerrarse explícitamente al acabar de utilizarse.
En particular, un fichero sobre el que se ha escrito, debe ser cerrado antes de poder
ser abierto para lectura (para garantizar la escritura de datos en el disco), y que
pueda ser usado por otra aplicación.
O
lista(ent2); ent2.close();
} catch (FileNotFoundException e) {
System.out.println("Error al abrir " + f);
}
} siempre DEBECERRARSE
/** Metodo auxiliar. Escribe las lineas de s en la salida estandar */
private static lista(Scanner s) {
while (s.hasNext()) {
String linea = s.nextLine();
System.out.printl(linea);
}
}
PRG. ETSINF. UPV - Curso 2018/19 28
Cierre de ficheros
• Ejemplo. Programa que crea una copia de seguridad de un fichero: crea una copia y la deja sólo
de lectura; si la copia no se puede crear, el programa termina sin hacer nada más.
import java.util.Scanner;
import java.io.PrintWriter;
import java.io.FileNotFoundException;
public class CopiaSeguridad {
.....
campo
registro registro
fichero
PRG. ETSINF. UPV - Curso 2018/19 31
Ficheros binarios de acceso secuencial
• En Java también es posible almacenar una secuencia de objetos para poder
recuperarlos posteriormente en el mismo orden. Este proceso se denomina
serialización, y se habla de ficheros binarios de acceso secuencial (fbs).
• Por ejemplo:
– Es posible salvar el contenido de una agenda (objeto de la clase Agenda)
almacenando uno a uno sus objetos constituyentes (objetos de tipo
ItemAgenda).
– O incluso se podría salvar en el fichero un objeto de tipo Agenda (que
incluiría internamente todos los ItemAgenda que lo forman).
• Un fichero puede contener objetos de diferentes clases o incluso mezclar
objetos y valores elementales:
fichero
PRG. ETSINF. UPV - Curso 2018/19 32
Ficheros binarios de acceso secuencial
• En Java es posible escribir o leer en ficheros binarios secuenciales :
– Valores de tipo primitivos como boolean, int, double, etc.,
– Objectos, con todos sus componentes internos (incluyendo todos los
objetos referenciados por los primeros, y así sucesivamente, de manera
recursiva).
• Los métodos que simplifican esta tarea al programador los
proporcionan unas clases del paquete java.io:
– ObjectInputStream, para lectura, y
– ObjectOutputStream, para escritura.
• Ejemplo.
Método Descripción
ObjectInputStream(InputStream in) Crea un nuevo objeto a partir del flujo de
entrada.
incluyendo la clase derivada FileInputStream
• Para leer de un fichero, primero hay que crear un flujo FileInputStream, y luego
crear a partir de él un ObjectInputStream.
PRG. ETSINF. UPV - Curso 2018/19 37
Excepciones en ObjectOutputStream,
ObjectInputStream
• El constructor de FileOutputStream/FileInputStream puede
lanzar la excepción FileNotFoundException:
– Si se da algún problema al acceder al fichero especificado, o
– en el caso de FileInputStream no existe el fichero que se pretende
abrir.