Professional Documents
Culture Documents
Fichadeclasenmero:10
Fecha: Semanadel11/05al15/05de2009
Docente: Ing.ValerioFrittelli
1.) Introduccin.
En muchos casos una aplicacin de gestin debe poder abrir un archivo del cual se sabe
que contiene registros o datos estructurados en alguna forma, pero sin saber cul es la
estructura del registro: ni el programador ni el programa saben cuntos campos hay en cada
registro, cmo se llama cada campo, de qu tipo son, cul es la longitud de cada uno (si se
aplica este concepto), etc.
Es claro que los datos que constituyen la estructura del registro son datos acerca de los
datos reales que contiene el archivo, y se designa con el nombre de metadatos a esos datos
acerca de los datos.
Un archivo...
legajo 20 12 34 23
nombre Juan Ana Pedro Luis
sueldo 734.45 994.25 831.50 824.23
Datos
Metadatos
Tambin es claro que si una aplicacin debe abrir un archivo de registros (o una tabla de
una base de datos), ese archivo o tabla debe tener grabados sus metadatos en alguna parte para
guiar a la aplicacin en la forma de interpretar los datos que contiene. Lo tpico es que esos
metadatos se almacenen en el mismo archivo, al principio del mismo. As, el archivo
contendra dos secciones: la cabecera del archivo contendra los metadatos, y la seccin de
datos contendra los datos reales.
Las aplicaciones que crean los archivos son las encargadas de almacenar esos metadatos
en el archivo. El formato que se sigue tambin depende de la aplicacin, aunque existen
muchos estndares. Uno de los ms conocidos es el formato dbf o estndar dbf, que se impuso
a partir de la aparicin del gestor Dbase II (de Ashton Tate). Veremos con ms detalle este
formato en esta misma Ficha de clase, ms adelante.
1
UTN Crdoba Ingenieria en Sistemas de Informacin
import java.io.*;
public class Campo
{
private String nombre; // se asumiran no mas de 20 caracteres por nombre
private int tipo; // 0: integer - 1: real - 2: cadena
private int cantidad; // solo para cadenas!!!
private boolean esclave;
public Campo ()
{
}
public Campo (String nom, int tip, int cant, boolean es)
{
nombre = nom;
tipo = tip;
cantidad = cant;
esclave = es;
}
2
UTN Crdoba Ingenieria en Sistemas de Informacin
{
nombre = x.nombre;
tipo = x.tipo;
cantidad = x.cantidad;
esclave = x.esclave;
}
Se cuenta tambin con una clase Archivo, que representa un archivo de registros con
metadatos, aunque sin entrar en tanto detalle como lo realizado en el framework de
RegisterFile: slo se pretende mostrar un ejemplo simple de uso de metadatos en un archivo:
import java.io.*;
import java.util.*;
public class Archivo
{
private Campo campos;
private String nombreGeneral;
private File descArch;
private RandomAccessFile maestro;
private long iniDatos; // direccin de inicio del rea de datos en el archivo
private Campo []fields; //arreglo para guardar los metadatos
public Archivo()
{
// asumo que "nombre" viene sin extension...
this ("tabla");
}
3
UTN Crdoba Ingenieria en Sistemas de Informacin
{
return iniDatos;
}
public void grabarMetaDato (Campo cm) throws IOException
{
cm.fWrite(maestro);
}
iniDatos = maestro.getFilePointer();
}
4
UTN Crdoba Ingenieria en Sistemas de Informacin
public static final String readString (RandomAccessFile arch, int tam)throws IOException
{
char vector[] = new char[tam];
for(int i = 0; i<tam; i++)
{
vector[i] = arch.readChar();
}
String cad = new String(vector,0,tam);
return cad;
}
public static final void writeString (RandomAccessFile arch, String cad, int tam)
throws IOException
{
int i;
char vector[] = new char[tam];
for(i=0; i<tam; i++)
{
vector[i]= ' ';
}
cad.getChars(0, cad.length(), vector, 0);
for (i=0; i<tam; i++)
{
arch.writeChar(vector[i]);
}
}
maestro.seek(0);
int cantcampos = maestro.readInt();
5
UTN Crdoba Ingenieria en Sistemas de Informacin
De todos los atributos de la clase, los dos ms relevantes son maestro (un
RandomAccessFile) que representa al archivo en s mismo, y fields que es un arreglo de
objetos de la clase Campo, en cual se almacenar un objeto por cada campo que tenga el
registro del archivo. As, en lugar de ir a la cabecera del achivo cada vez que se quiera tomar
algn metadato, se busca ese metadato en el arreglo. Cuando el archivo se abre (ver mtodo
abrir()), lo primero que se hace es levantar los metadatos desde el archivo hacia ese arreglo, y
el mismo se deja en memoria mientras el archivo est abierto.
El mtodo crear() crea el archivo si el mismo no exista. Pero si exista, lo elimina del
disco y lo vuelve a crear. El mtodo abrir() abre el archivo si el mismo exista, y crea el
arreglo de metadatos del mismo. Si no exista, lanzar una excepcin. El file pointer del
archivo quedar ubicado al comienzo del rea de datos si el modo de apertura era "r", o al
final del archivo si el modo de apertura era "rw".
La clase contiene los ya conocidos mtodos para leer y grabar cadenas de longitud fija
en un RandomAccessFile, y el resto de los mtodos son de naturaleza trivial. La clase
Principal aporta un mtodo main con un men de opciones para crear un archivo, definir su
estructura de registro, agregar registros y mostrar el archivo. Toda la interaccin con el
archivo se regula a partir de los metadatos que el propio archivo provee:
import java.io.*;
import java.util.*;
public class Principal
{
private static Archivo archivo;
private static Campo campo;
6
UTN Crdoba Ingenieria en Sistemas de Informacin
do
{
System.out.print("Carga de la Tabla: " + archivo.getNombreGeneral() + "\n");
System.out.print("Valores de los campos del registro nmero " + cont + ":\n");
for (i=0; i<cantcampos; i++)
{
System.out.print("\nCampo " + fields[i].getNombre() + ": ");
switch(fields[i].getTipo())
{
case 0: // int
int fieldInt = Consola.readInt();
archivo.grabarInt(fieldInt);
break;
case 1: // float
float fieldFloat = (float)Consola.readDouble();
archivo.grabarFloat(fieldFloat);
break;
case 2: // cadena
String fieldString = Consola.readLine();
archivo.grabarString(fieldString, fields[i].getCantidad());
7
UTN Crdoba Ingenieria en Sistemas de Informacin
break;
}
}
cont ++;
System.out.print("Desea cargar otro registro? (1: Si / 0: No): ");
seguir = Consola.readInt();
}
while (seguir == 1);
archivo.cerrar();
}
System.out.print("Contenido de la tabla\n\n");
while (!archivo.eof())
{
for (i=0; i<cantcampos; i++)
{
System.out.print("\nCampo " + fields[i].getNombre() + ": ");
switch(fields[i].getTipo())
{
case 0: // int
int fieldInt = archivo.leerInt();
System.out.print(fieldInt);
break;
case 1: // float
float fieldFloat = archivo.leerFloat();
System.out.print(fieldFloat);
break;
case 2: // cadena
String fieldString = archivo.leerString(fields[i].getCantidad());
System.out.print(fieldString);
break;
}
}
}
archivo.cerrar();
}
do
{
System.out.print("\n\nPrograma para manipulacion de una tabla, con metadatos\n");
System.out.print("\n1. Crear tabla");
System.out.print("\n2. Cargar tabla");
System.out.print("\n3. Mostrar tabla");
System.out.print("\n4. Salir");
System.out.print("\n\n\n\t\tElija: ");
op = Consola.readInt();
switch (op)
{
8
UTN Crdoba Ingenieria en Sistemas de Informacin
case 1: cargarMetaDatos();
break;
case 2: cargarDatos();
break;
case 3: mostrarDatos();
break;
case 4:;
}
}
while (op != 4);
System.exit(0);
}
}
El formato DBF es una forma de almacenar archivos en una base de datos, incluyendo
sus metadatos a modo de cabecera, que se ha hecho extremadamente popular (y se ha
convertido en un estndar universal) desde 1979 cuando fue utilizado por dBaseII.
De hecho, el formato DBF es propio del mundo de las PC y fue pensado para
implantar de modo directo la descripcin del contenido del archivo, de forma que pueda ser
compartido con facilidad por diversas aplicaciones.
o Byte 0 ID
o Bytes 1 al 3 Fecha de la ltima actualizacin
o Bytes 4 al 7 Cantidad de registros que tiene el archivo
o Bytes 8 al 9 Nmero de campos que tiene el registro
o Bytes 10 al 11 Longitud de cada registro del archivo
Todos los nmeros vienen en formato little endian, que es propio de la plataforma
PC. El formato little endian es aquel en el cual un valor de ms de un byte es
9
UTN Crdoba Ingenieria en Sistemas de Informacin
El resto de los bytes hasta llegar al 32 se usan para almacenar valores que son
especficos de cada producto que usa el estndar. A los fines prcticos, esos bytes
pueden llenarse con ceros.
Metadatos para cada campo del archivo: Inmediatamente de los 32 bytes para
los datos de toda la tabla, siguen registros de 32 bytes cada uno, que se usan para
describir a cada campo de la tabla (es decir que si la tabla tiene, por ejemplo, 4
campos, la seccin de metadatos para campos ocupar un total de bytes 32 * 4 =
128).
El nombre de cada campo termina con cero, y el byte 10 es siempre un cero para
facilitar el manejo. Si un campo tiene menos de 10 caracteres, se rellena con
ceros a la derecha. Los nombres se almacenan en maysculas.
C tipo caracter
N tipo numrico
D tipo fecha
L tipo lgico
Esos cuatro tipos son reconocidos por cualquier estndar, pero si el programador
desea agregar otros puede hacerlo... al precio de que con ese nuevo formato no
podr compartir sus datos!!! Existen otros tipos de datos que se han agregado al
estndar: con la F se incorpora un valor en coma flotante, con la M un campo
memo, etc.
10
UTN Crdoba Ingenieria en Sistemas de Informacin
El rea de datos o registros propiamente dichos, sigue luego del pie de la cabecera, y
desde all en adelante los registros se graban en forma consecutiva y con longitud fija.
No hay bytes de relleno entre registro y registro. El primer byte de cada registro se usa
para indicar si el registro est marcado como activo o como borrado: si est activo se
graba un blanco, y si est borrado se graba un asterisco. Luego vienen los campos,
uno tras otro. Los campos de tipo carcter se rellenan con ceros hasta ocupar la longitud
especificada en la cabecera. Los datos numricos se convierten a caracteres y se graban
como tales. El punto decimal en s mismo se graba como un caracter ms (!). Y los
datos de tipo lgico se escriben como T o F.
11
UTN Crdoba Ingenieria en Sistemas de Informacin
12