Está en la página 1de 19

MANEJO DE ARCHIVOS EN JAVA

HARRY ARANGO BUSTAMANTE


MAURICIO OLARTE CADAVID
JORGE EDUARDO QUIROZ

MATERIA: Programacin en Java


PROFESOR: Mario Jaramillo
FECHA: Agosto 11

UNIVERSIDAD DE ANTIOQUIA
FACULTAD DE INGENIERIA
DEPARTAMENTO DE INGENIERIA DE SISTEMAS
MEDELLIN
2000

CONTENIDO

INTRODUCCION
1. JERARQUIA DE DATOS 4
1.1 ARCHIVOS Y FLUJOS 4
1.2 BREVE DESCRIPCION DE ALGUNAS CLASES 6
2. ARCHIVOS DE ACCESO SECUENCIAL 9
2.1 CREACION DE UN ARCHIVO DE ACCESO SECUENCIAL 9
2.2 LECTURA DE DATOS DE UN ARCHIVO DE ACCESO SECUENCIAL 11
2.3 ACTUALIZACION DE ARCHIVOS DE ACCESO SECUENCIAL 13
3. ARCHIVOS DE ACCESO ALEATORIO 14
3.1 CREACION DE UN ARCHIVO DE ACCESO ALEATORIO 15
3.2 COMO ESCRIBIR DATOS ALEATORIAMENTE EN UN ARCHIVO DE
ACCESO ALEATORIO 17
3.3 CLASE FILE 17

INTRODUCCION

El 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 usan archivos para 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 como datos
persistentes. Las computadoras guardan los archivos en dispositivos de
almacenamiento secundario como 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 DATOS

Puesto 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 caracteres Unicode formados por 2
bytes). Los bytes por lo regular se componen de ocho bits.
As como los caracteres se componen de bits, los campos se componen de
caracteres. Un campo es un grupo de caracteres que comunica un significado.
Los elementos de informacin procesados por las computadoras forman
una jerarqua de datos en el que los elementos de informacin se hacen ms
grandes y con una estructura ms compleja.
Un registro (una clase en Java) se compone de varios campos (llamados
variables de ejemplar en Java). Un archivo es 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 como clave 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
denomina archivo secuencial, y en l los registros por lo regular se almacenan
en orden segn el campo clave del registro.
1.1 ARCHIVOS Y FLUJOS
Java considera los archivos simplemente como flujos secuenciales de bytes (ver
figura siguiente). Cada archivo termina con un marcador de fin de archivo o
bien en un nmero de byte especfico registrado en una estructura de datos
administrada y mantenida por el sistema. Cuando se abre un 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 paquete java.io.
Este paquete incluye las definiciones de las clases de flujos
como FileInputStream (para el flujo de entrada de un archivo)

y FileOutputStream (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 clases InputStream (flujo de entrada)
y OutputStream (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 clases DataInputStream (flujo de entrada de datos)
y DataOutputStream (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 CLASES
InputStream (una subclase de Object) y OutputStream (una subclase
de Object) 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 con FileInputStream (una subclase
de InputStream) y FileOutputStream (una subclase de OutputStream).
Los conductos o tubos (pipes) son canales de comunicacin sincronizados entre
hilos. Se establece un conducto entre dos hilos. Un hilo enva datos a otro
escribiendo en un objeto PipedOutputStream (flujo de salida entubado, una
subclase deOutputStream). El hilo objetivo lee informacin del conducto
mediante un PipedInputStream (flujo de entrada entubado, una subclase
de InputStream).
Usamos un PrintStream (flujo de impresin, una subclase de FilterOutStream)
para enviar salidas a la pantalla (o en la "salida estndar" definida por su
sistema operativo local).
FilterInputStream filtra un InputStream y un FilterOutStream filtra
un OutputStream; 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 un DataInputStream (una subclase
deFilterInputStream).
Las clases DataInputStream y la clase RandomAccessFile (archivo de acceso
aleatorio) implementan la interfaz DataInput (entrada de datos), pues la
necesitan para leer tipos de datos primitivos de un flujo.
Los DataInputStream permiten a un programa leer datos binarios de
un InputStream. Por lo regular, encadenaremos un DataInputStream a
un FileInputStream. La interfaz DataInput incluye los mtodos read (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) y SkipBytes (saltar bytes).
Las clases DataOutputStream (una subclase de FilterOutputStream) y la
clase RandomAccessFile implementan la interfaz DataOutput, pues la
necesitan para escribir tipos de datos primitivos en un OutputStream.
Los DataOutputStream permiten a un programa escribir datos binarios en
un OutputStream. Por lo regular, encadenaremos un DataOutputStream a
un FileOutputStream. La interfaz DataOutputStream incluye los
mtodos flush (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.
El almacenamiento temporal es una tcnica que mejora el rendimiento de E/S.
Con un BufferedOutputStream (flujo de salida con almacenamiento temporal,
una subclase de FilterOuputStream) 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
llamada buffer que tiene el tamao suficiente para contener los datos de muchas
operaciones de salida. Luego, la salida real al dispositivo de salida se realiza en

una operacin de salida fsica grande cada vez que se llena el buffer. Las
operaciones de salida dirigidas al buffer de salida en la memoria se conocen
como operaciones 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 un BufferedOutputStream, un buffer parcialmente lleno puede enviarse al
dispositivo en cualquier momento con una llamada explcita a flush (vaciar)
como la siguiente:
TestBufferedOutputStream.flush( );
Un PushBackInputStream (meter de vuelta en el flujo de entrada, una subclase
de FilterInputStream) se usa en aplicaciones que pocos usuarios necesitarn. En
esencia, la aplicacin que lee un PushBackInputStream lee 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. Los PushBackInputStream se usan en programas como los
compiladores que analizan sintcticamente sus entradas; es decir, las
descomponen en unidades significativas llamados unidades lexicogrficas
(tokens). El comportamiento de la clase StreamTokenizer es similar al de la
clase StringTokenizer.
Un RandomAccessFile (archivo de acceso aleatorio, una subclase de Object) es
til para aplicaciones de acceso directo, como las aplicaciones de
procesamiento de transacciones de las cuales los sistemas de reservaciones de
las lneas areas y los sistemas de punto de venta son ejemplos. Con un archivo
de acceso secuencial, cada solicitud de entrada/salida sucesiva lee o escribe el
siguiente conjunto de datos consecutivo del archivo. Con un archivo 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.

Un ByteArrayInputStream (flujo de entrada de arreglo de bytes, una subclase


de la clase abstractaInputStream) toma sus entradas de un arreglo de bytes en la
memoria. Un ByteArrayOutputStream (una subclase de la clase
abstracta OutputStream) enva sus salidas a un arreglo de bytes en la memoria.
Un StringBufferInputStream (una subclase de la clase abstracta InputStream)
recibe entradas de un objeto StringBuffer.
Un SequenceInputStream (flujo de entrada de secuencia, una subclase de la
clase abstracta InputStream) permite concatenar varios InputStream de modo
que el programa vea el grupo como un solo InputStream continuo. Al llegarse al
final de cada flujo de entrada, el flujo se cierra y se abre el siguiente flujo de la
secuencia.
Un LineNumberInputStream (flujo de entrada de nmeros de lnea, una
subclase de FilterInputStream) siempre conoce el nmero de la lnea del
archivo que se est leyendo.
La clase File (archivo) permite a los programas obtener informacin sobre un
archivo o un directorio.

2. ARCHIVOS DE ACCESO SECUENCIAL

2.1 CREACION DE UN ARCHIVO DE ACCESO SECUENCIAL


Java 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
flujos FileInputStream y FileOutputStream. Se pasa un argumento al
constructor del objeto: el nombre del archivo. Los archivos existentes que se
abren para salida se truncan, 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
un DataOutputStream conectado a un FileOutputStream mediante una tcnica
denominada encadenamiento de objetos de flujo. Por ejemplo, cuando se cree
el objeto output de la claseDataOutputStream, se proporcionar a su
constructor un objeto FileOutputStream como argumento, como se muestra a
continuacin:
salida = new DataOutputStream(
new FileOutputStream("clientes.dat") );

El enunciado anterior crea un


objeto DataOutputStream llamado salida asociado al archivo clientes.dat. El
argumento "clientes.dat" se pasa al constructor FileOutputStream que abre el
archivo. Esto establece una "lnea de comunicacin" con el archivo.
Al crear un objeto FileOutputStream e 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 un IOException es 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
mtodo exit (salir) de la claseSystem para terminar el programa. El argumento
de exit se 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 por exit es 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 botn Guardar para escribir el registro en el archivo. Esto invoca
al mtodoagregarRegistro para que efecte la operacin de escritura. En este
mtodo, cada campo del registro se escribe individualmente con llamadas a los
mtodos writeInt (escribir un valor entero), writeUTF (escribir una cadena)
y writeDouble (escribir un valor de doble precisin) de la
clase DataOutputStream. El usuario hace clic en el botn Terminar para
informar al programa que no hay ms datos que procesar.
Una vez que el usuario hace clic en el botn Terminar, 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 objeto FileOutputStream empleando el mtodo close (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 SECUENCIAL


Los datos se almacenan en archivos con el fin de poderlos recuperar para
procesarlos cuando sea necesario.
Los archivos se abren para entrada creando un objeto FileInputStream. El
nombre del archivo que se desea abrir se pasa como argumento al
constructor FileInputStream. Los datos deben leerse del archivo en el mismo
formato en que se escribieron en l. Por tanto, se usa
un DataInputStream encadenado a un FileInputStream como se muestra a
continuacin:
entrada = new DataInputStream(
new FileInputStream("clientes.dat") );
El enunciado anterior crea un
objeto DataInputStream llamado entrada asociado el archivo clientes.dat. El
argumento "clientes.dat" se pasa al constructor FileInputStream que abre el
archivo. Esto establece una "lnea de comunicacin" con el archivo.
Cuando se crea un objeto FileInputStream y 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 un IOException que 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 mtodo leerRegistro. 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 asigne false al
indicador masRegistros. 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, codigo tiene el valor
100, nombre (nombre de pila) tiene el valor "Bruno", apellido tiene el
valor "Jara" y saldo tiene el valor 29.48. Cada vez que se ejecuta el cdigo
anterior, se lee otro registro del archivo y se coloca en las variables codigo,
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
indicador masRegistros es false y el usuario hace clic en "Siguiente"), el archivo
se cierra invocando el mtodo aseo que llama al mtodo close para el
objeto DataInputStream entrada. El programa termina con una llamada al
mtodo exit de la clase System.
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 el apuntador a la posicin en el archivo (el nmero de byte del
siguiente byte del archivo que se leer o escribir) en un FileInputStream o
un FileOutputStream para la siguiente operacin de entrada o salida. Por tanto,
un objeto FileOutputStream slo puede reubicarse al principio del archivo
cerrando el archivo y volvindolo a abrir.

2.3 ACTUALIZACION DE ARCHIVOS DE ACCESO SECUENCIAL


Los 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 ALEATORIO

Los archivos de acceso secuencial que acabamos de ver no son apropiados para
las llamadas aplicaciones 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 con archivos
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 ALEATORIO


Los 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 mtodo write que enva a la salida un registro de
informacin del objeto RandomAccessFile que se le enva como argumento.
Este mtodo usa el mtodo writeInt para escribir el nmero de cdula, el
mtodo writeUTF para escribir el nombre de la persona y su profesin, y
usa writeShort para escribir la edad.
El mtodo read introduce un registro de informacin del
objeto RandomAccesFile que se pasa como argumento al mtodo. Se usan los

mtodos readInt y readShort para introducir el nmero de la cdula y la edad,


y readUTF para leer el nombre y la profesin.
El mtodo size (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
constructor RandomAccessFile: 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 un IOException durante el proceso
de apertura, el programa terminar.

3.2 COMO ESCRIBIR DATOS ALEATORIAMENTE EN UN ARCHIVO


DE
ACCESO ALEATORIO
Una vez abierto el programa en modo "rw" podemos usar mtodos
de RandomAccesFile para escribir los datos en el archivo. Mtodos
como seek nos 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 FILE
La 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 objeto File es verificar que un archivo existe.
Un objeto File se inicializa con uno de tres constructores. El constructor
public File( String name )
almacena el argumento String nombre en 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 constructor
public File ( File directorio, String nombre )
utiliza el objeto FileDirectorio (una trayectoria absoluta o relativa) previamente
creado para localizar el archivo o directorio especificado por nombre.

También podría gustarte