Está en la página 1de 27

Instituto Tecnolgico de Cd.

Victoria

Programacin Orientada a Objetos

Educacin a Distancia

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

Contenido
6.1 6.2 Definicin de Archivos de Texto y Archivos Binarios Operaciones bsicas en de Archivos de Texto y Archivos Binarios Aplicaciones Pg. 3 5

6.3

21

Educacin a Distancia

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

UNIDAD VIII: ARCHIVOS

8.1. Definicin de Archivos de Texto y Archivos Binarios La informacin que necesita un programa para funcionar se obtiene mediante una entrada de datos de una fuente que puede ser de tipos muy variados: desde el teclado, desde un archivo, desde una comunicacin en red, desde un objeto en Internet, etc. As mismo, el tipo de datos que se lee puede ser de muy diversas caractersticas: texto, imgenes, sonidos, etc. Cuando el programa genera los resultados como salida de la ejecucin puede hacerlo de diferentes formas: en un archivo, en la pantalla, en una impresora, etc. y la forma como genera este resultado tambin puede ser de muy diferente tipo: texto, binario, imgenes, etc. En Java la entrada (lectura) de los datos se realiza mediante un flujo (stream) de entrada. La salida (escritura) de datos se realiza mediante un flujo (stream) de salida. El esquema para trabajar con los flujos de datos tanto de entrada como de salida es el siguiente: Entrada de datos(leer) 1. Se crea un objeto flujo de datos de lectura 2. Se leen datos de l con los mtodos apropiados 3. Se cierra el flujo de datos Salida de datos(escribir) 1. Se crea un objeto flujo de datos de escritura 2. Se escriben datos utilizando los mtodos apropiados del objeto flujo 3. Se cierra el flujo de datos

Ambas operaciones se pueden entremezclar creando objetos flujo para leer y para escribir, leyendo de uno y escribiendo de otro para, finalmente, cerrar tanto el flujo de lectura como el de escritura. Tipos de Flujos Existen dos tipos de flujos definidos en Java: unos que trabajan con bytes y otros que trabajan con caracteres. As mismo existen clases conversoras que permiten obtener un flujo de bytes a partir de uno de caracteres y viceversa, tanto para lectura como para escritura. Las siguientes clases son las clases ms importantes que nos permiten manejar los flujos. La sangra dentro de la tabla indica la herencia. Por ejemplo DataInputStream hereda de FileInputStream que a su vez hereda de InputStream. Flujos con bytes
InputStream ByteArrayInputStream FileInputStream Educacin a Distancia

Flujos con caracteres


Reader BufferedReader LineNumberReader

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

FileInputStream BufferedInputStream DataInputStream LineNumberInputStream PushbackInputStream ObjectInputStream PipedInputStream SequenceInputStream StringBufferInputStream OutputStream ByteArrayOutputStream FileOutputStream FileOutputStream BufferedOutputStream DataOutputStream LineNumberOutputStream PushbackOutputStream ObjectOutputStream PipedOutputStream SequenceOutputStream StringBufferOutputStream

CharArrayReader FilterReader PushbackReader InputStreamReader FileReader PipedReader StringReader Writer BufferedWriter CharArrayWriter FilterWriter OutputStreamWriter FileWriter PipedWriter PrintWriter StringWriter

Adicionalmente de las clases anteriores existe una clase especial, en el paquete java.io, llamada RandomAccessFile para el acceso aleatorio de archivos. Permite utilizar los archivos en modo de lectura y escritura simultneamente o acceder a datos de forma aleatoria indicando la posicin en la que se quiere operar.

Educacin a Distancia

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

8.2. Operaciones bsicas en Archivos de Texto y Archivos Binarios Leer y escribir en un archivo de Texto Secuencial Un archivo se encuentra en un disco. Desde el punto de vista de lectura y escritura un archivo se trata de una secuencia continua de datos, ya sean bytes (archivo binario) o caracteres (archivo de texto). La forma bsica de utilizar un archivo para entrada y salida de datos, para leer del archivo y para escribir respectivamente, es la siguiente: Lectura de un archivo Abrir el flujo del archivo Mientras quedan datos leer el siguiente dato Cerrar el flujo del archivo Escritura de un archivo Abrir el flujo del archivo Mientras haya datos por escribir escribir en el archivo Cerrar el flujo del archivo

