Foros del Web » Programación para mayores de 30 ;) » Java »

RandomAccessFile no se como leer bien los datos

Estas en el tema de RandomAccessFile no se como leer bien los datos en el foro de Java en Foros del Web. Buenas. Resulta que tengo el siquiente problema: Realiza un programa en Java que te permita modificar los datos de un departamento. el programa recibe desde ...
  #1 (permalink)  
Antiguo 20/12/2015, 15:35
 
Fecha de Ingreso: julio-2015
Mensajes: 85
Antigüedad: 8 años, 8 meses
Puntos: 4
RandomAccessFile no se como leer bien los datos

Buenas.

Resulta que tengo el siquiente problema: Realiza un programa en Java que te permita modificar los datos de un departamento. el programa recibe desde linea de comandos el numero de departamento a modificar, el nuevo nombre de departamento y nueva localidad. si el departamento no existe visualiza un mensaje indicandolo.

Clase Departamento:
Código Java:
Ver original
  1. import java.io.Serializable;
  2.  
  3. public class Departamento implements Serializable //Acordarse Siempre!!!!!!!!!!!!!!!!
  4. {
  5.  
  6.     private String _nombre;
  7.     private int _identificador;
  8.     private String _localidad;
  9.  
  10.     public Departamento(String nombre, int identificador, String localidad)
  11.     {
  12.         _nombre = nombre;
  13.         _identificador=identificador;
  14.         _localidad = localidad;
  15.  
  16.     }
  17.  
  18.     public String get_nombre() {
  19.         return _nombre;
  20.     }
  21.  
  22.     public void set_nombre(String nombre) {
  23.         this._nombre = nombre;
  24.     }
  25.  
  26.     public int get_identificador() {
  27.         return _identificador;
  28.     }
  29.  
  30.     public void set_identificador(int identificador) {
  31.         this._identificador = identificador;
  32.     }
  33.  
  34.     public String get_localidad() {
  35.         return _localidad;
  36.     }
  37.  
  38.     public void set_localidad(String localidad) {
  39.         this._localidad = localidad;
  40.     }
  41.  
  42.  
  43.  
  44. }

Código Java:
Ver original
  1. public static void modificar()
  2.     {
  3.  
  4.         try
  5.         {
  6.             System.out.println("Introduce el identificador del Departamento");
  7.             int identificador= Integer.parseInt(sc.nextLine());
  8.  
  9.             File fichero = new File("Departamentos.dat");
  10.             RandomAccessFile random = new RandomAccessFile(fichero, "rw");
  11.             int posicion = (identificador - 1)*36;
  12.  
  13.             if(posicion<random.length()||posicion>0)
  14.             {
  15.                 System.out.println("Nuevo nombre");
  16.                 String nombre=sc.nextLine();
  17.  
  18.                 System.out.println("Localidad");
  19.                 String localidad = sc.nextLine();
  20.  
  21.                 random.seek(posicion);
  22.  
  23.                 random.writeChars(nombre);
  24.                 random.writeChars(localidad);
  25.  
  26.                 System.out.println("Datos modificados");
  27.  
  28.  
  29.  
  30.             }
  31.         }
  32.         catch(Exception e)
  33.         {
  34.  
  35.         }
  36.  
  37.     }

El problema esta en que no se usar esta clase con los metodos, al ejecutar este metodo todos los departamento que tenia y que podia visualizar a traves de la clase ObjectInputStream ahora no puedo verlos, no se muestra ninguno pero si yo entro al fichero y lo habro si que estan los objetos escritos.

No entiendo tampoco como indicale que String tiene que cambiar y me parece un poco de lio porque yo no leo por campos, leo por tipos. He buscado en internet sobre esta clase y sus metodos y no me aclaro nada ya que es lo mismo que se y que no consigo hacer funcionar.
  #2 (permalink)  
Antiguo 21/12/2015, 04:45
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: RandomAccessFile no se como leer bien los datos

Hola:

Es muy complejo lo que pretendes.

ObjectInputStream y ObjectOutputStream escriben/leen convierten la clase departamento a bytes de una forma no evidente. Según como escribas, escriben bytes de cabecera en el fichero, bien una cabecera al principio del fichero, bien una cabecera delante de cada objeto. Luego escriben la clase serializada a bytes de una forma extraña, etc, etc.

RandomAccessFile está pensado para ir directamente a una posición (en bytes) del fichero y leer de ahí (o escribir). Así que para hacer "compatible" RandomAccessFile con ObjectStream, tendrías que saber exactamente cuántos bytes ocupa una clase serializada para poder acceder directamente a su posición en fichero, teniendo en cuenta también los bytes de cabecera que te digo que estarán ahí. Si además vas por campos, no solo debes saber en el fichero la posición exacta donde está tu clase, sino la posición exacta donde se guarda ese campo. Finalmente, RandomAccessFile, cuando escribes en una posición, "machaca" lo que hay en esa posición, no inserta ni recorta, por lo que tendrías que modificar el valor del campo por otro exactamente de la misma longitud.

Las opciones son tres.
1) Olvidate del RandomAccessFile. Directamente, cuando modifiques algo, sobreeescribe el fichero entero.
2) Piensa un formato de fichero que no sea ObjectStream y que tenga registros de longitud fija y campos de longitud fija. Con eso podrías usar RandomAccessFile.
3) Usa una base de datos. Si no quieres meterte en el lío de instalación de base de datos, las embebidas son una buena opción (HSQLDB, Apache Derby, ...)

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 22/12/2015, 04:17
 
Fecha de Ingreso: julio-2015
Mensajes: 85
Antigüedad: 8 años, 8 meses
Puntos: 4
Respuesta: RandomAccessFile no se como leer bien los datos

Gracias por las aclaraciones, mi primera opción fue reescribir el fichero entero pero me puse a mirar los apuntes y estaba esta clase (RandomAccessFile) e imagine que la profesora quiere que lo hagamos con esto, también lo vería factible hacerlo de esta manera porque seria mas eficiente, ya que no habría que escribir todo de nuevo porque si hay pocos datos pues genial pero si hay una gran cantidad de datos puede ser un proceso mas lento. Lo haré de la manera que se y ya esta porque no se ha molestado en decirnos como funciona esa clase ni nada.

Pero de todos modos ya por curiosidad si alguien sabe como funciona esta clase con sus métodos y me puede guiar de alguna manera a hacer el ejercicio de esa forma se lo agradecería.
  #4 (permalink)  
Antiguo 22/12/2015, 04:59
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: RandomAccessFile no se como leer bien los datos

Hola:

Bueno, es sencillo http://chuwiki.chuidiang.org/index.p..._de_un_fichero aunque por supuesto hay más métodos y variantes.

Si quieres hacerlo con esta clase, tendrías que guardar el departamento en un fichero de forma que cada registro y cada campo ocupe siempre lo mismo, por ejemplo, en formato texto estilo CSV para hacerlo más sencillo.


"001","matematicas_______","Lugo_________"
"002","física_____________","Pontevedra____"
...


fijate que cada campo ocupa lo mismo (se completa con espacios) y cada fila ocupa lo mismo. De esta forma, con RandomAccessFile es fácil situarse en un sitio concreto

randomAccessFile.seek(numero de fila * caracteres que ocupa una fila + posicion del campo en la fila)

y ahora solo tienes que escribir lo que quieras.

Lo de las " y las , es por hacerlo legible para un humano, pero para RandomAccessFile le da igual, lo importante es la posición, a RandomAccessFile le valdría

001matematicas________lugo______________002fisica_ _______pontevedra__________

es decir, ni separadores, ni retornos de carro ni nada, solo es importante que cada departamento ocupe el mismo número de bytes y cada campo también.

PD: Los _ pueden ser espacios, se trata de conseguir que los campos ocupen todos lo mismo.

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Última edición por chuidiang; 22/12/2015 a las 05:04
  #5 (permalink)  
Antiguo 22/12/2015, 06:16
 
Fecha de Ingreso: julio-2015
Mensajes: 85
Antigüedad: 8 años, 8 meses
Puntos: 4
Respuesta: RandomAccessFile no se como leer bien los datos

Si lei algo de eso pero no se me paso por la cabeza hacerlo ya que creia que todos ocuparian lo mismo al ser del mismo tipo pero dependen de la cantidad de caracteres que contenga cada uno.

Si yo tengo lo siguiente: Marketing______1__Barcelona______

si yo me situo en esa fila con el seek y quiero cambiar el segundo string no el primero como se lo indico con el writechars("Valencia"); ?

Esa es mi duda diferenciar el dato a cambiar.
  #6 (permalink)  
Antiguo 24/12/2015, 02:44
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: RandomAccessFile no se como leer bien los datos

Hola:

Debes calcular la posicion en bytes donde empieza la B de barcelona. Para ello, la "cuenta" es algo como esto

numero de fila * numero de bytes que ocupa cada fila + número de bytes que ocupa el departamento (el numero de bytes fijo con los espacios detras) + el numero de bytes que ocupa el identificador (con sus espacios o lo que hayas puesto). Te pongo unos números de ejemplo, tendrás que ajustarlos a tu caso real

Código Java:
Ver original
  1. public final int BYTES_POR_FILA=100;
  2. public final int BYTES_NOMBRE_DEPARTAMENTO=25;
  3. public final int BYTES_ID_DEPARTAMENTO=4;
  4.  
  5. int posicionLocalidad = numeroFila*BYTES_POR_FILA+BYTES_NOMBRE_DEPARTAMENTO+BYTES_ID_DEPARTAMENTO

La primera fila debe ser la 0 para que esta cuenta funcione.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #7 (permalink)  
Antiguo 24/12/2015, 04:03
 
Fecha de Ingreso: julio-2015
Mensajes: 85
Antigüedad: 8 años, 8 meses
Puntos: 4
Respuesta: RandomAccessFile no se como leer bien los datos

Vale vale

Yo creia que habia que situarse en la fila solamente por eso decia yo que como la diferenciaba, eso me cuadra bastante mas, segun el libro que tengo ellos lo hacen sobre la fila y desde ahi cambian 2 valores. Lo ptobare y pondre el codigo aqui si me sale.

Etiquetas: clase, metodo, programa, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:31.