2008-09-09 9 views
8

Sun Documentation for DataInput.skipBytes indica que "hace un intento de omitir n bytes de datos de la secuencia de entrada, descartando los bytes omitidos. Sin embargo, puede pasar por alto un número menor de bytes, posiblemente cero. Esto puede ser el resultado de cualquiera de número de condiciones: llegar al final del archivo antes de que se hayan omitido n bytes es solo una posibilidad ".¿Cuándo puede DataInputStream.skipBytes (n) omitir bytes?

  1. Aparte de llegar al final del archivo, ¿por qué podría skipBytes() se salte el número correcto de bytes? (El DataInputStream estoy usando, o bien ser envolver una FileInputStream o una PipedInputStream.)

  2. Si Definitivamente quiero saltar n bytes y lanzar un EOFException si esto me hace ir al final del archivo, debería usar readFully() e ignorar la matriz de bytes resultante? ¿O hay un mejor camino?

Respuesta

5

1) Puede que no haya tantos datos disponibles para leer (el otro extremo de la tubería no podría haber enviado que muchos datos todavía), y la clase que implementa podrían ser no bloqueante (es decir, que sólo se devuelve lo que puede, en lugar de esperar los datos suficientes para cumplir con la solicitud).

No sé si alguna implementación realmente se comporta de esta manera, sin embargo, pero la interfaz está diseñada para permitirlo.

Otra opción es simplemente que el archivo se cierre parcialmente en la lectura.

2) Ya sea readFully() (que siempre esperará la entrada suficiente o fallará) o llame a skipBytes() en un bucle. Creo que lo primero es probablemente mejor, a menos que el conjunto sea realmente vasto.

1

Josh Bloch ha publicado esto recientemente. Es consistente en que no se garantiza que InputStream.read lea tantos bytes como podría. Sin embargo, es completamente inútil como un método API. InputStream probablemente también debería haber leídoFully.

1

Resulta que readFully() agrega más sobrecarga de rendimiento de lo que estaba dispuesto a aguantar.

Al final me he visto comprometido: llamo skipBytes() una vez, y si eso devuelve menos que el número correcto de bytes, llamo readFully() para los bytes restantes.

1

Me encontré con este problema hoy. Estaba leyendo una conexión de red en una máquina virtual, así que imagino que podría haber una serie de razones para que esto ocurra. Lo resolví simplemente forzando la secuencia de entrada para omitir bytes hasta que omitió el número de bytes que quería:

int byteOffsetX = someNumber; //n bytes to skip 
int nSkipped = 0; 

nSkipped = in.skipBytes(byteOffsetX); 
while (nSkipped < byteOffsetX) { 
    nSkipped = nSkipped + in.skipBytes(byteOffsetX - nSkipped); 
} 
Cuestiones relacionadas