Lectura de archivo de objetos

Tengo un formulario mediante el cual cargo en un archivo video. Obj los atributos de un objeto, mi código:

public void escribir() throws FileNotFoundException, IOException
{
FileOutputStream fs = new FileOutputStream("videos.obj",true);
ObjectOutputStream os = new ObjectOutputStream(fs);
if(Integer.parseInt(jTextField1.getText()) > 0)
{
os.writeObject(new Video(Integer.parseInt(jTextField1.getText()),jTextField2.getText(),jTextField3.getText(),Double.parseDouble(jTextField4.getText())));
JOptionPane.showMessageDialog(null, "Video cargado con éxito", "Carga exitosa", JOptionPane.INFORMATION_MESSAGE);
os.close();
}
else
{
JOptionPane.showMessageDialog(null, "El número de cuenta debe ser mayor que cero");
}

}//fin método escritura

Esto me genera el archivo videos. Obj con todas las películas instanciadas mediante el formulario de carga. Ahora bien, mi problema radica al querer leerlo, ya que solamente me da en un jTextArea el primero de los objetos que instancie. No hayo la forma de como recorrer el archivo. Mi código de lectura es:

public void leer() throws FileNotFoundException, IOException, ClassNotFoundException
{
String a = new String();
FileInputStream fs = new FileInputStream("videos.obj");
ObjectInputStream os = new ObjectInputStream(fs);
Video p = (Video) os.readObject();
while(p != null)
{
a = a + String.valueOf(p.obtenerNro() + "\t" + p.obtenerNombre() + "\t" + p.obtenerCategoria() + "\t" + p.obtenerStock());
jTextArea1.setText(a);
p = (Personas) os.readObject();
}
os.close();
}

1 Respuesta

Respuesta
1

Para recorrer el archivo, la condición que debes poner en el bucle while es

while (fs.available())

y leer cada objeto Video dentro del bucle while, es decir la linea Video p = (Video) os.readObject() debe estar dentro del bucle.

De esta forma, recorrerás todo el FileInputStream obteniendo los diferentes ObjectInputStream del archivo.

Gracias por la respuesta, lo he probado así:

public void leer() throws FileNotFoundException, IOException, ClassNotFoundException
{
String a = new String();
FileInputStream fs = new FileInputStream("clientes.obj");
ObjectInputStream os = new ObjectInputStream(fs);
while(fs.available() > 0)
{
Personas p = (Personas) os.readObject();
a = a + String.valueOf(p.obtenerCuenta() + "\t" + p.obtenerNombre() + "\t" + p.obtenerApellido() + "\t" + p.obtenerSaldo());
jTextArea1.setText(a);
}
os.close();
}

me da error actype en la línea: Personas p = (Personas) os.readObject(); del bucle.

Después probé con este oro método para leer el archivo de objetos:

public void lectura()
{
try
{
FileInputStream fs = new FileInputStream("clientes.obj");
ObjectInputStream os = new ObjectInputStream(fs);
Personas a;
boolean fin = false;
String cad = new String();
while(!fin)
{
a = (Personas) os.readObject();
cad = cad + String.valueOf(a.obtenerCuenta() + "\t" + a.obtenerNombre() + "\t" + a.obtenerApellido() + "\t" + a.obtenerSaldo()+ "\n");
jTextArea1.setText(cad);
}
}
catch(EOFException eof)
{
JOptionPane.showMessageDialog(null, "Se alcanzó el final");
}
catch(ClassNotFoundException cla)
{
JOptionPane.showMessageDialog(null, "Error el tipo de objeto no es compatible");
}
catch(FileNotFoundException not)
{
JOptionPane.showMessageDialog(null, "No se encontró el archivo");
}
catch(IOException e)
{
JOptionPane.showMessageDialog(null, e.getMessage());
}
}

Y me da una excepción: Invalid Type code AC después de leer el primer objeto y colocarlo en el jtextarea. Se podrá leer con el ObjectInputStream?

El problema es que las clases ObjectOutputStream (OOS) y ObjectInputStream (OÍS) tienen un comportamiento muy extraño. Me explico, cuando abres un OOS para guardar datos, lo primero que hace es grabar una cabecera cuyo código es (0xAC), incluso aunque anteriormente hubiera datos en ese stream. Entonces al leerlo, encuentra la cabecera (que es un valor que no espera) y da el error.

Una solución a este problema es o utilizar otras clases para la escritura / lectura en un fichero o cuando vayas a guardar un dato, extraer lo que hubiera antes en el fichero, anexarle el nuevo objeto y volverlo a grabar todo machacando lo que hubiera en el archivo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas