of 22/22
Archivos de acceso Aleatorio Archivos de acceso Aleatorio IF3000 Programación II M.c.i. Wendy Ramírez M.c.i. Alejandro Ulate

Archivos Aleatorios

  • View
    446

  • Download
    1

Embed Size (px)

Text of Archivos Aleatorios

Archivos de acceso AleatorioIF3000 Programacin II M.c.i. Wendy Ramrez M.c.i. Alejandro Ulate

Repaso ArchivosEl objeto File es inmutable, una vez creado no puede hacer referencia a otro fichero. Atributo Separador: Separador de directorios: En Linux/Unix: se utiliza / En Windows, se utiliza \\ (realmente es \ pero para ponerlo dentro de una cadena hay que duplicarlo) Los Streams se abren automticamente al crearlos, pero es necesario cerrarlos explcitamente llamando al mtodo close() cuando se dejan de usar.

Archivos AleatoriosSe utiliza la clase RandomAccessFile No est basada en el concepto de flujos o Streams. No deriva de InputStream/OutputStream ni Reader/Writer, sino directamente de Object. Permite leer y escribir sobre el fichero, no es necesario dos clases diferentes. Necesario especificar el modo de acceso al construir un objeto de esta clase: slo lectura o lectura/escritura. Dispone de mtodos especficos de desplazamiento como seek(long posicion) o skipBytes(int desplazamiento) para poder moverse de un registro a otro del fichero, o posicionarse directamente en una posicin concreta del fichero. Los datos se guardan en forma de bytes.

Archivos Aleatorios (cont.)Constructores: RandomAccessFile(File f, String modoAcceso) RandomAccessFile(String nombreArchivo, String modoAcceso) modoAcceso puede ser: r (slo lectura) o rw (lectura y escritura). Mtodos: void seek(long posicion): Sita el puntero de lectura/escritura en la posicin indicada, desde el principio del fichero. long getFilePointer(): Devuelve la posicin actual del puntero de lectura/escritura. int skipBytes(int desplazamiento): Desplaza el puntero desde la posicin actual, el nmero de bytes indicado por desplazamiento long length(): Devuelve la longitud o tamao del fichero en bytes

Ejemplo escritura/lectura

SerializacinSerializacin: Posibilidad de escribir/leer Objetos java en Streams o Archivos. La serializacin de un objeto consiste en generar una secuencia de bytes lista para su almacenamiento o transmisin. Despus, mediante la deserializacin, el estado original del objeto se puede reconstruir. Para poder serializar un objeto en java deben cumplirse los siguientes requisitos: Debe implementar la interfaz Serializable (que lo nico que hace es marcar el objeto como serializable, sin que tengamos que implementar ningn mtodo). Todos los objetos incluidos en l tienen que implementar la interfaz Serializable. Todos los tipos primitivos en Java son serializables por defecto (igual que los arrays y otros muchos tipos estndar).

Serializacin (cont.)

Serializacin (cont.)import java.io.*; public class ContactoOutput { private FileOutputStream file; private ObjectOutputStream output; // Abrir el fichero public void abrir() throws IOException { file = new FileOutputStream( "clientes.ser" ); output = new ObjectOutputStream(file); } // Cerrar el fichero public void cerrar() throws IOException { if (output!=null) output.close(); } // Escribir en el fichero public void escribir (Contacto contacto) throws IOException { if (output!=null) output.writeObject(contacto); } }

UsoEscritura de datos ContactoOutput salida; salida = new ContactoOutput(); salida.abrir(); salida.escribir( contacto1 ); salida.escribir( contacto2 ); salida.cerrar();

UsoLectura de datos Contacto contacto; ContactoInput entrada; entrada = new ContactoInput(); entrada.abrir(); do { contacto = entrada.leer(); System.out.println(contacto); } while (contacto!=null); entrada.cerrar(); NOTA: El fichero con los objetos serializados contactos.ser almacena los datos en un formato propio de Java, por lo que no se puede leer fcilmente con un simple editor de texto (ni editar).

Deserializacinimport java.io.*; public class ContactoInput { private FileInputStream file; private ObjectInputStream input; public void abrir() throws IOException { file = new FileInputStream( "clientes.ser" ); input = new ObjectInputStream (file); } public void cerrar() throws IOException { if (input!=null ) input.close(); } public Contacto leer () throws IOException, ClassNotFoundException { Contacto contacto = null; if (input!=null) { try { contacto = (Contacto) input.readObject(); } catch (EOFException eof) { // Fin del fichero } } return contacto; } }

Trabajo con ObjetosEn este tipo de aplicaciones, se ha de acceder a un registro concreto dentro de un fichero, por lo que los registros deben ser de tamao fijo:

Como Java utiliza caracteres UNICODE, cada carcter de una cadena de caracteres ocupa 16 bits (2 bytes). La clase RandomAccessFile nos permitir representar un fichero de acceso aleatorio para el que nosotros definiremos el formato de sus registros.

Clase Registroimport java.io.*; import java.text.DateFormat; public class Registro extends Contacto { public final static int DIM = 364; // Lectura public void read (RandomAccessFile file) throws IOException, java.text.ParseException { DateFormat df; setNombre ( readString (file, 32) ); setTelefono ( readString (file, 16) ); setEmail ( readString (file, 32) ); setDireccion ( readString (file, 64) ); df = DateFormat.getDateInstance(DateFormat.LONG); setNacimiento ( df.parse(readString(file,32)) ); setGrupo(file.readInt()); setDeuda(file.readDouble()); }

Clase Registro (cont.)private String readString (RandomAccessFile file, int dim) throws IOException { char campo[] = new char[dim]; for (int i=0; i