UT8 Lectura y Escritura de Información

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 34

UT8: Lectura y escritura

de información.

PROGRAMACIÓN DAM/ DAW/ DAME L

MARÍA PÉREZ DURÁN 1


Introducción.
Hasta ahora hemos visto como almacenar datos en array y colecciones,
sin embargo, estos datos permanecen en la memoria RAM del
ordenador, lo que significa que cuando la aplicación finalice, toda la
información desaparecerá.

Ahora veremos como almacenar información de forma permanente en


ficheros de disco, así como su posterior recuperación.

MARÍA PÉREZ DURÁN 2


La clase FILE.
Los ficheros o archivos y directorios del disco se representan de forma
lógica en las aplicaciones Java como objetos de la clase File.
La clase File no se utiliza para transferir datos entre la aplicación y el
disco, sino para obtener información sobre los ficheros y directorios de
éste e incluso para la creación y eliminación de los mismos.

MARÍA PÉREZ DURÁN 3


Creación de un objeto File.
Existen diversas formas de crear un objeto File en función de cómo se
indique la localización del fichero o directorio que va a representar.
File f=new File(“datos.txt”);

File f2=new File(“misubdirectorio”);

La creación del objeto no implica que exista el fichero o directorio


indicado en la ruta. Si éste no existe, las anteriores instrucciones no
provocarán ninguna excepción, aunque tampoco será creado de forma
implícita.

MARÍA PÉREZ DURÁN 4


Creación de un objeto File.
Para crear físicamente el fichero o directorio indicado en el constructor
de File habrá que recurrir a los métodos:
◦ boolean createNewFile(). Crea el fichero cuyo nombre ha sido especificado
en el constructor. Devuelve true si se ha podido crear el fichero, mientras
que el resultado será false si ya existía y por tanto no se ha creado. Este
método provoca un excepción IOException que habrá que capturar.

f.createNewFile();

MARÍA PÉREZ DURÁN 5


Creación de un objeto File.
◦ boolean mkdir(). Crea el directorio cuyo nombre ha sido especificado en el
constructor. Si el directorio no existía y se ha creado devolverá true, de los
contrario devolverá false.

f2.mkdir();

MARÍA PÉREZ DURÁN 6


Creación de un objeto File.
La clase File también proporciona un constructor que permite crear un
objeto File asociado a un fichero, indicando a través de otro objeto File
el directorio donde se encuentra dicho fichero. En este caso el
directorio debe existir, de lo contrario se producirá una excepción al
intentar utilizar el fichero.
File (File dir, String nombre_fichero)

MARÍA PÉREZ DURÁN 7


Creación de un objeto File.
File f=new File(“datos”);
f.mkdir();

File fichero=new File(f,”info.txt”);


fichero.createNewFile();

MARÍA PÉREZ DURÁN 8


Información sobre un
fichero/directorio.
boolean canRead(). Indica si se puede o no leer del fichero.
boolean canWrite(). Indica si se puede o no escribir en el fichero.
boolean exists(). Indica si existe o no el fichero o directorio indicado en
la ruta.
boolean isFile(). Indica si el objeto File hace referencia o no a un
fichero.

MARÍA PÉREZ DURÁN 9


Información sobre un
fichero/directorio.
boolean isDirectory(). Indica si el objeto File hace referencia o no a un
directorio.
String getName(). Devuelve el nombre del fichero sin el path.
String getAbsolutePath(). Devuelve el path absoluto completo.

MARÍA PÉREZ DURÁN 10


Eliminación.
boolean delete(). Elimina el fichero o directorio especificado por el
objeto. Si el elemento ha podido ser eliminado el método devolverá
true, sino devolverá false. Un directorio sólo podrá ser eliminado si está
vacío; si no lo está, la llamada delete() sobre el objeto File devolverá
false, aunque no provocará ninguna excepción.

MARÍA PÉREZ DURÁN 11


Renombrado.
boolean renameTo(File nuevo). Renombra el fichero o directorio,
asignándole el nombre del objeto File especificado. La llamada a este
método devolverá true si se ha podido renombrar el elemento, mientras
que el resultado será false si esto no ha sido posible. En el caso de un
directorio, no es necesario que esté vacío para renombrarlo

MARÍA PÉREZ DURÁN 12


Lectura de un fichero de texto.
Para recuperar cadena de caracteres de un fichero, el paquete java.io
proporciona dos clases: FileReader y BufferedReader.

MARÍA PÉREZ DURÁN 13


Creación de un objeto
FileReader.
Para poder recuperar información de un fichero de texto se tiene crear
un objeto FileReader asociado al mismo. Un objeto FileReader
representa un fichero de texto “abierto” para la lectura de datos.
Se puede construir un objeto FileReader a partir de un objeto File
existente o bien proporcionando directamente la ruta del fichero, a
partir de los siguientes constructores.
FileReader(String path)
FileReader(File fichero)

MARÍA PÉREZ DURÁN 14


Creación de un objeto
FileReader.
File f=new File(“datos.txt”);
FileReader fr=new FileReader(f);

La clase FileReader proporciona el método Read() para la lectura de la


información almacenada en un fichero, resultando su uso bastante
engorroso ya que los carecteres son recuperados como tipo byte,
debiendo ser posteriormente convertidos a String. Es por ello más
cómodo recurrir a la clase BufferedReader, utilizando el objeto
FileReader como puente.

MARÍA PÉREZ DURÁN 15


Creación de un objeto
BufferedReader.
Una vez creado el objeto FileReader, el segundo paso consiste en crear
un Bufferedreader:
BufferedReader br=new BufferedReader(fr);

Una vez creado el objeto, puede utilizarse el método readLine() para


leer líneas de texto del fichero de forma similar a como se leía del
teclado. En el caso de un fichero y debido a que este puede estar
formado por más de una línea será necesario utilizarlo dentro de un
bucle while.

MARÍA PÉREZ DURÁN 16


Creación de un objeto
BufferedReader.
Import java.io.*;

