Sie sind auf Seite 1von 9

JAFramework 2 (JAF

2
)




THEJAVALISTENER.COM, AUTOR: PABLO AUGUSTO SZNAJDLEDER
Manual del usuario
Introduccin
Java Algorithm Framework (JAF2) es un motor de persistencia creado para facilitar la enseanza de progra-
macin de algoritmos implementados con el lenguaje Java.
JAF2 aporta funcionalidad relacionada a la gestin de archivos de registros de longitud fija; problemtica que
Java no cubre directamente. Adems JAF2 pretende introducir al estudiante en el concepto de framework,
La operatoria de representacin (mapping) que implementa JAF2 es similar a la que utiliza Hibernate; cada
archivo de registros al que se desea tener acceso desde un programa Java debe ser representado (mappeado)
mediante una clase dentro de la cual, usando annotations, se indican todos los parmetros de relacin entre dicha
clase y el archivo fsico que sta representa.
JAF2 permite manipular archivos de texto cuyos datos estn almacenados en forma de filas y columnas;
cada fila representa un registro y cada columna describe un campo o atributo de un registro. Luego, cada fila
se compone de un conjunto de valores (atributos) que, por definicin, son coherentes entre s.
A continuacin analizaremos un archivo de texto cuyo contenido respeta la estructura de filas y columnas
antes mencionada. Este archivo lo utilizaremos durante todo el documento para analizar la funcionalidad de JAF2.
En este archivo, cada registro tiene los siguientes campos: legajo, nombre, fecha de ingreso, sexo y nota.
ALUMNOS.txt
0010, Pedr o , 1991/ 08/ 23, M, 08
0020, Amal i a , 1992/ 10/ 12, F, 06
0030, Rol ando , 1993/ 11/ 01, M, 09
0040, Car l a , 2001/ 03/ 21, F, 10
0050, Osval do , 2005/ 12/ 20, M, 02
0060, Mar i sa , 1990/ 03/ 15, F, 04


Es muy importante observar que todas las columnas tienen exactamente el mismo ancho (size). El carcter
separador puede ser cualquiera. En este caso se utiliza una , (coma) para separar los valores de los campos pero
podra ser un (espacio en blanco), un carcter tabulador, etctera.
Observemos tambin que el ltimo registro debe tener un salto de lnea (ENTER) al final; slo uno. De este
modo todos los registros del archivo tendrn exactamente la misma longitud; as el archivo podr ser considerado
como un archivo de registros de longitud fija y, por ende, podr ser mappeado y accedido con JAF2.
2
THEJAVALISTENER.COM, AUTOR: PABLO AUGUSTO SZNAJDLEDER

Operaciones bsicas
Representar un archivo mediante una clase (mapping)
Para acceder al contenido de un archivo de registros de longitud fija, como es el caso de ALUMNOS.txt,
debemos mappearlo; esto significa que tendremos que escribir una clase Java con tantos atributos como
campos tiene el archivo; cada atributo con sus correspondientes mtodos de acceso. Adems se deben indicar
algunos parmetros que JAF2 utilizar para vincular el archivo (recurso fsico) con la clase y con las instancias
de sta (recursos lgicos).
La clase Al umno. j ava que veremos a continuacin implementa un mappeo bsico del archivo
ALUMNOS.txt. Observemos cmo utiliza la anotacin @Fi l e para indicar el nombre fsico del archivo y @Fi el d
sobre cada atributo para indicar el size (ancho de la columna) del campo que representa.
MUY IMPORTANTE: Los atributos de la clase deben aparecer en el mismo orden en que aparecen los cam-
pos del archivo.
Alumno.java

// package ...
// imports...

@Fi l e( name=" ALUMNOS. t xt " , al i as=" ALUMNOS" )
public class Al umno
{
@Fi el d( si ze=4)
private int l egaj o;

@Fi el d( si ze=10)
private St r i ng nombr e;

@Fi el d( si ze=10)
private St r i ng f echaI ngr eso;

@Fi el d( si ze=1)
private char sexo;

@Fi el d( si ze=2)
private int not a;

@Over r i de
public String t oSt r i ng( )
{
St r i ng l i nea = " " ;
l i nea+=" l egaj o=" +l egaj o+ " , nombr e=" +nombr e+" , " ;
l i nea+=" f echaI ngr eso=" +f echaI ngr eso+" , sexo=" +sexo+" , not a=" +not a;
return l i nea;
}

// :
// setters y getters
// :
}

