EOFException al leer archivos con ObjectInputStream

Básicamente tengo un problema similar al que se indica aquí: EOFexception en Java cuando se lee objectinputstream , pero no encuentro una respuesta con código limpio.

La respuesta indica que ObjectInputStream#readObject lanzará la excepción cuando el lector llegue al final del archivo. Después de buscar en la web una solución, no encontré una solución. ¿Podría ser una solución buena y limpia para este caso?

Nota: He intentado esto (pero se ve feo y no es código limpio). Estoy buscando una mejor solución:

 ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file)); try { Object o; while ((o = ois.readObject()) != null) { if (o instanceof MyClass) { MyClass m = (MyClass)o; //use the object... } } } catch (EOFException eofex) { //do nothing } catch (IOException ioex) { throw ioex; //I have another try/catch block outside to control the life of the ObjectInputStream } //later in the code... ois.close(); 

Eso es lo que se supone que debe suceder. Tu código es incorrecto Compruebe el Javadoc. readObject() solo devuelve null si escribió un null . No dice nada sobre devolver un nulo en EOF. Looping hasta que readObject() devuelva null solo se detendrá si alguna vez escribió un null través de writeObject() , y si no lo hizo, obtendrá una EOFException .

La respuesta de @ EJP lo ha logrado.

Sin embargo, si usted es un miembro pago del club “excepciones no debe usarse para el control de flujo normal” * , puede evitar tener que atrapar la excepción si puede usar otros medios para determinar cuándo detenerse; por ejemplo

  • Puede iniciar la transmisión con un conteo enviado como un objeto int o Integer .
  • Puede marcar el final de la secuencia enviando un null .
  • Puede marcar el final de la secuencia enviando un objeto especial que significa “este es el final”. No necesita ser una instancia de MyClass .
  • Podría enviar una List … aunque eso significa que no puede “transmitir” los objetos.

Tenga en cuenta que esto implica que puede cambiar el código del lado del remitente …


* La membresía de este club requiere la capacidad de asimilar argumentos circulares o la voluntad de aceptar ciegamente el dogma como verdad. 🙂


En lugar de repetir los argumentos ad nauseam , aquí hay algunos enlaces a algunas de mis respuestas relacionadas con el debate del “control de flujo normal”:

  • Costo del compuesto si / o contra try / catch en Java 6
  • ¿Cuál es una alternativa a las excepciones para el control de flujo?
  • Regex o manejo de excepciones?
  • Compruebe si existe un archivo antes de llamar a openFileInput
  • Que es más rápido, prueba catch o if-else en java (rendimiento de WRT)

Si lees a través de ellos, verás que no baje firmemente a cada lado de la valla. Más bien, mi punto de vista es que debe entender las concesiones y tomar una decisión sobre si las excepciones son apropiadas o no caso por caso.

Puedes intentar esto:

 boolean check=true; while (check) { try{ System.out.println(ois.readObject()); } catch(EOFException ex){ check=false; } } 

Mientras que readObject() no devuelve NULL cuando llega al final de un archivo, si controlas el archivo desde su inicio, siempre puedes agregar NULL justo antes de cerrar tu flujo de salida. Se pasará como un objeto, pero luego puede probar el final del archivo como tal:

 Boolean complete = false; ObjectInputStream in = < ...> while(complete != true) { Object test = (Object)in.readObject(); if(test != null) { someArrayList.add(test); } else { complete = true; } }