[SOLUCIONADO] Leer varios objetos de un archivo.dat con .readObject() (JAVA)

Iniciado por francomat, Noviembre 11, 2016, 06:14:42 PM

Tema anterior - Siguiente tema

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

Estoy haciendo un pacman en java y quiero guardar un TOP 5 de los mejores puntajes. Para esto primero quiero guardar en un archivo .dat los Objetos jugador que luego voy a intentar abrir.
Mi problema es que al leer, solo me tira el primer objeto y luego me dice que llego al final de archivo

Este es el método que se encarga de abrir el archivo
Código: php
	public void AbrirTop() throws ClassNotFoundException, IOException{
ObjectInputStream entrada=null;
try {
entrada=new ObjectInputStream(new FileInputStream("src/datos.dat"));

for(int i=0; i<5000; i++){

[b]TopJugadores=(Jugador) entrada.readObject();[/b]
System.out.println(TopJugadores.getNombre());
System.out.println(TopJugadores.getPuntFinal());

//entrada.close();
}


} catch (FileNotFoundException e) {
System.out.println("no se encuentra el archivo .dat");
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("Final de archivo");
}


Este es el método que utilizo para guardar los objetos, creeria que se guardan bien, a groso modo intente abrir el archivo.dat y pareciera que guarda uno despues del otro.

Código: php
	public void GuardarJugador() throws ClassNotFoundException, IOException {

//Jugador UnJugador=new Jugador();

//UnJugador.setPuntFinal(this.getPuntos());
String nombre=JOptionPane.showInputDialog(null, "Introduce tu nombre");
//UnJugador.setNombre(nombre);
ObjectOutputStream salida=null;
Jugador UnJugador=new Jugador(nombre,this.getPuntos());

try {


salida = new ObjectOutputStream(new FileOutputStream("src/datos.dat",true));
salida.writeObject(UnJugador);

//salida.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("No se encontro archivo");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}


Les agradecería algo de ayuda y cualquier recomendación sobre el código ya que es la primera vez que utilizo las api de java.

Noviembre 12, 2016, 06:15:08 AM #1 Ultima modificación: Noviembre 12, 2016, 07:14:03 AM por Hu3c0
Hola compi te voy a ayudar y te voy a decir como lo haría y te voy a indicar un enlace para que te inspires:

[1] Crearía un objeto jugador como atributos (nombre, puntuaciónfinal)

[2] Ahora necesito  almacenar esos Objetos en algun sitio y lo hago en un  List o ArrayList Object
     Ejemplo: Orientativo para su comprensión;
     List<Object> quarks = Arrays.asList(
      Cada uno de los objetos se almacena aquí para luego extraerlos
    );

[3] Ahora voy a meter todos esos objetos en un archivo
    try (
      OutputStream file = new FileOutputStream("quarks.ser");
      OutputStream buffer = new BufferedOutputStream(file);
      ObjectOutput output = new ObjectOutputStream(buffer);
    ){
      output.writeObject(quarks);
    } 
    catch(IOException ex){
      fLogger.log(Level.SEVERE, "Cannot perform output.", ex);
    }

[4] Ahora voy a leer el contenido de esos datos que estan en ese file
      InputStream file = new FileInputStream("quarks.ser");
      InputStream buffer = new BufferedInputStream(file);
      ObjectInput input = new ObjectInputStream (buffer);

[5] Ahora los vuelvo a meter en List de String o en un ArrayList como quieras
     List <Object> recoveredQuarks = (List<Object>)input.readObject();

[6] Ahora procedo a leer e imprimir mientras que haya contenido
     //Puedes hacerlo con un for  o con un while y mientras hayan objetos irá imprimiendo
     for(Object  quark: recoveredQuarks){
        System.out.println("Recovered Quark: " + quark);
      }

Espero no se me haya pasado nada por encima y haberte sido de utilidad y te doy las gracias
porque me has hecho aprender a mi también.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta



No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Hola gracias por responder, intente hacer dos métodos desde cero siguiendo el ejemplo que pasaste el problema es que ahora no me guarda los objetos, cuando sale del método GuardarArchivo el archivo .dat que se produce esta en blanco.

Código: php
public void GuardarArchivo() throws IOException{
String nombre=JOptionPane.showInputDialog(null, "Introduce tu nombre");
Jugador UnJugador=new Jugador(nombre, this.puntajeTotal);
Jugador SegundoJugador=new Jugador("asd", 79);


  OutputStream file;
try {
file = new FileOutputStream("src/datos.dat", true);
OutputStream buffer = new BufferedOutputStream(file);
ObjectOutput output = new ObjectOutputStream(buffer);
    List<Jugador> top= Arrays.asList(UnJugador, SegundoJugador);
    System.out.println(top.size());
    output.writeObject(top);
 
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("Archivo no encontrado");
} catch (IOException e) {
System.out.println("fin de archivo");
}
   
}

Les dejo el metodo LeerArchivo por las dudas
Código: php
public void GuardarArchivo() throws IOException{
String nombre=JOptionPane.showInputDialog(null, "Introduce tu nombre");
Jugador UnJugador=new Jugador(nombre, this.puntajeTotal);
Jugador SegundoJugador=new Jugador("asd", 79);


  OutputStream file;
try {
file = new FileOutputStream("src/datos.dat", true);
OutputStream buffer = new BufferedOutputStream(file);
    @SuppressWarnings("resource")
ObjectOutput output = new ObjectOutputStream(buffer);
    List<Jugador> top= Arrays.asList(UnJugador, SegundoJugador);
    System.out.println(top.size());
    output.writeObject(top);
 
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("Archivo no encontrado");
} catch (IOException e) {
System.out.println("fin de archivo");
}
   
}

No tengo idea por no lo guarda intente guardar al menos un int con el metodo .WriteInt() y nada ??? ??? ???

Hola amigo  yo lo que haría es ir haciendo pruebas de uno en uno es decir:

//vamos a crear un objeto lo instanciamos y lo inicilizamos usando su constructor:
Jugador  jugadoruno=new Jugador("asd", 79);

Mira vamos a cambiar un poco la cosa ahora vamos a crear una arraylist de objeto asi

ArrayList <jugador>   colecciondatos= new ArrayList <jugador> ();

//Ahora le añadimos el objeto que esta ya en memoria y lo metemos en el ArrayList

colecciondatos.add(jugadoruno);

//Ahora vamos a proceder con el código anterior
try (
      OutputStream file = new FileOutputStream("quarks.ser");
      OutputStream buffer = new BufferedOutputStream(file);
      ObjectOutput output = new ObjectOutputStream(buffer);
    ){
      output.writeObject(colecciondedatos);
    }
    catch(IOException ex){
      fLogger.log(Level.SEVERE, "Cannot perform output.", ex);
    }

//A partir de aquí lo que haría sería revisar el archivo a ver si se ha insertado el objeto
//entonces luego añadiría otro objeto más  y revisaría ese archivo.

La verdad es que existen más formas de realizar lo que  quieres por ejemplo usando
una Base de Datos e ir insertando los Datos en una tabla usuarios y luego consultando
y extrayendo los datos de la misma.

Otra alternativa sería crear un archivo xml e ir añadiendole etiquetas con sus respectivos
atributos, y después utilizando la libreria document y otra más que no me acuerdo ahora
mismo  pues se lee el DOM de ese archivo xml y se extrae la información de cada uno de
sus elementos.

Aquí te aporto algo de documentación sobre como leer y escribir un xml

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

A mi me encanta java ahora lo tengo un poco de lado porque estoy con php y javascritpt
y muchas más cosas pero en cuanto termine me pongo manos a la obra.

Espero no haberte enturbiado más saludos










No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Noviembre 13, 2016, 06:58:43 AM #4 Ultima modificación: Noviembre 13, 2016, 07:13:55 AM por Hu3c0
Hola vuelvo a comentarte un poquito sobre el tema vamos a ver lo que quieres hacer es:
Guardar en una computadora los datos de los jugadores sin usar una bd y almacenándolo
en un archivo.

¡Bien! yo  te ofrezco una manera de hacerlo y es en un archivo xml ¿Cómo? pues te voy
a dar una pequeña ayuda para su comprensión.

Imagina este va a ser nuestro archivo xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xml>
   <jugador>

       <usuario>
          <id>asd</id>
          <lastpuntuacion>78</lastpuntuacion>
        </usuario>

         <usuario>
          <id>Hu3c0</id>
          <lastpuntuacion>12</lastpuntuacion>
          </usuario>

         <usuario>
          <id>francomat</id>
          <lastpuntuacion>11000</lastpuntuacion>
        </usuario>
       
     
   </jugador>
</xml>

Bueno  esa sería la estructura de nuestro archivo xml como se puede apreciar tenemos
un elemento raíz que a su vez tiene anidado subelementos que son los usuarios  con sus
respectivos atributos id y lastpuntuacion oséa recapitulemos sería como un objeto con sus
atributos y el nodo raiz vendría a ser el arraylist que almacenaría los objetos jugador.

¡ pues ya esta!  eso es lo que quieres tú almacenar los datos de la partida y una forma de
hacerlo  a menos que los requerimientos lo exigan es con un documento xml.

En la url que compartí contigo arriba se explica claramente como insertar datos en un xml
y como extraerlos.

Lo que me gusta de la programación es que cada uno creamos un algoritmo distinto para
llegar al mismo camino  de resolución del problema.

Por mi parte queda concluida la ayuda a la resolución de problema suerte en tu investigación


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Noviembre 14, 2016, 10:47:41 PM #5 Ultima modificación: Noviembre 14, 2016, 10:52:58 PM por francomat
Hola hueco gracias por ayudarme a solucionar el problema. Por lo que estuve leyendo el problema son los bytes de cabecera que se escriben cada vez que se crea un ObjectOutputStream, por lo que la única solución es leer en el mismo momento en que escribes sin cerrar el flujo de datos (Deberia hacerlo todo en un mismo metodo, algo que a mi no me sirve).

Por lo que me dedique hacerlo como lo dijiste desde un principio, guardando directamente un ArrayList en el archivo.dat.
Comparto el codigo para alguien que le pueda servir de inspiracion  :P
Leer archivo
Código: php
public void AbrirTop() throws ClassNotFoundException, IOException{
ObjectInputStream entrada=null;
FileInputStream file= new FileInputStream("src/datos.dat");
try {

entrada=new ObjectInputStream(file);
ArrayList<Jugador> lista;

while(entrada!=null){

lista=(ArrayList<Jugador>) entrada.readObject();
Jugador UnJugador=lista.get(0);
System.out.println(UnJugador.getNombre());
System.out.println(UnJugador.getPuntFinal());
Jugador OtroJugador=lista.get(1);
System.out.println(OtroJugador.getNombre());
System.out.println(OtroJugador.getPuntFinal());

//entrada.close();
}


} catch (FileNotFoundException e) {
System.out.println("no se encuentra el archivo .dat");
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("fin de archivo");
}finally{
file.close();
}

}


Guardar archivo
Código: php
public void GuardarJugador() throws ClassNotFoundException, IOException {

String nombre=JOptionPane.showInputDialog(null, "Introduce tu nombre");
ObjectOutputStream salida=null;

Jugador UnJugador=new Jugador(nombre,this.getPuntos());
Jugador OtroJugador=new Jugador("pepe", 75);

ArrayList<Jugador> lista= new ArrayList<Jugador>();
lista.add(UnJugador);
lista.add(OtroJugador);
FileOutputStream file= new FileOutputStream("src/datos.dat");
try {


salida = new ObjectOutputStream(file);
salida.writeObject(lista);


} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("No se encontro archivo");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
file.close();
salida.close();
}


}


Otra cosa, los arraylist ya implementa la interfaz serializable por lo que no es necesario utilizar el metodo Arrays.asList(). No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Respecto con lo que dices mas arriba, es verdad de que hay mas formas de realizarlo y creo que lo mas simple era guardarlo en un archivo de texto plano, pero bueno me habia enroscado con esta formula y de paso aprender algo  :o :o

Gracias otra vez y saludos !

Noviembre 15, 2016, 05:24:06 AM #6 Ultima modificación: Noviembre 15, 2016, 05:29:15 AM por Hu3c0
Hola @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta  muchas gracias por haber comentado y por postear la resolución al problema así
este post le podrá servir a alguien que en el futuro tenga un problema similar.

Cualquier cosa estamos por aquí para aprender juntos porque yo lo sigo haciendo todos los días
y esto no tiene fin.

Suerte en nuestras investigaciones.
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta