manejo de archivos en java

25
MANEJO DE ARCHIVOS EN JAVA HARRY ARANGO BUSTAMANTE MAURICIO OLARTE CADAVID JORGE EDUARDO QUIROZ MATERIA: Programación en Java PROFESOR: Mario Jaramillo FECHA: Agosto 11 UNIVERSIDAD DE ANTIOQUIA FACULTAD DE INGENIERIA DEPARTAMENTO DE INGENIERIA DE SISTEMAS MEDELLIN 2000

Upload: elidethagui123

Post on 18-Dec-2015

9 views

Category:

Documents


1 download

DESCRIPTION

archivos java

TRANSCRIPT

MANEJO DE ARCHIVOS EN JAVAHARRY ARANGO BUSTAMANTEMAURICIO OLARTE CADAVIDJORGE EDUARDO QUIROZMATERIA: Programacin en JavaPROFESOR: Mario JaramilloFECHA: Agosto 11UNIVERSIDAD DE ANTIOQUIAFACULTAD DE INGENIERIADEPARTAMENTO DE INGENIERIA DE SISTEMASMEDELLIN2000CONTENIDOINTRODUCCION1. JERARQUIA DE DATOS 41.1 ARCHIVOS Y FLUJOS 41.2 BREVE DESCRIPCION DE ALGUNAS CLASES 62. ARCHIVOS DE ACCESO SECUENCIAL 92.1 CREACION DE UN ARCHIVO DE ACCESO SECUENCIAL 92.2 LECTURA DE DATOS DE UN ARCHIVO DE ACCESO SECUENCIAL 112.3 ACTUALIZACION DE ARCHIVOS DE ACCESO SECUENCIAL 133. ARCHIVOS DE ACCESO ALEATORIO 143.1 CREACION DE UN ARCHIVO DE ACCESO ALEATORIO 153.2 COMO ESCRIBIR DATOS ALEATORIAMENTE EN UN ARCHIVO DEACCESO ALEATORIO 173.3 CLASE FILE 17INTRODUCCIONEl almacenamiento de datos en variables y arreglos es temporal; los datos se pierden cuando una variable local "sale de su alcance" o cuando el programa termina, por ejemplo. Se usanarchivospara conservar a largo plazo grandes cantidades de datos, incluso despus de que el programa que cre los datos ha terminado. Los datos mantenidos en archivos se conocen comodatos persistentes. Las computadoras guardan los archivos endispositivos de almacenamiento secundariocomo discos magnticos, discos pticos y cintas magnticas.En este trabajo explicaremos cmo se crean, actualizan y procesan archivos mediante programas en Java. Veremos los archivos tanto de"acceso secuencial"como de"acceso aleatorio"e indicaremos los tipos de aplicaciones para las que es apropiado cada tipo.El procesamiento de archivos es una de las capacidades ms importantes que un lenguaje debe tener para apoyar aplicaciones comerciales que suelen procesar enormes cantidades de datos persistentes.1. LA JERARQUIA DE DATOSPuesto que las computadoras slo pueden procesar ceros y unos, cada carcter del conjunto de caracteres de una computadora se representa como un patrn de ceros y unos (los caracteres en Java son caracteresUnicodeformados por 2 bytes). Los bytes por lo regular se componen de ocho bits.As como los caracteres se componen de bits, loscamposse componen de caracteres. Un campo es un grupo de caracteres que comunica un significado.Los elementos de informacin procesados por las computadoras forman unajerarqua de datosen el que los elementos de informacin se hacen ms grandes y con una estructura ms compleja.Unregistro(una clase en Java) se compone de varios campos (llamados variables de ejemplar en Java). Unarchivoes un grupo de registros relacionados entre s.Para facilitar la recuperacin de registros especficos de un archivo, se escoge por lo menos un campo de cada registro comoclave de registro. Una clave de registro identifica un registro como perteneciente a una persona o entidad en particular y distinto de todos los dems registros del archivo.La forma ms comn de organizar los registros en un archivo se denominaarchivo secuencial, y en l los registros por lo regular se almacenan en orden segn el campo clave del registro.1.1 ARCHIVOS Y FLUJOSJava considera los archivos simplemente como flujos secuenciales de bytes (ver figura siguiente). Cada archivo termina con unmarcador de fin de archivoo bien en un nmero de byte especfico registrado en una estructura de datos administrada y mantenida por el sistema. Cuando seabreun archivo, se crea un objeto y se asocia un flujo (stream) a dicho objeto. Cuando comenzamos a ejecutar una aplicacin o un applet de Java, se crean automticamente tres objetos de flujo:System.in, System.out y System.err. Los flujos asociados a estos objetos proporcionan canales de comunicacin entre un programa y un archivo o dispositivo en particular.Si queremos procesar archivos en Java necesitamos importar el paquetejava.io. Este paquete incluye las definiciones de las clases de flujos comoFileInputStream(para el flujo de entrada de un archivo) yFileOutputStream(para el flujo de salida a un archivo). Los archivos se abren creando objetos de estas clases de flujos que se derivan de (es decir, heredan la funcionalidad de) las clasesInputStream(flujo de entrada) yOutputStream(flujo de salida), respectivamente. As, todos los mtodos de estas clases de flujos se pueden aplicar tambin a los flujos de archivos. Para realizar operaciones de entrada y salida de tipos de datos primitivos, se usarn objetos de las clasesDataInputStream(flujo de entrada de datos) yDataOutputStream(flujo de salida de datos) junto con las clases de flujos de archivos.Ya que Java ofrece muchas clases para realizar operaciones de entrada/salida, en este trabajo haremos una breve resea de algunas y explicaremos cmo se relacionan entre s. En el desarrollo mostraremos como poner a funcionar varias clases de flujos al implementar en pequeos trozos de cdigo, diversos programas de procesamiento de archivos que crean y manipulan archivos de acceso secuencial y archivos de acceso aleatorio.1.2 BREVE DESCRIPCION DE ALGUNAS CLASESInputStream(una subclase deObject) yOutputStream(una subclase deObject) son clases abstractas que definen mtodos para realizar operaciones de entrada y salida, respectivamente; sus clases derivadas supeditan estos mtodos.La entrada/salida de archivos se efecta conFileInputStream(una subclase deInputStream) yFileOutputStream(una subclase deOutputStream).Losconductosotubos (pipes)son canales de comunicacin sincronizados entre hilos. Se establece un conducto entre dos hilos. Un hilo enva datos a otro escribiendo en un objetoPipedOutputStream(flujo de salida entubado, una subclase deOutputStream). El hilo objetivo lee informacin del conducto mediante unPipedInputStream(flujo de entrada entubado, una subclase deInputStream).Usamos unPrintStream(flujo de impresin, una subclase deFilterOutStream) para enviar salidas a la pantalla (o en la"salida estndar"definida por su sistema operativo local).FilterInputStreamfiltra unInputStreamy unFilterOutStreamfiltra unOutputStream; el trmino filtrar simplemente significa que el flujo tiene una funcionalidad adicional, como almacenar datos temporalmente, llevar la cuenta de los nmeros de lnea o combinar los bytes de datos en unidades significativas de datos primitivos.Leer los datos como bytes en bruto es rpido pero burdo. Por lo regular los programas desean leer los datos como agregados de bytes que forman un int, un float, un double, etc. Para lograr esto usamos unDataInputStream(una subclase deFilterInputStream).Las clasesDataInputStreamy la claseRandomAccessFile(archivo de acceso aleatorio) implementan la interfazDataInput(entrada de datos), pues la necesitan para leer tipos de datos primitivos de un flujo. LosDataInputStreampermiten a un programa leer datos binarios de unInputStream. Por lo regular, encadenaremos unDataInputStreama unFileInputStream. La interfazDataInputincluye los mtodosread(leer, para arreglos de bytes),readBoolean, readByte, readChar, readDouble, readFloat, readFully(leer plenamente, para arreglos de bytes),readInt, readLine(leer lnea),readLong, readShort, readUnsignedByte(leer byte sin signo),readUnsignedShort(leer entero corto sin signo),readUTF(para cadenas en formato Unicode) ySkipBytes(saltar bytes).Las clasesDataOutputStream(una subclase deFilterOutputStream) y la claseRandomAccessFileimplementan la interfazDataOutput, pues la necesitan para escribir tipos de datos primitivos en unOutputStream. LosDataOutputStreampermiten a un programa escribir datos binarios en unOutputStream. Por lo regular, encadenaremos unDataOutputStreama unFileOutputStream. La interfazDataOutputStreamincluye los mtodosflush(vaciar),size(tamao),write(escribir, para un byte),write(para un arreglo de bytes),writeBoolean, writeByte, writeBytes, writeChar, writeChars(para objetos String de Unicode),writeDouble, writeFloat, writeInt, writeLong, writeShort y writeUTF.Elalmacenamiento temporales una tcnica que mejora el rendimiento de E/S. Con unBufferedOutputStream(flujo de salida con almacenamiento temporal, una subclase deFilterOuputStream) cada enunciado de salida no causa necesariamente una transferencia fsica real de datos al dispositivo de salida. Ms bien, cada operacin de salida se dirige a una regin de la memoria llamadabufferque tiene el tamao suficiente para contener los datos de muchas operaciones de salida. Luego, la salida real al dispositivo de salida se realiza en unaoperacin de salida fsicagrande cada vez que se llena elbuffer. Las operaciones de salida dirigidas albufferde salida en la memoria se conocen comooperaciones de salida lgica.Dado que las operaciones de salida fsica por lo general son extremadamente lentas en comparacin con las velocidades normales de los procesadores, el almacenamiento temporal de las salidas mejora el rendimiento en comparacin con las salidas sin almacenamiento temporal.Con unBufferedOutputStream, unbufferparcialmente lleno puede enviarse al dispositivo en cualquier momento con una llamada explcita aflush(vaciar) como la siguiente:TestBufferedOutputStream.flush( );UnPushBackInputStream(meter de vuelta en el flujo de entrada, una subclase deFilterInputStream) se usa en aplicaciones que pocos usuarios necesitarn. En esencia, la aplicacin que lee unPushBackInputStreamlee bytes del flujo y forma agregados compuestos por varios bytes. A veces, para determinar si un agregado est completo o no, la aplicacin necesita leer el primer carcter despus del final del agregado actual. Una vez que el programa ha determinado que el agregado actual est completo, el carcter adicional se"mete de vuelta"al flujo. LosPushBackInputStreamse usan en programas como los compiladores queanalizan sintcticamentesus entradas; es decir, las descomponen en unidades significativas llamadosunidades lexicogrficas (tokens). El comportamiento de la claseStreamTokenizeres similar al de la claseStringTokenizer.UnRandomAccessFile(archivo de acceso aleatorio, una subclase deObject) es til paraaplicaciones de acceso directo, como lasaplicaciones de procesamiento de transaccionesde las cuales los sistemas de reservaciones de las lneas areas y los sistemas de punto de venta son ejemplos. Con unarchivo de acceso secuencial, cada solicitud de entrada/salida sucesiva lee o escribe el siguiente conjunto de datos consecutivo del archivo. Con unarchivo de acceso aleatorio, cada solicitud de entrada/salida sucesiva puede dirigirse a cualquier parte del archivo. Estas aplicaciones de acceso directo ofrecen acceso rpido a elementos de informacin especfica de archivos grandes.La E/S de flujos de Java incluye capacidades para recibir entradas de arreglos de bytes en la memoria y enviar salidas a arreglos de bytes en la memoria. UnByteArrayInputStream(flujo de entrada de arreglo de bytes, una subclase de la clase abstractaInputStream) toma sus entradas de un arreglo de bytes en la memoria. UnByteArrayOutputStream(una subclase de la clase abstractaOutputStream) enva sus salidas a un arreglo de bytes en la memoria.UnStringBufferInputStream(una subclase de la clase abstractaInputStream) recibe entradas de un objetoStringBuffer.UnSequenceInputStream(flujo de entrada de secuencia, una subclase de la clase abstractaInputStream) permite concatenar variosInputStreamde modo que el programa vea el grupo como un soloInputStreamcontinuo. Al llegarse al final de cada flujo de entrada, el flujo se cierra y se abre el siguiente flujo de la secuencia.UnLineNumberInputStream(flujo de entrada de nmeros de lnea, una subclase deFilterInputStream) siempre conoce el nmero de la lnea del archivo que se est leyendo.La claseFile(archivo) permite a los programas obtener informacin sobre un archivo o un directorio.2. ARCHIVOS DE ACCESO SECUENCIAL2.1 CREACION DE UN ARCHIVO DE ACCESO SECUENCIALJava no obliga a los archivos a tener una estructura; por tanto, conceptos tales como"registro"no existen en los archivos Java. Esto significa que los programadores deben estructurar los archivos a modo de satisfacer las necesidades de las aplicaciones.Como se dijo antes, los archivos se abren creando objetos de las clases de flujosFileInputStreamyFileOutputStream.Se pasa un argumento al constructor del objeto:el nombre del archivo. Los archivos existentes que se abren para salida setruncan, es decir, se desechan todos los datos del archivo. Si el archivo especificado todava no existe, se crea un archivo con ese nombre.Como un ejemplo, enviaremos datos a la salida usando unDataOutputStreamconectado a unFileOutputStreammediante una tcnica denominadaencadenamiento de objetos de flujo. Por ejemplo, cuando se cree el objetooutputde la claseDataOutputStream, se proporcionar a su constructor un objetoFileOutputStreamcomo argumento, como se muestra a continuacin:salida= new DataOutputStream(new FileOutputStream("clientes.dat") );El enunciado anterior crea un objetoDataOutputStreamllamadosalidaasociado al archivoclientes.dat. El argumento"clientes.dat"se pasa al constructorFileOutputStreamque abre el archivo. Esto establece una "lnea de comunicacin" con el archivo.Al crear un objetoFileOutputStreame intentar abrir un archivo, se puede definir en un programa un mtodo que pruebe si la operacin de apertura tuvo o no xito. Si la operacin falla, se genera una excepcin de E/S (IOException) que debe ser atrapada por el programa, como se muestra a continuacin:try {salida = new DataOutputStream(new FileOutputStream( "clientes.dat" ) );}catch ( IOException e ) {System.err.println( "No abri bien el archivo\n" +e.toString( ) );System.exit( 1 );}Si se genera unIOExceptiones porque el intento de abrir el archivo no tuvo xito, se exhibe el mensaje de error"No se abri bien el archivo"seguido del mensaje de error contenido en el objeto de excepcin, y se invoca el mtodoexit(salir) de la claseSystempara terminar el programa. El argumento deexitse devuelve al entorno desde el cual se invoc el programa. Un argumento de 0 indica que el programa termin normalmente; cualquier otro valor indica que el programa termin a causa de error. El valor utilizado porexites utilizado por el entorno invocador (con toda probabilidad el sistema operativo) para responder de forma apropiada al error. Algunas razones de que se lance un IOException al abrir archivos son intentar abrir para lectura un archivo que no existe, intentar abrir un archivo para lectura sin tener permiso y abrir un archivo para escritura cuando no hay espacio en disco.A continuacin mostramos la ventana principal de un programa que captura la siguiente informacin:El programa supone que los datos se introducen correctamente y en el orden correcto por nmero de registro. Cada vez que se completa un registro, el usuario hace clic en el botnGuardarpara escribir el registro en el archivo. Esto invoca al mtodoagregarRegistropara que efecte la operacin de escritura. En este mtodo, cada campo del registro se escribe individualmente con llamadas a los mtodoswriteInt(escribir un valor entero),writeUTF(escribir una cadena) ywriteDouble(escribir un valor de doble precisin) de la claseDataOutputStream. El usuario hace clic en el botnTerminarpara informar al programa que no hay ms datos que procesar.Una vez que el usuario hace clic en el botnTerminar, el programa termina. Sin embargo, antes de terminar el programa determina si hay algn registro que escribir en disco, vaca el flujo de salida para asegurarse de que todos se hayan enviado al archivo y cierra el flujo de salida. El programador puede cerrar explcitamente un objetoFileOutputStreamempleando el mtodoclose(cerrar) como sigue:salida.close( );o bien, el archivo se cerrar implcitamente cuando Java recolecte el objeto como basura.2.2 LECTURA DE DATOS DE UN ARCHIVO DE ACCESO SECUENCIALLos datos se almacenan en archivos con el fin de poderlos recuperar para procesarlos cuando sea necesario.Los archivos se abren para entrada creando un objetoFileInputStream. El nombre del archivo que se desea abrir se pasa como argumento al constructorFileInputStream. Los datos deben leerse del archivo en el mismo formato en que se escribieron en l. Por tanto, se usa unDataInputStreamencadenado a unFileInputStreamcomo se muestra a continuacin:entrada = new DataInputStream(new FileInputStream("clientes.dat") );El enunciado anterior crea un objetoDataInputStreamllamadoentradaasociado el archivo clientes.dat. El argumento"clientes.dat"se pasa al constructorFileInputStreamque abre el archivo. Esto establece una "lnea de comunicacin" con el archivo.Cuando se crea un objetoFileInputStreamy se intenta abrir un archivo, es conveniente manejar la operacin de apertura para controlar si se tuvo xito o no. Si la operacin falla, se genera unIOExceptionque debe ser atrapado como se muestra a continuacin:try {entrada = new DataInputStream(new FileInputStream("clientes.dat"));}catch (IOException e) {System.err.println("No se abri bien el archivo\n" +e.toString() );System.exit(1);}El programa leer un registro cada vez que el usuario haga clic en el botn "Siguiente". Esta accin har que se invoque el mtodoleerRegistro.Las lneas:codigo = input.readInt( );nombre = input.readUTF( );apellido = input.readUTF( );saldo = input.readDouble( );leen un registro de informacin del archivo. Si se llega a la marca de fin de archivo durante la lectura, se lanza una excepcin de fin de archivo (EndOfFileException), y sta hace que se asignefalseal indicadormasRegistros. Si el usuario intenta leer otro registro haciendo clic en el botn"Siguiente", el programa terminar.Despus de ejecutarse por primera vez el cdigo anterior,codigotiene el valor 100,nombre(nombre de pila) tiene el valor"Bruno",apellidotiene el valor"Jara"ysaldotiene el valor 29.48. Cada vez que se ejecuta el cdigo anterior, se lee otro registro del archivo y se coloca en las variablescodigo, nombre, apellido y saldo. Los registros se exhiben en campos de texto con las siguientes lneas:cod.setText( String.valueOf (codigo) );fnombre.setText(String.valueOf(nombre) );fapellido.setText(StringvalueOf(apellido) );sal.setText(StringvalueOf(saldo) );Si el usuario hace clic en el botn "Terminar" (o el indicadormasRegistrosesfalsey el usuario hace clic en "Siguiente"), el archivo se cierra invocando el mtodoaseoque llama al mtodoclosepara el objetoDataInputStream entrada.El programa termina con una llamada al mtodoexitde la claseSystem.Para recuperar datos secuencialmente de un archivo, los programas normalmente comienzan a leer desde el principio del archivo, y leen todos los datos consecutivamente hasta hallar los datos deseados. Puede ser necesario procesar el archivo secuencialmente varias veces (desde el principio del archivo) durante la ejecucin de un programa. Actualmente, Java no cuenta con un mtodo para reubicar elapuntador a la posicin en el archivo(el nmero de byte del siguiente byte del archivo que se leer o escribir) en unFileInputStreamo unFileOutputStreampara la siguiente operacin de entrada o salida. Por tanto, un objetoFileOutputStreamslo puede reubicarse al principio del archivo cerrando el archivo y volvindolo a abrir.2.3 ACTUALIZACION DE ARCHIVOS DE ACCESO SECUENCIALLos datos que se formatean y escriben en archivos de acceso secuencial no pueden modificarse sin leer y escribir todos los datos del archivo. Por ejemplo, si fuera necesario cambiar el nombre"Varela"a"Velsquez", el nombre antiguo no podra simplemente sobrescribirse.3.ARCHIVOS DE ACCESO ALEATORIOLos archivos de acceso secuencial que acabamos de ver no son apropiados para las llamadasaplicaciones de "acceso instantneo", como por ejemplo los sistemas de reservaciones de las aerolneas, los sistemas bancarios, los cajeros automticos, etc., en las que es preciso localizar de inmediato un registro de informacin en particular. Este tipo de acceso instantneo es posible conarchivos de acceso aleatorio.Podemos acceder de forma directa y rpida a los registros de un archivo de acceso aleatorio sin tener que examinar otros registros.Java no impone estructura alguna a los archivos, as que la aplicacin que desee usar archivos deber crearlos. Podemos usar varias tcnicas para crear archivos de acceso aleatorio. Tal vez la ms sencilla sea exigir que todos los registros del archivo sean de longitud fija, ya que esto permite que un programa calcule con facilidad (en funcin del tamao del registro y su clave) la posicin exacta en cualquier registro relativa al principio del archivo.La figura ilustra cmo Java ve un archivo de acceso aleatorio compuesto por registros de tamao fijo (cada registro tiene 100 bytes de longitud).Podemos insertar datos en un archivo de acceso aleatorio sin destruir los dems datos del archivo. Los datos almacenados previamente tambin pueden actualizarse o eliminarse sin tener que reescribir todo el archivo.3.1 CREACION DE UN ARCHIVO DE ACCESO ALEATORIOLos objetos RandomAccessFile (archivo de acceso aleatorio) tienen todas las capacidades de los objetos DataInputStream y DataOuputStream que vimos en la secciones anteriores. Cuando se asocia un flujo RandomAccesFile a un archivo, los datos se leen o escriben a partir del punto en el archivo especificado por el apuntador de posicin en el archivo, y todos los datos se leen o escriben como tipos de datos primitivos. Al escribir un valor int, se envan cuatro bytes al archivo. A leer un valor double, se introducen ocho bytes del archivo. El tamao de los diversos tipos de datos esta garantizado porque Java tiene tamaos fijos para todos los tipos de datos primitivos, sea cual fuere la plataforma.Los programas de procesamiento de acceso aleatorio casi nunca escriben un solo campo en un archivo. Lo normal es que escriban un objeto a la vez, como lo mostraremos en el siguiente ejemplo que son pequeas partes del cdigo del programa para manejo de archivos entregado con este trabajo.public class Registro { private StringBuffer cNombre; private short nEdad; private int nCedula; private StringBuffer cProfesion; /**Constructor por defecto*/ public Registro(){ cNombre = new StringBuffer(50); cProfesion = new StringBuffer(50);}/**Mtodo que lee informacin desde el archivo de datos*/public void leer(RandomAccessFile archivo) throws IOException{setNombre(archivo.readUTF());nEdad = archivo.readShort();nCedula = archivo.readInt();setProfesion(archivo.readUTF());}/**Mtodo que escribe informacin en el archivo de datos*/public void escribir(RandomAccessFile archivo) throws IOException{archivo.writeUTF(cNombre.toString());archivo.writeShort(nEdad);archivo.writeInt(nCedula);archivo.writeUTF(cProfesion.toString());}En este ejemplo aparece el mtodowriteque enva a la salida un registro de informacin del objetoRandomAccessFileque se le enva como argumento. Este mtodo usa el mtodowriteIntpara escribir el nmero de cdula, el mtodowriteUTFpara escribir el nombre de la persona y su profesin, y usawriteShortpara escribir la edad.El mtodoreadintroduce un registro de informacin del objetoRandomAccesFileque se pasa como argumento al mtodo. Se usan los mtodosreadInt y readShortpara introducir el nmero de la cdula y la edad, yreadUTFpara leer el nombre y la profesin.El mtodosize(no mostrado en el ejemplo) devuelve el tamao del registro en bytes.Hay dos posibilidades para abrir un fichero de acceso aleatorio:Con el nombre del fichero:miRAFile = new RandomAccessFile( String nombre, String modo );Con un objeto File:miRAFile = new RandomAccessFile( File fichero,String modo );El argumento modo determina si se tiene acceso de slo lectura (r) o de lectura/escritura (r/w). Por ejemplo, se puede abrir un fichero de una base de datos para actualizacin:RandomAccessFile miRAFile;miRAFile = new RandomAccessFile( "/tmp/kk.dbf","rw" );El siguiente ejemplo es un fragmento de cdigo que ilustra la apertura de un archivo de acceso aleatorio./**Crea el archivo en el que se guardar la informacin obtenida con Maestro.class*/public void crearArchivoMaestro(String strNombreDelArchivo){registro = new Registro();try {archivoMaestro = new RandomAccessFile(strNombreDelArchivo,"rw");} catch(IOException e){System.err.println("No se abri el archivo\n" + e.toString());setVisible(false);dispose();System.exit(0);}}Este fragmento del programa Maestro (incluido en el trabajo) intenta abrir el archivo strNombredelArchivo. Se pasan los argumentos al constructorRandomAccessFile: el nombre del archivo y el modo de apertura del archivo, que puede ser"r"si se desea abrir el archivo para lectura, o bien"rw"para lectura y escritura. Si ocurre unIOExceptiondurante el proceso de apertura, el programa terminar.3.2 COMO ESCRIBIR DATOS ALEATORIAMENTE EN UN ARCHIVO DEACCESO ALEATORIOUna vez abierto el programa en modo"rw" podemos usar mtodos deRandomAccesFilepara escribir los datos en el archivo. Mtodos comoseeknos permite determinar la posicin exacta del archivo en la que esta almacenado un registro de informacin. El mtodo seek establece el apuntador de posicin en el archivo en una posicin especfica relativa al principio del archivo, y el mtodo write de la clase Registro enva los datos a la salida.En el fragmento de cdigo siguiente apreciamos nuevamente el mtodo de escritura en el archivo usado en el programa adjunto a este trabajo./**Mtodo que escribe informacin en el archivo de datos*/public void escribir(RandomAccessFile archivo) throws IOException{archivo.writeUTF(cNombre.toString());archivo.writeShort(nEdad);archivo.writeInt(nCedula);archivo.writeUTF(cProfesion.toString());}Una vez el usuario termina de ingresar todos los datos al archivo y hace clic en registrar inmediatamente se ejecuta el mtodo Registro.escribir, que es el que acabamos de ver. Se usa el mtodo archivo.writeUTF para llevar al registro el nombre y la profesin, y se usa el mtodo archivo.writeShort y archivo.writeInt para llevar la edad y la cdula respectivamente.3.3 CLASE FILELa clase File es de gran utilidad para recuperar del disco informacin acerca de un archivo o un directorio. Los objetos de la clase file no abren realmente un archivo ni ofrecen funciones de procesamiento de archivos. Un ejemplo del uso de un objetoFilees verificar que un archivo existe.Un objeto File se inicializa con uno de tres constructores. El constructorpublic File( String name )almacena el argumentoString nombreen el objeto. El nombre puede contener informacin de trayectoria adems de un nombre de archivo o de directorio. La trayectoria incluye algunos o todos los directorios, comenzando con el directorio raz, que conducen a un directorio especfico.El constructorpublic File( File directorio, String nombre )utiliza el objetoFileDirectorio(una trayectoria absoluta o relativa) previamente creado para localizar el archivo o directorio especificado por nombre.