Manejo de Archivos en Java
Manejo de Archivos en Java
Manejo de Archivos en Java
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
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)
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.
salida.close( );
o bien, el archivo se cerrar implcitamente cuando Java recolecte el objeto como
basura.
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.
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
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.