public class Lectura{

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

File f=new File(“datos.txt”);

if(f.exists()){

FileReader fr=new FileReader(“datos.txt”);

BufferedReader br=new BufferedReader(fr);

String cad;

while ((cad=br.readLine()!=null){

System.out.println(cad)

else

System.out.println(“El fichero no existe”);

MARÍA PÉREZ DURÁN 17


Lectura de un fichero de texto:
Scanner
Para leer el contenido del fichero se crea una instancia de la
clase Scanner que recibe como argumento la instancia del fichero
de texto.
La clase Scanner ofrece el método hasNext() para saber si hay
más elementos que leer y next() para leer el siguiente elemento.
File ficheroEntrada=new File ("fichero.txt");

if (ficheroEntrada.exists()) {

Scanner datosFichero = new Scanner(ficheroEntrada);

System.out.println("Números del fichero");

while (datosFichero.hasNext()) {

MARÍA PÉREZ DURÁN 18


Escritura de un fichero de
texto
La realización de esta operación también se lleva a cabo en dos pasos
que implican la utilización de dos clases: FileWriter y PrintWriter.

MARÍA PÉREZ DURÁN 19


Creación de un objeto
FileWriter.
Como primer paso para escribir en un fichero de texto, es necesario
construir un objeto FileWriter que nos permita tener acceso al fichero
en modo “escritura”. Para ello podemos utilizar uno de los siguientes
constructores:
FileWriter (String path, boolean append)

FileWriter (String fichero, boolean append)

Donde append permite indicar si los datos que se van a escribir se


añadirán a los ya existentes (true) o sobrescribirá a estos (false).

MARÍA PÉREZ DURÁN 20


Creación del objeto
PrintWriter.
La escritura sobre un fichero se realizará de la misma forma que la
escritura en pantalla, de hecho, se utiliza la misma clase PrintWriter. La
diferencia está en que en el caso de la pantalla el objeto PrintWriter
asociado se encontraba en System.out, mientras que para un fichero de
texto habrá que construir el objeto PrintWriter a partir del objeto
FileWriter:
FileWriter fw=new FileWriter(“datos.txt”);
PrintWriter out=new PrintWriter(fw);

MARÍA PÉREZ DURÁN 21


Creación del objeto
PrintWriter.
Desde la versión Java 5 también es posible crear un objeto PrintWriter a
partir de un objeto File o incluso de la ruta del fichero, por lo que las
dos instrucciones anteriores podrían reducirse a una sola:
PrintWriter out=new PrintWriter(“datos.txt”);

Una vez creado el objeto PrintWriter podemos utilizar los métodos


print(), println() y printf().

MARÍA PÉREZ DURÁN 22


Creación del objeto
PrintWriter.
import java.io.*;
publioc class Grabación{

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

String nombres[]={“ana”,”rosa”,”jorge”,”manuel”};

FileWriter fw=new FileWriter(“datos.txt”);

PrintWriter out=new PrintWriter(fw);

for(int i=0;i<nombre.length;i++){
out.println(nombres[i]);

out.flush();
out.close();
}

MARÍA PÉREZ DURÁN 23


Creación del objeto
PrintWriter.
La llamada al método flush() de PrintWriter garantiza que todos los
datos enviados a través del buffer de salida han sido escritos en el
fichero.
La llamada al método close() de PrintWriter cierra la conexión con el
fichero y libera los recursos utilizados por está.

MARÍA PÉREZ DURÁN 24


Escritura de objetos en un
fichero.
Hasta ahora hemos visto cómo leer y escribir datos en un fichero, tanto
cadenas de caracteres como tipos primitivos Java.
En esta parte veremos también cómo intercambiar otros tipos de
objetos Java entre una aplicación y el disco.

MARÍA PÉREZ DURÁN


Serialización de objetos.
Para que un objeto pueda ser almacenado en disco, es necesario que la
clase a la que pertenece sea serializable. Esta característica la poseen
todas las aquellas clases que implementen la interfaz
java.io.Serializable.
La interfaz Serializable no contiene ningún método, basta con que una
clase la implemente para que sus objetos puedan ser serializados por la
máquina virtual y por tanto almacenados en disco.

MARÍA PÉREZ DURÁN


Serialización de objetos.
Import java.io.Serializable;

Public class Persona implements Serializable{

private String nombre;

private int edad;

public Persona(String n, int e){

nombre=n;

edad=e;

public void setNombre(String n){

nombre=n;

MARÍA PÉREZ DURÁN


Serialización de objetos.
}

public String getNombre(){

return nombre;

public void setEdad(int e){

edad=e;

public int getEdad(){

return edad;

MARÍA PÉREZ DURÁN


Creación de un objeto
ObjectOutputStream.
La escritura de objetos en disco se realiza a través de
ObjectOutputStream. Para crear un objeto de esta clase es necesario
disponer del FileOutputStream asociado al fichero donde se va a
realizar la escritura.
Una vez creado el objeto la clase posee el método writeObject(Object
obj) para realizar la escritura del objeto en el disco.

MARÍA PÉREZ DURÁN


Creación de un objeto
ObjectOutputStream.
import java.io.*;
public class Almacenamiento{
public static void main(String args [])throws IOException{
FileOutputStream fs=new FileOutputStream(“datos.obj”);
ObjectOutputStream os=new ObjectOutputStream(fs);
os.writeObject(new Persona(“Paco”,40));
os.close();
}
}

MARÍA PÉREZ DURÁN


Lectura de objetos de un
fichero.
Para leer objetos de un fichero que han sido almacenados mediante
ObjectOutputStream, se deberá utilizar un objeto ObjectInputStream.

MARÍA PÉREZ DURÁN


Creación de objetos
ObjectInputStream.
La clase ObjectInputStream dispone del método Object readObject()
para devolver los objetos almacenados en el fichero. El constructor de
esta clase requiere un objecto FileInputStream asociado al fichero de
donde se leerá el objeto.
Este método declara dos excepciones IOException y
ClassNotFoundException, que habrá que capturar.

MARÍA PÉREZ DURÁN


Creación de objetos
ObjectInputStream.
import java.io.*;
public class Recuperación{
public static void main (String args[]) throws IOEXception,
ClassNotFound Exception{
FileInputStream fs=new FileInputStream(“datos.obj”);
ObjectInputStream os= new ObjectInputStream(fs);
// Se debe realizar un casting al tipo original
Persona p=(Persona).os.readObject();
System.out.println(p.getNombre());
System.out.println(p.getEdad());
os.close();
MARÍA PÉREZ DURÁN
Deserialización de objetos.
Cuando se recupera un objeto del disco mediante la llamada a
readObject(), se produce la deserialización del objeto que básicamente
consiste en la reconstrucción de éste a partir de la información
recuperada.
Durante este proceso, los datos miembro no serializables (aquellos que
han sido heredados de una clase no serializable) serán inicializados
utilizando el constructor por defecto de su clase. Por el contrario, los
datos miembros de la clase del objeto serializados serán restaurados
con los valores almacenados.

MARÍA PÉREZ DURÁN

También podría gustarte