Java - Serialización Java un problemita a la hora de leer ayuda pf

 
Vista:
Imágen de perfil de Rolando
Val: 14
Ha aumentado su posición en 57 puestos en Java (en relación al último mes)
Gráfica de Java

Serialización Java un problemita a la hora de leer ayuda pf

Publicado por Rolando (3 intervenciones) el 18/08/2020 14:58:32
Lo que deseo es que cada ves que ejecute el programa me guarde en el archivo los datos de la partida, lo cual hace pero a la hora de leerlo solo guarda en el array el elemento generado en la primera ejecución del programa, y los necesito todos para poderlo llevar después a un JTable. Saludos, gracias de antemano
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
try {
 
    Datos_liderboard [] datos_partida = {new Datos_liderboard(resultado, nombre_usuario, cant_kill, dificultad, tiempo_juego, fecha)};
 
    ObjectOutputStream salida_stream = new ObjectOutputStream(new FileOutputStream(new File("src/archives/liderboard.dat"), true));
    salida_stream.writeObject(datos_partida);
    salida_stream.close();
 
    ObjectInputStream entrada_stream = new ObjectInputStream(new FileInputStream(new File("src/archives/liderboard.dat")));
 
    Datos_liderboard [] datos_liderboard = (Datos_liderboard []) entrada_stream.readObject();
 
    entrada_stream.close();
 
    Arrays.sort(datos_liderboard);
 
    for(Datos_liderboard i: datos_liderboard){
        System.out.println(i);
    }
 
} catch (ClassNotFoundException ex) {
    Logger.getLogger(Lamina_tabla_record.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
    Logger.getLogger(Lamina_tabla_record.class.getName()).log(Level.SEVERE, null, ex);
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 2.717
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Serialización Java un problemita a la hora de leer ayuda pf

Publicado por Kabuto (706 intervenciones) el 19/08/2020 01:51:49
Si haces esto:

Datos_liderboard [] datos_partida = {new Datos_liderboard(resultado, nombre_usuario, cant_kill, dificultad, tiempo_juego, fecha)};

Ese array SIEMPRE va a tener UN único elemento.
No estás agregando elementos al array, estás creando un array nuevo, con un único elemento.

Si quieres guardar distintos datos de partidas, es decir, tener varios objetos Datos_liderboard, no puedes crear un array nuevo cada vez que ejecutas el programa.
Solo has de crearlo una vez e ir añadiendo elementos.
Lo que pasa es que al array, al ser una estructura estática, hay que darle una longitud predeterminada. Tienes que decirle cuántos elementos va a tener: 5, 10, 50....,5000...
Y además controlar en que posición se va a guardar en cada partida: en posición [0] la primera vez, en posición [1] la segunda vez, etc...

Si quieres generar un nuevo registro en cada partida, significa que en realidad no sabes cuántos objetos Datos_liderboard vas a almacenar.

Así que lo ideal sería usar una estructura dinámica, como ArrayList.. No tiene tamaño fijo, irá creciendo a medida que le añadas elementos.


Entonces, otra cosa que has de cambiar,no tiene sentido guardar los datos y acto seguido leerlos del disco. Es innecesario, ya tienes esos datos en memoria si acabas de guardarlos.

Deberías usar dos métodos por separado, uno para guardar los datos. Y otro para leerlos.

La lógica a seguir sería que al arrancar programa, declarar el ArrayList, pero sin inicializarlo

1
ArrayList<Datos_liderboard> datos_liderboard;
Aquí está declarado, pero no inicializado, ahora mismo su valor es null

Tras esto, llamas al método para leer los datos serializados que has guardado. Porque supongo que para eso los guardamos, para recuperarlos cada vez que arrancamos el programa.

Así que invocas dicho método. Si encuentra los datos y los recupera con éxito, perfecto, ahora datos_liderboard es un ArrayList con los datos que se han ido guardando.
Pero, si no encuentra los datos, porque se han borrado, corrompido.. o porque es la primera vez que se ejecuta el programa y por lo tanto no hay datos guardados todavía, entonces hay que inicializar el ArrayList para poder trabajar con él.
1
datos_liderboard = new ArrayList<Datos_liderboard>();
Ahora está inicializado, no tiene registros guardados porque no los hemos encontrado en el disco, pero ya permite que se le añadan nuevos registros.


Y ahora, pues juegas la partida o lo que sea, ya que no se en que consiste tu programa... y cuando la partida finaliza, es entonces cuando llamas al método para guardar datos en disco.
Antes, añades un nuevo registro al ArrayList
1
datos_liderboard.add(new Datos_liderboard(resultado, nombre_usuario, cant_kill, dificultad, tiempo_juego, fecha));
Aquí no estamos machacando como ocurría en tu código antes, aquí estamos agregando un nuevo objeto Datos_liderboard

Y ahora sí, llamas al método encargado de guardar los datos en disco.
Pero repito, solo guardar. No hace falta que acto seguido los lea, porque ya los tiene en memoria.


Así que leemos una sola vez, al arrancar programa.
Y guardamos tras cada partida terminada, no creando una nueva estructura de datos, si no ampliando la estructura (el ArrayList) que ya está creada
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar