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
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
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:
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){}
}
}
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í:
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:
List<Product> products = new ArrayList<Product>();
En Java 7+, esto se hace:
List<Product> products = new ArrayList<>();
Si usas Java 6, te recomiendo que empieces a usar Java 8.
Saludos.
Muchas Gracias Gus, me vas a tener que dar unas clases de Java para actualizarme.
Será un placer ayuda en lo que pueda. Soy Java evangelist xDDD