Desesperacion Serializable

rasape
19 de Agosto del 2005
Tengo un fichero de texto que es donde guardo objetos serializados de tipo Persona(String telefono, String nombre)

Mi problema es que cuando quiero recuperar todos los objetos del archivo, solo recupero el primero, estoy desesperado, he probado todo lo que he encontrado en la web, pero no obtengo resultados.

jaquiso
19 de Agosto del 2005
El problema es que cuando se escribe en un fichero un Objeto serializado se escriben también una serie de cabeceras. Como estas añadiendo los nuevos Objetos a base de abrir y cerrar el fichero cada vez estas generando estas cabeceras varias veces y entremezcladas con la informacion de los Objetos.
Puedes solucionar esto de una de estas maneras:
- cada vez que guardes un alumno tienes que previamente recuperar los alumnos anteriores y volver a escribirlos junto con el nuevo alumno, cerrando despues el ObjectOutputStream.
- la otra solución es hacer esto mismo pero a nivel de aplicación, es decir que cuando se cargue la aplicación recuperas todos los Alumnos y los guardas en memoria (en una coleccion por ejemplo) y trabajas sobre esta coleccion en vez de sobre el fichero. Al cerrar la aplicacion guardas esta coleccion en el fichero, sobreescribiendo la informacion anterior.

Espero que con esto te valga, sino cuentame.

rasape
19 de Agosto del 2005
No hay manera, te agradeceria que miraras el sigiente codigo y me comentaras como lo ves