Factora y sesin de JAF2
La clase J AFact or y permite registrar los mappings que vamos a utilizar; luego, nos dar la sesin a travs de la
cual podremos establecer el vnculo entre nuestro programa y los archivos de registros a los que vamos a acceder.
3

THEJAVALISTNER.COM, AUTOR: PABLO AUGUSTO SZNAJDLEDER
Comenzaremos registrando el nico mapping que hasta ahora hemos desarrollado.

// registro los mappings
J AFact or y. r egi st er Mappi ng( Al umno. class) ;


Habiendo registrado el mapping que representa el archivo al que vamos a acceder, estamos en condi-
ciones de obtener la sesin.

// obtengo la session
J ASessi on sessi on = J AFact or y. get Sessi on( ) ;


Ahora que disponemos de la sesin podemos solicitar una referencia al archivo. Los archivos cuyos
mappings hemos registrado se representan con instancias de la clase J AFi l e.

// obtengo la referencia al archivo a traves de su alias
J AFi l e<Al umno> f = sessi on. get Fi l eByAl i as( " ALUMNOS" ) ;


Observemos que en el mapping Alumno.java, en annotation @Fi l e indicamos un alias para el archivo
ALUMNOS.txt. En general se recomienda asignar un alias a cada uno de nuestros archivos pero en caso de no
hacerlo, podemos acceder al archivo indicando su nombre fsico como vemos a continuacin:

// obtengo la referencia al archivo por su nombre fisico
J AFi l e<Al umno> f = sessi on. get Fi l e( " ALUMNOS. t xt " ) ;

Lectura secuencial de un archivo de registros
Como comentamos ms arriba, cada archvo se compone de un conjunto de filas, todas con la misma cantidad
de caracteres; el mismo size. La clase J AFi l e provee el mtodo r ead y administra un indicador de posicin
que hace referencia a cual ser el prximo registro al que podremos acceder invocando a dicho mtodo.

// package ...
// imports...

public class Recor r er Ar chi vo
{
public static void mai n( St r i ng[ ] ar gs)
{
J AFact or y. r egi st er Mappi ng( Al umno. class) ;
J ASessi on sessi on = J AFact or y. get Sessi on( ) ;

// obtengo el archivo
J AFi l e<Al umno> f = sessi on. get Fi l eByAl i as( " ALUMNOS" ) ;

// muevo el indicador de posicion del archivo hacia el inicio
f . r eset ( ) ;

// creo una instancia de Alumno
Al umno a = new Al umno( ) ;

// el metodo read lee el proximo registro y retorna true si la lectura resulto correcta
boolean ok = f . r ead( a) ;

while( ok )
{
Syst em. out . pr i nt l n( a) ;

4
THEJAVALISTENER.COM, AUTOR: PABLO AUGUSTO SZNAJDLEDER


// leo el proximo registro
ok = f . r ead( a) ;
}

// finalmente cierro el archivo
f . cl ose( ) ;
}
}

Escritura secuencial sobre un archivo de registros
As cmo el mtodo r ead permite leer el contenido del prximo registro, que est siendo apuntado por el
indicador de posicin del archivo, el mtodo wr i t e tiene un funcioamiento anlogo; slo que en lugar de leer
escribe datos en dicho registro.
En el siguiente programa el usuario ingresa por consola datos que corresponden a varios alumnos; estos
datos los usuamos para generar el archivo ALUMNOS.txt.

// package ...
// imports...

public class Gr abar Ar chi vo
{
public static void mai n( St r i ng[ ] ar gs)
{
Scanner scanner = new Scanner ( Syst em. i n) ;

J AFact or y. r egi st er Mappi ng( Al umno. cl ass) ;
J ASessi on sessi on=J AFact or y. get Sessi on( ) ;

// obtengo la referencia al archivo de alumnos
J AFi l e<Al umno> f =sessi on. get Fi l eByAl i as( " ALUMNOS" ) ;

// borro el contenido actual del archivo; lo dejo vacio
f . r ewr i t e( ) ;

Al umno a = new Al umno( ) ;
i ngr esar Dat osAl umno( a) ;

while( a. get Legaj o( ) >0 )
{
// creo un registro y le asigno los datos ingresados
a. set Legaj o( l eg) ;
a. set Nombr e( nom) ;
a. set Not a( not a) ;

// grabo el nuevo registro en el archivo
f . wr i t e( a) ;

i ngr esar Dat osAl umno( a) ;
}

f . cl ose( ) ;

scanner . cl ose( ) ;
}

public static void i ngr esar Dat osAl umno( Al umno a)
{
Scanner scanner = new Scanner ( Syst em. i n) ;

5

THEJAVALISTNER.COM, AUTOR: PABLO AUGUSTO SZNAJDLEDER

Syst em. out . pr i nt l n( " - - I NGRESO DE DATOS - - " ) ;
Syst em. out . pr i nt ( " Legaj o: " ) ;
int l eg = scanner . next I nt ( ) ;

Syst em. out . pr i nt ( " Nombr e: " ) ;
St r i ng nom= scanner . next ( ) ;

Syst em. out . pr i nt ( " Fecha de I ngr eso: " ) ;
St r i ng f ec = scanner . next ( ) ;

Syst em. out . pr i nt ( " Sexo: " ) ;
char sexo = scanner . next ( ) ;

Syst em. out . pr i nt ( " Not a: " ) ;
int not a = scanner . next I nt ( ) ;

a. set Legaj o( l eg) ;
a. set Nombr e( nom) ;
a. set FechaI ngr eso( f ec) ;
a. set Sexo( sexo) ;
a. set Not a( not a) ;

scanner . cl ose( ) ;
}
}


El programa anterior borra (si es que exista) todo el contenido del archivo ALUMNOS.txt. Si en lugar de
borrar todo su contenido hubisemos querido agregar los nuevos registros al final del archivo, entonces en
lugar de invocar al mtodo r ewr i t e debemos invocar al mtodo seek para mover al indicador del posicin
del archivo al final del ltimo registro como veremos a continuacin.

// obtengo la referencia al archivo de alumnos
J AFi l e<Al umno> f =sessi on. get Fi l eByAl i as( " ALUMNOS" ) ;

// muevo el indicador al final del ultimo registro del archivo
f . seek( f . si zeof ( ) ) ;

Acceso directo a los registros del archivo
El mtodo seek permite mover arbitrreamente el indicador de posicin de un archivo. Veamos el siguiente
programa que muestra cmo utilizando este mtodo podemos leer cada uno de los registros de un archivo.

// package ...
// imports...

public class Recor r er Ar chi voSeek
{
public static void mai n( St r i ng[ ] ar gs)
{
// registro los mappings
J AFact or y. r egi st er Mappi ng( Al umno. class) ;

// obtengo la session
J ASessi on sessi on = J AFact or y. get Sessi on( ) ;

// obtengo la referencia al archivo de alumnos
J AFi l e<Al umno> f = sessi on. get Fi l eByAl i as( " ALUMNOS" ) ;


6
THEJAVALISTENER.COM, AUTOR: PABLO AUGUSTO SZNAJDLEDER


int cant Reg = f . f i l eSi ze( ) ;

Al umno al umno = new Al umno( ) ;
for( int i =0; i <cant Reg; i ++ )
{
f . seek( i ) ;
f . r ead( al umno) ;
Syst em. out . pr i nt l n( al umno) ;
}

f . cl ose( ) ;
}
}

Actualizar los valores de los registros
El siguiente programa actualiza las notas de todos los alumnos aprobndolos a todos; incluso, les suma 1
punto a aquellos que ya estaban aprobados.

// package ...
// imports...

public class Act ual i zar Not asAl umnos
{
public static void mai n( St r i ng[ ] ar gs)
{
J AFact or y. r egi st er Mappi ng( Al umno. class) ;
J ASessi on sessi on = J AFact or y. get Sessi on( ) ;

J AFi l e<Al umno> f = sessi on. get Fi l eByAl i as( " ALUMNOS" ) ;
f . r eset ( ) ;

Al umno a = new Al umno( ) ;

int i =0;
while( f . r ead( a) )
{
int nuevaNot a = Mat h. mi n( Mat h. max( 4, a. get Not a( ) +1) , 10) ;
a. set Not a( nuevaNot a) ;

f . seek( i ) ;
f . wr i t e( a) ;

i ++;
}

f . cl ose( ) ;
}
}

7

THEJAVALISTNER.COM, AUTOR: PABLO AUGUSTO SZNAJDLEDER
Indices
JAF2 permite definir ndices e indexa automticamente los archivos segn las indicaciones que especi-
fiquemos en el mapping. En el siguiente ejemplo indexamos el archivo ALUMNOS.txt por el campo l egaj o.

// package ...
// imports...

@Fi l e( name=" ALUMNOS. t xt " , al i as=" EMPLEADOS" )
@I ndex( key=" l egaj o" al i as=" i dx" )
public class Al umno
{
// ...

Recorrer un archivo indexado
Cuando tenemos un archivo indexado podemos recorrerlo a travs de alguno de sus ndices. Esto nos
dar acceso a sus registros segn el orden que dicho ndices especifica.

// package ...
// imports...

public class Recor r er Ar chi voI ndexado
{
public static void mai n( St r i ng[ ] ar gs)
{
J AFact or y. r egi st er Mappi ng( Al umno. class) ;
J ASessi on sessi on = J AFact or y. get Sessi on( ) ;
J AFi l e<Al umno> f = sessi on. get Fi l eByAl i as( " ALUMNOS" ) ;

// obtengo el indice
J AI ndex<Al umno> i dx1 = sessi on. get I ndexByAl i as( f , " i dx" ) ;

// ubico el indicador de posicion del indice en el primer registro
i dx1. r eset ( ) ;

Al umno a = new Al umno( ) ;

while( i dx1. r ead( a) )
{
Syst em. out . pr i nt l n( a) ;

i dx1. r ead( a) ;
}

i dx1. cl ose( ) ;
f . cl ose( ) ;
}
}



Otras opciones para indexar el archivo ALUMNOS.txt podran ser:
@I ndex( key=" nombr e+l egaj o" al i as=" i dxNom" )
@I ndex( key=" - not a+nombr e+l egaj o" al i as=" i dxNot a" )
8
THEJAVALISTENER.COM, AUTOR: PABLO AUGUSTO SZNAJDLEDER

Busqueda
Sobre un archivo indexado podemos buscar y determinar si existe o no algn registro cuya clave coincida
con un valor determinado. Veamos:

public class Test Sear ch
{
public static void mai n( St r i ng[ ] ar gs)
{
J AFact or y. r egi st er Mappi ng( Al umno. cl ass) ;
J AFi l e<Al umno> f =sessi on. get Fi l eByAl i as( " ALUMNOS" ) ;

J AI ndex<Al umno> i dx = sessi on. get I ndexByAl i as( f , " i dx" ) ;

// defino la clave de busqueda
Al umno k = new Al umno( ) ;
k. set Legaj o( 30) ;

// el metodo search retorna la posicion del registro que contiene
// o un valor negativo se no se encontraron datos
int pos = i dx. sear ch( k) ;

Syst em. out . pr i nt l n( pos) ;

if( pos>=0 )
{
i dx. seek( pos) ;
i dx. r ead( k) ;

Syst em. out . pr i nt l n( k) ;
}
else
{
Syst em. out . pr i nt l n( " No se encont r ar on dat os. . . " ) ;
}
}
}

Configurar mltiples ndices
Un archivo puede indexarse por ms de una clave, como vermos a continuacin:
@Fi l e( name=" ALUMNOS. t xt " , al i as=" ALUMNOS" )
@I ndexes( {@I ndex( key=" l egaj o" , al i as=" i dxLeg" )
, @I ndex( key=" nombr e+l egaj o" , al i as=" i dxNom" )
, @I ndex( key=" - not a+nombr e+l egaj o" , al i as=" i dxNot a" ) })
public class Al umno
{
// ...


El siguiente programa recorre el archivo ALUMNOS.txt por cada uno de sus ndices.

public class Test Mul t i pl esI ndi ces
{
public static void mai n( St r i ng[ ] ar gs)
{
J AFact or y. r egi st er Mappi ng( Al umno. cl ass) ;
J ASessi on sessi on=J AFact or y. get Sessi on( ) ;
J AFi l e<Al umno> f =sessi on. get Fi l eByAl i as( " ALUMNOS" ) ;

9

THEJAVALISTNER.COM, AUTOR: PABLO AUGUSTO SZNAJDLEDER

// tomo cada uno de sus indices
J AI ndex<Al umno> i Leg= sessi on. get I ndexByAl i as( f , " i dxLeg" ) ;
J AI ndex<Al umno> i Nom= sessi on. get I ndexByAl i as( f , " i dxNom" ) ;
J AI ndex<Al umno> i Not = sessi on. get I ndexByAl i as( f , " i dxNot a" ) ;

_most r ar ( i Leg) ;
_most r ar ( i Nom) ;
_most r ar ( i Not ) ;

f . cl ose( ) ;
}

private static void _most r ar ( J AI ndex<Al umno> i dx)
{
i dx. r eset ( ) ;
Al umno a = new Al umno( ) ;

while( i dx. r ead( a) )
{
Syst em. out . pr i nt l n( a) ;
}
}
}

Das könnte Ihnen auch gefallen