Archivos de Accesso aleatorio... Parte 2 del otro

Iniciado por agusCarBan, 2 Junio 2009, 20:31 PM

0 Miembros y 1 Visitante están viendo este tema.

agusCarBan

Esta es la 2da gran duda... Si tengo una clase usuario con 3 atributos string y un int y a los string los hago que tenga la misma longitud... es decir los relleno de espacios en blanco por las dudas de que sean menores a por ejemplo 25... xq se supone que en archivos de acceso aleatorio todos los campos de un registro (strings) deben tener la misma longitud...
Puede uso el metodo grabar usuario y todo bien... busco un usuario por su legajo y todo bien... despues modifico un string buscandolo por su legajo y todo bien... es decir me tendria que volver atras cierta cantidad de bytes para despues poder volver a escribir... en este casi y como les dije... serian 154 bytes... despues que hago la modificacion y se me da por volver a buscar o usar el metodo de busqueda por legajo me tira una excepcion

java.io.EOFException
No existe un alumno con ese legajo !
        at java.io.RandomAccessFile.readChar(RandomAccessFile.java:695)
        at DBUsuarios.busquedaUser(DBUsuarios.java:181)
        at Principal.main(Principal.java:48)

cuando antes el metodo me andaba barbaro... como tengo que modificar exitosamente el archivo ?

lo que yo hago es una onda asi...
if(usu.getLegajo()==leg)
{
    flujo.seek(flujo.getFilePointer()-154)
    ---------
    ---------
    vuelvo a escribir todos los datos del usuario a excepcion del que quiero modificar ya que ese supuestamente lo obtengo por haberlo pasado como paerametro al metodo...
}

espero haberme dado a entender...

SeniorX

Yo haría un debug y así iría viendo los valores que toma Legajo cuando lo modificas supuestamente, ahí seguro que verías en que parte estas errando.

Pero como solución rápida yo simplemente escribiría todos los datos de nuevo. Lo otro que haría sería borrar el legajo que quieras cambiar y teniendo esa variable vacía entonces lo escribiría de nuevo.


Suerte!
try {
     live();
}
catch (ShitHappensException ex) {
MessageBox.Show(ex.Solution)
}

Precaución: La programacion puede producir adiccion

Eliptico

¡¡¡Buenas!!!

No se si te he entendido bien con lo que planteas, pero bueno, aunque se que es java, te doy mi experiencia con los textos de C/C++ que he leido hasta ahora.

Cuando se tiene una estructura de datos de por ejemplo un char, un int y un double, el espacio que ocupa una variable de este tipo de dato en memoria o en un fichero, no tiene porque ser la suma de lo que ocupan todos sus miembros, puede ser mayor (nunca me he molestado en comprobarlo). No se si lo llamaban alineacion de los campos o algo asi.

Lo que se recomienda es leer todo el bloque de datos, modificar el que quieras y volver a guardar el mismo bloque donde estaba.

¿No existe en java el operador sizeof? ¿o sino algo parecido que te devuelva el espacio que ocupa su argumento?

Si ese no es el problema, no se me ocurre que es lo que puede ser, ya que como he dicho antes, de java no controlo.

¡¡¡Un saludo!!!