tutorial sirve que para definicion clase io java

sirve - java nio



¿Cuándo puede DataInputStream.skipBytes(n) omitir bytes? (4)

1) Es posible que no haya tantos datos disponibles para leer (el otro extremo de la tubería podría no haber enviado tantos datos todavía), y la clase implementadora podría ser no bloqueante (es decir, devolverá lo que puede, en lugar de esperando suficiente información para cumplir con la solicitud).

No obstante, no sé si alguna implementación se comporta de esta manera, 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á suficiente entrada o fallará) o llame a skipBytes () en un bucle. Creo que lo primero es probablemente mejor, a menos que el conjunto sea realmente vasto.

La documentación de Sun para 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 una serie de condiciones: llegar al final del archivo antes de que se hayan omitido n bytes es solo una posibilidad ".

  1. Además de llegar al final del archivo, ¿por qué skipBytes() no salta el número correcto de bytes? (El DataInputStream que estoy utilizando va a envolver un FileInputStream o un PipedInputStream ).

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


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.


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 a la secuencia de entrada a 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); }


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

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