UNIDAD 6: JAVA JSP REGISTROS Y ARCHIVOS DIRECTOS

TEMA 3: GRABACION Y LECTURA DISCO JAVA JSP

Estos dos procesos son los casos mas comunes y frecuentes que se pueden realizar con un archivo de disco.

GRABACION DE UNA ESTRUCTURA A UN ARCHIVO EN DISCO

Prog26.jsp

<%@ page import="java.io.*" %>
<%
// creando e inicializando los campos del registro
int clave=0;
String nombre="";
int edad=0;
if(request.getParameter("GRABAR") != null)
{
// abriendo archivo, capturando y grabando datos
try {
File arch=new File("c:\\archivo2.dat");
RandomAccessFile archivo=new RandomAccessFile(arch,"rw");
// capturando registro
clave=Integer.parseInt(request.getParameter("CLAVE"));
nombre=request.getParameter("NOMBRE");
edad=Integer.parseInt(request.getParameter("EDAD"));
// procesando la string para que quede de tamano fijo
if (nombre.length() < 25)
{ for(int i=nombre.length(); i <25; i++)
nombre=nombre+" ";}
else{ nombre=nombre.substring(0,25); };
// mandando el apuntador interno del archivo
// al final del archivo
if (archivo.length()!= 0){archivo.seek( archivo.length() );};
// grabando registro
archivo.writeInt(clave);
archivo.writeChars(nombre);
archivo.writeInt(edad);
// cerrando archivo
archivo.close();
} catch(FileNotFoundException fnfe) { /* Archivo no encontrado */ }
catch (IOException ioe) { /* Error al escribir */ }
// avisando
out.println("REGISTRO INSERTADO");
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog26.jsp METHOD=post>");
out.println("CLAVE :<INPUT TYPE=TEXT NAME=CLAVE><BR>");
out.println("NOMBRE :<INPUT TYPE=TEXT NAME=NOMBRE><BR>");
out.println("EDAD :<INPUT TYPE=TEXT NAME=EDAD><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=GRABAR VALUE=INSERTAR ><BR>");
out.println("</FORM>");
%>

corrida:

image50.jpg

Observar que es completamente similar a programa de archivos secuenciales, solo que es necesario que se usen las claves con la secuencia 0,1,2,3,4,5…..

La primera observación es que se esta usando el modo “rw”, reestudiar la clase de modos de apertura.

Recordar que un archivo directo tiene un tamaño de registro predifinido y es importante qu dicho tamaño se respete, para el caso de las variables strings dentro del codigo se estan ajustando a 25 caracteres, si la string es mas corta que dicho tamaño se tendra que ampliar con caracteres en blanco ” ”, si el tamaño es mas grande la string se tendra que recortar con el metodo substring(), como se muestra en el programa ejemplo.

Tambien es importante recordar que java grabara cada caracter de la string usando dos(2) bites en disco, es decir el registro ejemplo quedara grabado en disco en 58 BYTES, 50 para la string y 4 bytes por cada entero, es importante conocer el tamaño de registros grabados en disco porque esta información se usara ampliamente en el resto de los programas de esta unidad.

Las metodos de grabación que se estan usando son:

Archivo.writeInt() y archivo.writeChars().

Recordar estudiar todos los metodos de la clase RANDOMACCESSFILE.

LECTURA CONSULTA DESPLIEGUE DE REGISTROS

Prog27.jsp

<%@ page import="java.io.*" %>
<%
// creando e inicializando los campos del registro
int clave=0;
String nombre="";
int edad=0;
// se ocupa el tamano del registro
// y recordar que cada carcater de la string, java lo almacena en dos bytes
// en total la string de 25 caracteres se almacenara en 50 bytes
// mas dos ints de 4 bytes c/u nos da en total
long treg=58;
if(request.getParameter("OK") != null)
{
// abriendo archivo
try {
File arch=new File("c:\\archivo2.dat");
RandomAccessFile archivo=new RandomAccessFile(arch,"rw");
// calculando cantidad de registros
long creg=archivo.length()/treg;
// empezando tabla html para desplegar
out.println("<HTML><TABLE Border=10 CellPadding=5><TR>");
out.println("<th bgcolor=Green>CLAVE</th><th bgcolor=White>NOMBRE</th><th bgcolor=Red>EDAD</th></TR>");
// iniciando ciclo lectura archivo
for (long r=0; r < creg; r++)
{
// leyendo el registro
clave=archivo.readInt();
//leyendo string
for(int i = 0; i < 25; ++i)
{ nombre += archivo.readChar(); };
edad=archivo.readInt();
// desplegando en tabla html
out.println("<TR>");
out.println("<TD>"+clave+"</TD>");
out.println("<TD>"+nombre+"</TD>");
out.println("<TD>"+edad+"</TD>");
out.println("</TR>");
**// limpiar string o java la encadena en la siguiente lectura**
nombre="";
}; // termina for
// fin tabla y cierre archivo
out.println("</table>");
archivo.close();
} catch(FileNotFoundException fnfe) { }
catch (IOException ioe) { }
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog27.jsp METHOD=post>");
out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=desplegar ><BR>");
out.println("</FORM>");
%>

corrida:

image51.jpg

notas:

Primero se ocupa conocer la cantidad de registros que se encuentran almacenados en disco, para esto primero se ocupan dos variables de tipo long treg y creg, la cantidad de registros se obtiene con la operación y metodos de la clase RANDOMACCESSFILE siguientes:

creg=archivo.length()/treg;

Creo que esta muy claramente entendible como se consiguio la cantidad de registros, ya con esta información se construye un ciclo for (puede ser cualquiera de los ciclos vistos) para empezar a recorrer renglon tras renglon del archivo directo.

La unica nota a mencionar es que para leer la string se esta usando un ciclo de lectura de 25 caracteres y recordar al final poner la string en nada =”” porque si no en la siguiente lectura se tendra la string encadenada a la siguiente string.

TAREAS PROGRAMACION JAVA JSP

1.- Cargar y Leer los archivos pedidos en el tema anterior.

Politica de Privacidad