Foro de elhacker.net

Programación => Java => Mensaje iniciado por: peib0l en 5 Marzo 2015, 14:38 pm



Título: Problema al leer objetos con ObjectInputStream
Publicado por: peib0l en 5 Marzo 2015, 14:38 pm
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
  1.        java.io.EOFException
  2.        at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2601)
  3. at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1319)
  4. at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
  5. at Principal.importarProductos(Principal.java:101)
  6. at Principal.main(Principal.java:26)
  7.  


Con este método leo los objetos
Código
  1. private static void importarProductos(){
  2. ArrayList<Producto> arrayAuxiliar = new ArrayList<Producto>();
  3. ObjectInputStream ois = null;
  4. Object aux = null;
  5. try {
  6. ois = new ObjectInputStream(new FileInputStream("./estanteria.obj"));
  7.  
  8. aux = ois.readObject();          
  9.  
  10. while (aux!=null)
  11. {
  12.    if (aux instanceof Producto)
  13.        System.out.println(aux);
  14.    aux = ois.readObject();
  15. }
  16.  
  17.  
  18. } catch (FileNotFoundException e) {
  19. e.printStackTrace();
  20. System.out.println("es del fichero");
  21. } catch (IOException e) {
  22. e.printStackTrace();
  23. System.out.println("es IO");
  24. } catch (ClassNotFoundException e) {
  25. e.printStackTrace();
  26. System.out.println("de la clase si que no");
  27. }finally{
  28. try{
  29. ois.close();
  30. }catch(IOException f){}
  31. }
  32.  
  33. }
  34.  


Este es el metodo que uso para Guardarlos:
Código
  1. private static void exportaProductos(ArrayList p){
  2. ObjectOutputStream fichero = null;
  3. try {
  4. fichero = new ObjectOutputStream(new FileOutputStream("./estanteria.obj"));
  5. for(int x = 0; x<p.size(); x++){
  6. fichero.writeObject(p.get(x));
  7. }
  8. } catch (FileNotFoundException e) {
  9. e.printStackTrace();
  10. } catch (IOException e) {
  11. e.printStackTrace();
  12. }finally{
  13. try{
  14. fichero.close();
  15. }catch(IOException f){}
  16.  
  17. }
  18. }
  19.  



Título: Re: Problema al leer objetos con ObjectInputStream
Publicado por: Usuario Invitado en 5 Marzo 2015, 15:57 pm
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
  1. private List<Product> readProducts() {
  2. List<Product> products = null;
  3. Logger logger = Logger.getLogger(Principal.class.getName());
  4. new FileInputStream("./estanteria.obj"))) {
  5.                products = new ArrayList<>();
  6. Product product = null;
  7. while( (product = (Product) reader.readObject() ) != null ) {
  8. Product product = (Product) reader.readObject();
  9. products.add(product);
  10. }
  11. } catch(IOException ioex) {
  12. logger.warn(ioex.getMessage());
  13. }
  14.        return products;
  15. }

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
  1. List<Product> products = new ArrayList<Product>();

En Java 7+, esto se hace:

Código
  1. List<Product> products = new ArrayList<>();

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

Saludos.


Título: Re: Problema al leer objetos con ObjectInputStream
Publicado por: peib0l en 5 Marzo 2015, 17:37 pm
Muchas Gracias Gus, me vas a tener que dar unas clases de Java para actualizarme.


Título: Re: Problema al leer objetos con ObjectInputStream
Publicado por: Usuario Invitado en 5 Marzo 2015, 18:14 pm
Será un placer ayuda en lo que pueda. Soy Java evangelist xDDD