import java.io.*;
import javax.swing.*;
import java.util.*;
public class Serializar
{

private FileInputStream fis=null;
private ObjectInputStream ois=null;
private FileOutputStream fos=null;
private ObjectOutputStream oos=null;

public Serializar()
{
}
public void crearFichero(ArrayList tabla)
{
try
{
FileOutputStream fos=new FileOutputStream ("caca.txt");
ObjectOutputStream oos=new ObjectOutputStream (fos);

Iterator it=tabla.iterator();
while(it.hasNext())
{
oos.writeObject((Alumno)it.next());
System.out.println(it.next().toString());
}
oos.close();
}
catch(Exception io)
{
io.printStackTrace();
}
}
public void recuperarAtabla(ArrayList tabla)
{
try
{
FileInputStream fis=new FileInputStream ("caca.txt");
ObjectInputStream ois=new ObjectInputStream (fis);

while(ois.available()!=0)
{
Object o =((Alumno)ois.readObject());
tabla.add(o);
}
ois.close();

}
catch(Exception io)
{
io.printStackTrace();
}
}
public void salvarAfichero(ArrayList tabla)
{
try
{
FileOutputStream fos=new FileOutputStream ("caca.txt");
ObjectOutputStream oos=new ObjectOutputStream (fos);

Iterator it=tabla.iterator();
while(it.hasNext())
{
oos.writeObject(it.next());
System.out.println(it.next().toString());
}
oos.close();
}
catch(Exception io)
{
io.printStackTrace();
}
}
}
////////////////////////////////////
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.io.*;
import java.util.*;
public class Ventana extends JFrame implements ActionListener
{

private ArrayList tabla=new ArrayList();

//demas componentes de JFrame
public Ventana()
{
s.crearFichero(tabla);
//demas metodos
}
public void actionPerformed (ActionEvent ev)
{
String aux=((JButton)ev.getSource()).getText();

if(aux=="GUARDAR")
{
String d=dni.getText();
String n=nombre.getText();
d.trim();
n.trim();
Alumno a= new Alumno(n,d);
tabla.add(a);
}
if(aux=="BUSCAR")
{
String ddni=(dni.getText());
String devuelto="no se encuentra";
Iterator it=tabla.iterator();
s.recuperarAtabla(tabla);
while(it.hasNext())
{
if(ddni==((Alumno)it.next()).getDni())
{
devuelto=((Alumno)it.next()).getNombre();
}
}
nombre.setText(devuelto);
}
if(aux=="CERRAR")
{
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

public void comprobar()
{
int sw=0;
int aux=0;
try
{
FileInputStream fr=new FileInputStream("pepe.txt");
ObjectInputStream ois=new ObjectInputStream(fr);
}
catch(FileNotFoundException io)
{
io.printStackTrace();
}
catch(IOException io)
{
io.printStackTrace();
}
}
public void setNombre(String par)
{
nombre.setText(par);

}
public void windowClosing(WindowEvent ev)
{
s.salvarAfichero(tabla);
System.exit(0);
}
}

fady
19 de Agosto del 2005
pero cuenta como lo haces, has mirado si guardas toda la informacion en el .txt??? saludos

rasape
19 de Agosto del 2005
/* Los objetos son de Alumno, he hecho tantos ejemplos*/

import java.io.Serializable;
public class Alumno implements Serializable
{
private String dni;
private String nombre;
public Alumno(String p1,String p2)
{
dni=p1;
nombre=p2;

}

public String getDni()
{
return dni;
}
public String getNombre()
{
return nombre;
}
public void setDni(String par)
{
dni=par;
}
public void setNombre(String par)
{
nombre=par;
}
public String toString()
{
return dni+" "+nombre;
}
}
//////////////////////////////////////////
import java.io.*;
import javax.swing.*;
public class Serializar
{
public void guardar(Alumno a)
{
try
{
FileOutputStream fos=new FileOutputStream ("c:\\caca.txt",true);
ObjectOutputStream oos=new ObjectOutputStream(fos);
oos.writeObject(a);
oos.close();
}
catch(IOException io)
{
io.printStackTrace();
}
}
public void buscar()
{
int sw=0;
try
{
FileInputStream fis=new FileInputStream("c:\\caca.txt");
ObjectInputStream ois=new ObjectInputStream(fis);
while((fis.available()!=0))
{
Alumno al=(Alumno)ois.readObject();
tabla.add(al);
System.out.println(al.toString());
}
ois.close();
}
catch(FileNotFoundException e)
{
System.out.println("Fichero no fue encontrado: " + e);
System.exit(1);
}
catch(IOException e)
{
System.out.println("IOException: " + e);
System.exit(1);
}
}
}

///////////////////////
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.io.*;
public class Ventana extends JFrame implements ActionListener
{
private JLabel ldni=new JLabel("DNI");
private JLabel lnombre=new JLabel("NOMBRE");
private JTextField dni=new JTextField(" ");
private JTextField nombre=new JTextField(" ");
private JButton bguardar=new JButton("GUARDAR");
private JButton bbuscar=new JButton("BUSCAR");
public Ventana()
{
bguardar.addActionListener(this);
bbuscar.addActionListener(this);

JPanel p1=new JPanel();
JPanel p2=new JPanel();
JPanel p3=new JPanel();

p1.setLayout(new FlowLayout());
p2.setLayout(new FlowLayout());
p1.add(ldni);
p1.add(dni);
p2.add(lnombre);
p2.add(nombre);
p3.add(bguardar);
p3.add(bbuscar);

this.setSize(200,200);
this.getContentPane().add(p1);
this.getContentPane().add(p2);
this.getContentPane().add(p3);
this.getContentPane().setLayout(new GridLayout(3,1,4,4));
this.setVisible(true);
}
public void actionPerformed (ActionEvent ev)
{
String aux=((JButton)ev.getSource()).getText();

if(aux=="GUARDAR")
{
Serializar s=new Serializar();
String d=dni.getText();
String n=nombre.getText();
d.trim();
n.trim();
Alumno a= new Alumno(n,d);

s.guardar(a);
}
if(aux=="BUSCAR")
{
Serializar s=new Serializar();
String ddni=(dni.getText());
s.buscar();
}
}
}

//Si puedes ayudarme, te lo agradecere

rasape
19 de Agosto del 2005
Los objetos aparentemente si se guardan en el archivo