Los archivos y flujos (streams) en java se utilizan haciendo uso del paquete java.io que contiene una gran cantidad de clases e interfaces. Estas clases e interfaces nos permiten realizar lecturas y escrituras de archivos secuenciales y aleatorios. Las clases InputStream y OutputStream derivan directamente del paquete java.lang.Object y son las superclases de las clases FileInputStream y FileOutputStream, que nos permiten trabajar con archivos secuenciales de datos. Las clases InputStream y OutputStream son muy genricas, nos proporcionan unicamente la base para hacer uso de archivos secuenciales. Sus mtodos mas importantes son read() y write( int b); son mtodos abstractos que definen la funcin bsica de lectura y escritura de un byte. La clase RandomAccessFile permite trabajar con archivos de acceso directo, proporcionando numerosos mtodos de lectura y escritura de los tipos de datos bsicos. La clase File facilita la gestin de los archivos en si (renombrado, borrado, etc.) sin centrarse en su contenido. Para realizar acciones sobre archivos secuenciales se utilizan las clases FileInputStream y FileOutputStream, Estas clases proporcionan una serie de constructores que permiten indicar el archivo sobre el cual se trabajara. Uno de esos constructores son los siguientes: FileInputStream( String archivoOrigen) FileOutputStream( String archivoDestino) Para crear objetos de estas clases se realiza lo siguiente: FileInputStream archivoOrigen = new FileInputStream (entrada.txt); FileOutputStream archivoDestino = new FileOutputStream ( salida.txt);
Educacin a Distancia

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

La clase FileInputStream proporciona tres mtodos sobrecargados read() y la clase FileOutputStream otros tres mtodos sobrecargados writre(). El mtodo close() esta accesible en ambas clases y su uso es aconsejable para liberar recursos asociados con el stream. El uso de las clases FileInputStream y FileOutputStream es vlido para todo tipo de archivos secuenciales, sin embargo para archivos de texto tambin se utilizan las clases FileReader y FileWriter.

Ejemplos: Ejemplo 1 El siguiente programa lee un archivo de texto secuencial y lo muestra en pantalla. El archivo que lee es un texto llamado DatosPersonales.txt. Al momento de ir leyendo el archivo, la aplicacin coloca la informacin en una arreglo llamado buffer de tamao 64 (este tamao se asigna arbitrariamente). La instanciacin del objeto de lectura del archivo puede lanzar una excepcin FileNotFoundException razn por la cual este cdigo se coloca dentro de una clausula try-catch. import java.io.*; public class LeeArchivo { public static void main(String[] args) { final int TAMANIO_BUFFER = 64; byte buffer[] = new byte[TAMANIO_BUFFER]; int NumBytes; try { FileInputStream archivoOrigen = new FileInputStream("C:/Documents and Settings/Lilia Del Carmen/Mis documentos/DatosPersonales.txt"); try { do { NumBytes = archivoOrigen.read(buffer); System.out.print(new String(buffer,0,NumBytes)); } while (NumBytes == TAMANIO_BUFFER); System.out.println( ); archivoOrigen.close();
Educacin a Distancia

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

} catch (IOException e) { System.out.println("Error leyendo los datos o cerrando el archivo"); } } catch (FileNotFoundException e) { System.out.println("Archivo no encontrado"); } } }

Ejemplo 2 El siguiente programa lee lneas de informacin desde el teclado, la coloca en bloques de tamao NumBytes, posteriormente los va escribiendo en un archivo de texto secuencial. El archivo de texto que genera es llamado OtrosDatos.txt. Para finalizar la lectura de informacin desde el teclado es necesario proporcionar un enter. import java.io.*; public class EscribeArchivo { public static void main(String[] args) { final int TAMANIO_BUFFER = 64; byte buffer[] = new byte[TAMANIO_BUFFER]; int NumBytes; try { FileOutputStream archivoDestino = new FileOutputStream("C:/Documents and Settings/Lilia Del Carmen/Mis documentos/OtrosDatos.txt"); try { do { NumBytes = System.in.read(buffer); archivoDestino.write(buffer,0,NumBytes); } while (buffer[0] != Character.LINE_SEPARATOR);
Educacin a Distancia

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

archivoDestino.close(); } catch (IOException e) { System.out.println("Error escribiendo los datos o cerrando el archivo"); } } catch (FileNotFoundException e) { System.out.println("Archivo no encontrado"); } } } Leer y escribir en un archivo Binario Secuencial Los archivos binarios guardan la informacin en bytes y solo se puede acceder a estos datos por medio de programas que lean esta informacin y nos la muestren. En contraste, la informacin en los archivos de texto puede adems ser accedida abriendo estos archivos con algn editor de texto estndar. Un registro es un conjunto de datos que conforman las caractersticas de lo que se desea guardar en un archivo. Por ejemplo si queremos guardar un archivo con informacin de alumnos y para cada alumno deseamos guardar su nmero de control, su cdigo de acceso, su nombre, su apellido paterno y su apellido materno entonces los siguientes podran ser un ejemplo de registros para el archivo de alumnos: 1234 123 Mara Prez Martnez 4567 456 Jos Sosa Sosa Cada uno de estos datos tienen definido su tipo y es necesario tenerlo disponible al momento de acceder al archivo. En un archivo se guardan los datos, no la informacin sobre los tipos. Si el programa que va a leer estos datos sabe a qu tipo de objeto corresponden estos datos, entonces simplemente se leen y se colocan objetos de este tipo en el archivo. Java cuenta con un mecanismo llamado serializacin de objetos que permite manejar un archivo leyendo y escribiendo objetos en l. Un objeto serializado es un objeto que se representa como una secuencia de bytes, la cual incluye los datos del objeto, as como informacin acerca del tipo del objeto y los tipos de los datos almacenados en el mismo. Una vez que se escribe un objeto serializado en un archivo, se puede leer de ese archivo y deserializarse; es decir, la informacin del tipo y los bytes que representan al objeto y sus datos se puede utilizar para recrear el objeto en memoria. Las clases ObjectInputStream y ObjectOutputStream, que implementan en forma respective a las interfaces ObjectInput y ObjectOutput, permiten
Educacin a Distancia

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

leer/escribir objetos completos de/en un flujo (ese flujo puede ser un archivo). Para utilizar la serializacin con los archivos, se inicializan los objetos ObjectInputStream y ObjectOutputStream como objetos flujo que pueden leer y escribir informacin desde/hacia los archivos; objetos de las clases FileInputStream y FileOutputStream respectivamente. La accin de inicializar objetos flujo con otros objetos flujo de esta forma se conoce algunas veces como envoltura: el nuevo objeto flujo que se va a crear envuelve al objeto flujo especificado como un argumento del constructor. Por ejemplo, para envolver un objeto FileInputStream en un objeto ObjectInputStream, se pasa el objeto FileInputStream al constructor del ObjectInputStream:
ObjectOutputStream salida = new ObjectOutputStream( new FileOutputStream("clientes.ser" ) );

La interfaz ObjectInputStream contiene el mtodo readObject(), el cual lee y devuelve una referencia a un objeto Object de un objeto InputStream. Una vez que se lee un objeto, su referencia puede convertirse en el tipo actual del objeto. De manera correspondiente la interfaz ObjectOutputStream contiene el mtodo writeObject(), el cual toma un objeto Object que implementa la interfaz serializable como un argumento y escribe su informacin a un objeto OutputStream. La interfaz Serializable es una interfaz de marcado. Dicha interfaz no contiene mtodos. Una clase que implementa a Serializable se marca como objeto Serializable. Esto significa que un objeto ObjectOutputStream no enviar un objeto como salida a menos que sea Serializable. Lo anterior es aplicado a cualquier objeto de una clase que implemente a Serializable.

Ejemplos: Ejemplo 3 En el siguiente ejemplo se define una clase RegistroAlumnoSerializable que implementa la interfaz Serializable para permtir serializar y deserializar los objetos de esta clase con objetos ObjectOutputStream y ObjectIntputStream. Adicionalmente se define la clase CrearArchivoSecuencialAlumnos el cual abre un archivo de salida creando un objeto FileOutputStream. Esta clase tiene mtodos para solicitar informacin, del teclado, as como mtodos para guardar informacin en el archivo. El ejemplo considera tambin el diseo de la clase de Prueba de estas clases. NOTA: La salida de este ejemplo es un archivo binario. Cuando se ejecuta NO se muestra nada en pantalla, para ver la informacin en pantalla de este archivo es necesario realizar el ejemplo 4. import java.io.Serializable;
Educacin a Distancia

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

import java.io.Serializable; public class RegistroAlumnoSerializable implements Serializable { private int numeroControl; private int nip; private String nombre; private String apellidoPaterno; private String apellidoMaterno; public RegistroAlumnoSerializable() { this(0, 0, "", "", ""); } public RegistroAlumnoSerializable(int num, int pass, String nom, String pat, String mat) { estableceNumeroControl(num); estableceNip(pass); estableceNombre(nom); establecePaterno(pat); estableceMaterno(mat); } public void estableceNumeroControl( int num ) { numeroControl = num; } public int dameNumeroControl( ) { return numeroControl; } public void estableceNip( int pass ) { nip = pass; } public int dameNip( ) { return nip; } public void estableceNombre( String nom )
Educacin a Distancia

10

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

{ nombre = nom; } public String dameNombre( ) { return nombre; } public void establecePaterno( String pat ) { apellidoPaterno = pat; } public String damePaterno( ) { return apellidoPaterno; } public void estableceMaterno( String mat ) { apellidoMaterno = mat; } public String dameMaterno( ) { return apellidoMaterno; } }

import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.util.NoSuchElementException; import java.util.Scanner; public class CrearArchivoSecuencialAlumnos { private ObjectOutputStream salida; public void abrirArchivo( ) { try {
Educacin a Distancia

11

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

salida = new ObjectOutputStream( new FileOutputStream( "alumnos.ser") ); } catch(IOException e) { System.err.println("Error al abrir el archivo de Alumnos...."); } } public void agregarRegistros() { RegistroAlumnoSerializable registro; int numero = 1; int pass; String nombre; String paterno; String materno; Scanner entrada = new Scanner( System.in ); System.out.printf( "%s\n%s\n\n", "Por favor introduzca los datos.", "Para terminar de introducir datos, escriba un numero de control negativo." ); System.out.printf( "%s\n%s", "Escriba el numero de control (>0), nip, nombre, paterno y materno.", "?" ); numero = entrada.nextInt(); while ( numero > 0 ) { try { pass = entrada.nextInt(); nombre = entrada.next(); paterno = entrada.next(); materno = entrada.next(); if ( numero > 0 ) { registro = new RegistroAlumnoSerializable( numero, pass, nombre, paterno, materno ); salida.writeObject(registro); } else
Educacin a Distancia

12

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

{ System.out.println("El numero de control debe ser mayor que 0 !!!"); } } catch(IOException e) { System.err.println("Error al escribir el archivo de Alumnos."); } catch(NoSuchElementException e) { System.err.println("Entrada ivalida. Intente de nuevo."); entrada.nextLine(); } System.out.printf( "%s\n%s", "Escriba el numero de control (>0), nip, nombre, paterno y materno.", "?" ); numero = entrada.nextInt(); } } public void cerrarArchivo( ) { try { if ( salida != null ) salida.close(); } catch( IOException e ) { System.err.println( "Error al cerrar el archivo."); System.exit( 1 ); } } }

import java.io.File; public class PruebaCrearArchivoSecuencialAlumno { public static void main(String[] args) { CrearArchivoSecuencialAlumnos aplicacion = new CrearArchivoSecuencialAlumnos();
Educacin a Distancia

13

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

aplicacion.abrirArchivo(); aplicacion.agregarRegistros(); aplicacion.cerrarArchivo(); File nombre = new File ("alumnos.ser"); System.out.println("Ruta: " + nombre.getAbsolutePath()); } }

Ejemplo 4 En el siguiente ejemplo se utiliza clase RegistroAlumnoSerializable, del ejemplo anterior, y se define la clase LeerArchivoSecuencialAlumnos el cual abre un archivo de entrada creando un objeto FileInputStream. Esta clase tiene mtodos para leer informacin del archivo, as como mtodos para mostrar esta informacin en la pantalla. El ejemplo considera tambin el diseo de la clase de Prueba de estas clases.

import java.io.EOFException; import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; public class LeerArchivoSecuencialAlumnos { private ObjectInputStream entrada; public void abrirArchivo() { try { entrada = new ObjectInputStream( new FileInputStream( "alumnos.ser") ); } catch( IOException e ) { System.err.println( "Error al abrir el archivo de alumnos...."); } } public void leerRegistros() { RegistroAlumnoSerializable registro;
Educacin a Distancia

14

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

System.out.printf( "%8s%5s%-15s%-15s%-15s\n", "NumCTRL", "NIP", "Nombre", "Paterno", "Materno" ); try { while (true) { registro = ( RegistroAlumnoSerializable ) entrada.readObject(); System.out.printf( "%8d%5d%-15s%-15s%-15s\n", registro.dameNumeroControl(), registro.dameNip(), registro.dameNombre(), registro.damePaterno(), registro.dameMaterno() ); } } catch( EOFException e) { return; } catch( ClassNotFoundException e) { System.err.println("Error NO se pudo crear el objeto...."); } catch(IOException e) { System.err.println("Error al leer el archivo de Alumnos...."); } } public void cerrarArchivo() { try { if ( entrada != null ) entrada.close(); System.exit(0); } catch( IOException e ) { System.err.println("Error al cerrar el archivo de Alumnos...."); System.exit(1); } } }

public class PruebaLeerArchivoSecuencialAlumno {


Educacin a Distancia

15

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

public static void main(String[] args) { LeerArchivoSecuencialAlumnos LeerArchivoSecuencialAlumnos(); aplicacion.abrirArchivo(); aplicacion.leerRegistros(); aplicacion.cerrarArchivo();

aplicacion

new

} }

Educacin a Distancia

16

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

Leer y escribir en un archivo de Acceso Aleatorio La clase RandomAccessFile, contenida en el paquete java.io, tiene una clase muy til para el procesamiento de archivos de acceso directo e implementa la clase DataInput y DataOutput que contienen mtodos de lectura y escritura sobre estos tipos de archivos. La clase tiene dos constructores, uno de ellos es el siguiente: RandomAccessFile(String nombreArchivo, String modo); El parametro modo puede tomar 4 valores diferentes, los dos ms utilizados son r para lectura y rw para lectura y escritura. La clase contiene varios mtodos que permiten leer, escribir y localizar la informacin en un archivo de forma directa.

Ejemplos: Ejemplo 5 En el siguiente ejemplo se define una clase AlumnoRandom que establece un objeto con las caractersticas: nombre, nmero de control, edad y sexo. La clase CreaAlumnoRandom, es una aplicacin que define un registro de AlumnoRandom y un archivo RandomAccessFile que es abierto de lectura escritura para crear un archivo de alumnos de acceso aleatorio cuya llave es el nombre del alumno. Adicionalmente se define la clase ConsultaAlumno la cual abre de lectura el archivo de alumnos creado en el ejemplo anterior. Esta clase tiene un mtodo para consultar todos los registros del archivo de alumnos y un mtodo para realizar la consulta de un alumno en particular por medio de la llave del archivo (para el ejemplo la llave es el nombre del alumno). Por ltimo el ejemplo la aplicacin Consultas permite probar las consultas generales y por alumno de la clase ConsultaAlumno.

import java.io.*; public class AlumnoRandom { String nombre; int numControl; int edad; char sexo;

Educacin a Distancia

17

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

final int TAM = 91; public AlumnoRandom() { nombre = new String(); numControl = 0; edad = 0; sexo = ' '; } public boolean addReg( RandomAccessFile f1) { boolean flag; flag = true; try { f1.writeUTF(nombre); f1.writeInt(numControl); f1.writeInt(edad); f1.writeChar(sexo); System.out.println("Escribe en disco el registro...."); } catch( IOException e ) { System.out.println("Excepcion al escribir el registro....."); flag = false; } return flag; } public long desplazamiento( long n ) { return TAM*( n-1 ); } public boolean leerReg( RandomAccessFile flo ) throws EOFException { boolean flag; flag = true; try { nombre = flo.readUTF(); numControl = flo.readInt(); edad = flo.readInt(); sexo = flo.readChar(); } catch( EOFException e )
Educacin a Distancia

18

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

{ throw e; } catch( IOException e ) { System.out.println("Error al leer el registo...."); flag = false; } return flag; } }

import java.io.*; import java.util.Scanner; public class CreaAlumnoRandom { File af; RandomAccessFile arch; AlumnoRandom reg; //final int MAXREG = 1; public CreaAlumnoRandom() { try { af = new File ( "Alumnos.dat" ); arch = new RandomAccessFile ( af, "rw"); reg = new AlumnoRandom(); } catch( IOException e ) { System.out.println("No se puede escribir el archivo " + e.getMessage() ); System.exit(1); } } public long calculaPosicion( String nomb ) { long posicion = 0; for (int i = 0; i < nomb.length(); i++) { posicion = posicion +(int) nomb.charAt(i); }
Educacin a Distancia

19

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

return posicion; } public void procesoEntrada() { Scanner entrada = new Scanner( System.in ); try { int nc; boolean masRegistros = true; while ( masRegistros ) { System.out.println("Numero de control (0 para terminar): "); nc = entrada.nextInt(); if ( nc > 0 ) { reg.numControl = nc; System.out.println("\nNomnbre: "); reg.nombre = entrada.next(); System.out.println("\nEdad: "); reg.edad = entrada.nextInt(); System.out.println("\nSexo, Masculino (M) / Femenino (F): "); reg.sexo = entrada.next().charAt(0); arch.seek( reg.desplazamiento ( calculaPosicion( reg.nombre ) ) ); reg.addReg ( arch ); } masRegistros = ( nc > 0 ); } } catch( IOException e ) { System.out.println("Excepcion termina el proceso."); System.exit(1); } finally { System.out.println("Se cierra el flujo."); } try { arch.close();
Educacin a Distancia

20

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

} catch( IOException e ) { System.out.println("Error al cerrar el Flujo."); } } public static void main( String [] args ) { CreaAlumnoRandom pr = new CreaAlumnoRandom(); pr.procesoEntrada(); } }

import java.io.*; public class ConsultaAlumno { private RandomAccessFile archivo; private void mostrar( AlumnoRandom reg ) { System.out.println( reg.numControl + "\t"+ reg.nombre + "\t" + reg.edad + "\t" + reg.sexo); } public ConsultaAlumno ( File f ) throws IOException { if ( f.exists() ) { archivo = new RandomAccessFile( f, "r" ); System.out.println("Flujo abierto en flujo lectura."); } else { archivo = null; throw new IOException ( "El archivo NO existe" ); } } public void ConsultaGeneral() throws IOException { if ( archivo != null ) { try
Educacin a Distancia

21

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

{ int n; AlumnoRandom reg = new AlumnoRandom(); n = 0; while ( true ) { archivo.seek( reg.desplazamiento ( ++n ) ); if ( reg.leerReg( archivo ) ) if ( reg.numControl > 0 ) mostrar( reg ); } } catch( EOFException e ) { System.out.println("\nFin de archivo!!"); } } } public void consultaReg ( long nreg ) throws IOException { if ( archivo != null ) { AlumnoRandom reg = new AlumnoRandom();

if ( nreg > 0 && reg.desplazamiento( nreg ) < archivo.length() ) { archivo.seek( reg.desplazamiento( nreg ) ); if ( reg.leerReg( archivo ) ) if ( reg.numControl > 0 ) mostrar( reg ); else System.out.println("Registro = " + nreg + " no dado de Alta."); else throw new IOException( "Registro fuera de rango."); } } } }

import java.io.*; import java.util.Scanner;


Educacin a Distancia

22

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

public class Consultas { public static void main(String[] args) { File f = new File ("Alumnos.dat"); ConsultaAlumno consulta = null; int opc = 1; Scanner entrada = new Scanner ( System.in ); try { System.out.println("\nConsultas al archivo " + f.getName() ); consulta = new ConsultaAlumno ( f ); while ( opc != 3 ) { System.out.println("1. Muestra todos los registros."); System.out.println("2. Muestra un registro determinado."); System.out.println("3. Salir"); do { opc = entrada.nextInt(); } while ( ( opc < 1 ) || ( opc > 2 && opc != 3 ) ); if ( opc == 1 ) consulta.ConsultaGeneral(); else if ( opc == 2 ) { long nreg= 0; String nom; System.out.println("Nombre del alumno? "); nom=entrada.next(); for (int i = 0; i < nom.length(); i++) { nreg = nreg +(int) nom.charAt(i); } consulta.consultaReg(nreg); } }

Educacin a Distancia

23

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

} catch( IOException e ) { System.out.println("\nError en el proceso de consulta: " + e.getMessage() + " termina la aplicacion."); } } } Ejemplo 6 Escriba una clase, llamada EscribeAleatorio, que tendr por objetivo escribir en un archivo una secuencia de nmeros primos. El constructor de esta clase recibir por parmetro la cantidad de nmeros primos que se van calcular e imprimir. La generacin de los nmeros se har mediante el mtodo generaPrimos(). Una vez generados se guardaran en un arreglo llamado primos. Despues de invocar al mtodo generaPrimos() se deber crear una instancia de RandomAccesFile con modo de lectura y escritura. Mediante el mtodo writeln() se escribir la informacin en el archivo. Adicionalmente se deber escribir otra clase, llamada LeeAleatorio, que leer la mitad superior de los nmeros escritos en el archivo y los mostrara en la pantalla. import java.io.*; public class EscribeAleatorio { private int numPrimos; private int[] primos; EscribeAleatorio(int numPrimos) { this.numPrimos = numPrimos; primos = new int[numPrimos]; generaPrimos(numPrimos); try { RandomAccessFile archivoPrimos = new RandomAccessFile("C:/Documents and Settings/Lilia Del Carmen/Mis documentos/Primos.txt", "rw"); try { for (int i=0;i<numPrimos;i++) {
Educacin a Distancia

24

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

archivoPrimos.writeInt(primos[i]); } archivoPrimos.close(); } catch (IOException e) { System.out.println("Error escribiendo los datos o al cerrar el archivo"); } } catch (FileNotFoundException e) { System.out.println("Archivo no encontrado"); } } private void generaPrimos(int numPrimos) { primos[0] = 2; int primosHallados = 1; int posiblePrimo = 3; int indice=0; boolean primo = true; do { while (primo && (indice<primosHallados)) { if (posiblePrimo % primos[indice] == 0) primo = false; else indice++; } if (primo) { primos[primosHallados] = posiblePrimo; primosHallados++; } primo = true; posiblePrimo++; indice = 0; } while (primosHallados<numPrimos ); // while exterior

} // GeneraPrimos }
Educacin a Distancia

25

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

public class EscribeAleatorio100Primos { public static void main(String[] args) { EscribeAleatorio CienPrimos = new EscribeAleatorio(100); } }

import java.io.*; public class LeeAleatorio { public static void main(String[] args) { int primo; long longitudArchivo, puntero; try { RandomAccessFile archivoPrimos = new RandomAccessFile("C:/Documents and Settings/Lilia Del Carmen/Mis documentos/Primos.txt", "r"); try { longitudArchivo = archivoPrimos.length(); archivoPrimos.seek(longitudArchivo/2); puntero = archivoPrimos.getFilePointer(); while (puntero<longitudArchivo) { primo = archivoPrimos.readInt(); System.out.print(primo+" "); puntero = archivoPrimos.getFilePointer(); } archivoPrimos.close(); } catch (IOException e) { System.out.println("Error leyendo los datos o cerrando el archivo"); } } catch (FileNotFoundException e) { System.out.println("Archivo no encontrado"); } } }
Educacin a Distancia

26

Instituto Tecnolgico de Cd. Victoria

Programacin Orientada a Objetos

8.3 Aplicaciones Tarea: Tomando como base los ejemplos LeeArchivo.java y EscribeArchivo.java, en este ejemplo se implementara una aplicacin que lea un archivo, procese su contenido cambiando el texto por maysculas y muestre los resultados de este procesamiento en otro archivo de salida. La aplicacin deber contar con las siguientes clases: CopiaArchivo Esta ser una superclase que tendr por funcin recibir en su constructor los nombres de los archivos de entrada y de salida. Deber contar con un mtodo abstracto, llamado procesa(), que deber ser implementado por las clases que extiendan esta superclase. CopiaMayusculas Sera una subclase de CopiaArchivo e implementara el mtodo procesa(). La funcin de este mtodo ser cambiar el texto de entrada a maysculas. CopiaMayusculasPrincipal Esta ser la aplicacin. Creara un objeto de CopiaMayusculas iniciando la lectura, el procesamiento y la escritura en el constructor de la clase CopiaArchivo.

Educacin a Distancia

27

También podría gustarte