2009-03-19 31 views
13

Estoy trabajando con un DataInputStream y tengo una pregunta sobre EOFExceptions.Cuándo se producirá una EOFException en las transmisiones de JAVA

Según docs java:

Señales de que un extremo del archivo o al final de corriente se ha alcanzado de forma inesperada durante la entrada.

Esta excepción se utiliza principalmente por los flujos de entrada de datos para señalizar el final del flujo. Tenga en cuenta que muchas otras operaciones de entrada devuelven un valor especial al final de la corriente en lugar de arrojar una excepción .

¿Esto significa que cuando se genera una EOFException, la transmisión NUNCA volverá a abrirse? ¿Significa que NUNCA deberías esperar más datos de eso alguna vez?

Si un outputtream está conectado a un inputstream y se llama a outputstream.close(), ¿un inputstream recibirá la EOFException o una IOException?

Un IOException se describe como:

Las señales que se ha producido una excepción de E/S de algunos tipo. Esta clase es la clase general de excepciones producidas por operaciones de E/S fallidas o interrumpidas .

¿Un cierre en la salida produce una EOFException o una IOException en el lado de la salida de datos en la salida?

+0

Para referencia de otros: [esta respuesta] (http://stackoverflow.com/a/16513645/691859) explica por qué se lanza 'EOFException' en lugar de los métodos que devuelven un valor especial. – 2rs2ts

Respuesta

7

La palabra clave es inesperada.

Si usa DataInputStream y lee un entero de 4 bytes pero solo quedan 3 bytes en la transmisión, obtendrá una EOFException.

Pero si llama a read() al final de la transmisión, obtendrá -1 de vuelta y ninguna excepción.

+0

La respuesta simplemente aumenta la confusión. read() devuelve -1, readLine() devuelve null, readXXX() para cualquier otra X arroja EOFException. – EJP

3

EOFException es una subclase de IOException. Se lanzará si intenta leer de la transmisión y no hay más datos para leer (por ejemplo, porque su DataInputStream se ajusta a un FileInputStream y está tratando de leer más bytes de los que quedan en el archivo).

+0

, pero ¿cómo sabrá el datainputstream que no hay más bytes? En otras palabras, solo porque leo y no veo ningún dato no significa que el archivo (en una secuencia de entrada de archivo) haya finalizado. Puede ser que los bytes aún no hayan llegado. No veo que FileInputStream devuelva EOF en documentos. – jbu

+0

Con un archivo, sabes cuándo has llegado al final. El archivo FileInputStream envuelto arrojaría una EOFException, que se propaga por el DataInputStream a su código. –

+2

@SimonNickerson +1 pero tu comentario es incorrecto. FileInputStream no arroja EOFException. Sus métodos read() devuelven -1. DataInputStream ve eso y arroja EOFException. – EJP

3

Respondiendo a otra parte de su pregunta: Sí, EOF significa que no se verán más datos en la transmisión; deberías cerrarlo

1

EOFException se lanza:

  1. si no hay datos en una corrientepero usted está tratando de leer ... por ejemplo, métodos de lectura de los flujos de cadena como DataInputStream, ObjectInputStream, RandomAccessFile tirar EOFException si están tratando de leer desde FileInputStream pero el FileInputStream está vacío
  2. o si los formatos no coinciden ...por ejemplo, si int está presente y está utilizando readFloat() de DataInputStream
+1

El punto 2 no es correcto. Claramente no lo has probado. Lo que describes es imposible. No hay información de formato en un DataInputStream para la transmisión de prueba. También sería irracional lanzar EOFException cuando la transmisión no esté vacía. – EJP

5

Cuando se llega al final de una corriente (final del archivo, o de igual cierra la conexión):

  • read() devuelve -1
  • readLine() devuelva null
  • readXXX() para cualquier otro X lanza EOFException.

La transmisión sigue abierta, pero debe dejar de leer y cerrarla.

Cuestiones relacionadas