Problema al leer objetos con ObjectInputStream

Iniciado por peib0l, 5 Marzo 2015, 14:38 PM

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

peib0l

Buenos días resulta que ya estoy un poco harto de errores raros y no se de donde me vienen tengo problemas al leer objetos, mi lógica me dice que esta bien, pero me salta error

Código (java) [Seleccionar]

        java.io.EOFException
        at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2601)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1319)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at Principal.importarProductos(Principal.java:101)
at Principal.main(Principal.java:26)



Con este método leo los objetos
Código (java) [Seleccionar]
private static void importarProductos(){
ArrayList<Producto> arrayAuxiliar = new ArrayList<Producto>();
ObjectInputStream ois = null;
Object aux = null;
try {
ois = new ObjectInputStream(new FileInputStream("./estanteria.obj"));

aux = ois.readObject();         

while (aux!=null)
{
    if (aux instanceof Producto)
        System.out.println(aux);
    aux = ois.readObject();
}


} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("es del fichero");
} catch (IOException e) {
e.printStackTrace();
System.out.println("es IO");
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("de la clase si que no");
}finally{
try{
ois.close();
}catch(IOException f){}
}

}



Este es el metodo que uso para Guardarlos:
Código (java) [Seleccionar]

private static void exportaProductos(ArrayList p){
ObjectOutputStream fichero = null;
try {
fichero = new ObjectOutputStream(new FileOutputStream("./estanteria.obj"));
for(int x = 0; x<p.size(); x++){
fichero.writeObject(p.get(x));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try{
fichero.close();
}catch(IOException f){}

}
}



Usuario Invitado

#1
EOFException indica que se ha llegado al final de un archivo y ya no hay nada más que leer. Por lo que si tu no pones una condición que se lea mientras haya objetos en el archivo, obviamente se va a leer hasta que se llegue al final del archivo, y como no hay ya objetos, no se podrá leer por lo que lanzará un EOFException.


Deberías leer tu fichero así:

Código (java) [Seleccionar]
private List<Product> readProducts() {
List<Product> products = null;
Logger logger = Logger.getLogger(Principal.class.getName());
try (ObjectInputStream reader = new ObjectInputStream(
new FileInputStream("./estanteria.obj"))) {
                products = new ArrayList<>();
Product product = null;
while( (product = (Product) reader.readObject() ) != null ) {
Product product = (Product) reader.readObject();
products.add(product);
}
} catch(IOException ioex) {
logger.warn(ioex.getMessage());
}
       return products;
}


Como puedes ver no es que sean "erorres raros". Java tiene un amplio número de Excepciones para que el programador pueda ver el fallo con precisión. Tan solo basta analizar el rastreo de pila y darás con el problema.

Otra cosa, ¿estás usando Java 6? Lo digo porque usas Generics como en Java 6:

Código (java) [Seleccionar]
List<Product> products = new ArrayList<Product>();

En Java 7+, esto se hace:

Código (java) [Seleccionar]
List<Product> products = new ArrayList<>();

Si usas Java 6, te recomiendo que empieces a usar Java 8.

Saludos.
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

peib0l

Muchas Gracias Gus, me vas a tener que dar unas clases de Java para actualizarme.

Usuario Invitado

Será un placer ayuda en lo que pueda. Soy Java evangelist xDDD
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein