2010-02-23 22 views

Respuesta

16

La única situación en la que un InputStream puede volver 0 de una llamada a read(byte[]) es cuando el byte[] aprobada en tiene una longitud de 0:

byte[] buf = new byte[0]; 
int read = in.read(buf); // read will contain 0 

Como se especifica por esta parte de la JavaDoc:

Si la longitud de b es cero, entonces no hay bytes se leen y se devuelve 0

Supongo que usaste available() para ver qué tan grande debe ser el buffer y devolvió 0. Tenga en cuenta que este es un uso indebido de available(). JavaDoc declara explícitamente que:

Nunca es correcto utilizar el valor de retorno de este método para asignar un búfer destinado a contener todos los datos en esta secuencia.

+2

Acepto: > Este método bloquea hasta que haya datos de entrada disponibles, se haya detectado el final del archivo o se haya lanzado una excepción. > Si la longitud de b es cero, no se leen bytes y se devuelve 0; de lo contrario, hay un intento de leer al menos un byte. > Si no hay ningún byte disponible porque la secuencia se encuentra al final del archivo, se devuelve el valor -1; de lo contrario, al menos un byte se lee y almacena en b. Gracias! –

10

Eche un vistazo a la implementación de javax.sound.AudioInputStream # read (byte [] b, int off, int len) ... yuck. Violaron por completo la semántica estándar de java.io.InputStream y devolvieron un tamaño de lectura de 0 si solicita menos de un marco de datos completo.

Desafortunadamente; el consejo común (y la especificación api) deberían evitar tener que lidiar con el retorno de cero cuando len> 0, pero incluso para las clases proporcionadas por JDK, no se puede confiar universalmente en que esto sea cierto para InputStreams de tipos arbitrarios.

Nuevamente, yuck.

+0

InputStream de UrlConnection.getInputStream() parece violado la semántica estándar java.io.InputStream y devuelve un tamaño de lectura de 0 cuando se maneja un archivo grande. ¿Alguien puede confirmar esto? – okwap

+0

^Sí, eso está confirmado, llegué a esta pregunta cuando buscaba el mismo problema exacto de UrlConnection.getInputStream read devolviendo un cero 0 – taimur

0

Observé el mismo comportamiento (leyendo 0 bytes) cuando construyo una ventana de salida de consola giratoria e hice un hilo de lectura para stdout y stderr mediante el siguiente código:

 
       this.pi = new PipedInputStream(); 
       po = new PipedOutputStream((PipedInputStream)pi); 
       System.setOut(new PrintStream(po, true));
Cuando la aplicación de oscilación 'principal' sale, y mi la ventana de la consola todavía está abierta. Leí 0 de this.pi.read(). Los datos de lectura se colocaron en la ventana de la consola, dando como resultado una condición de carrera de alguna forma, simplemente ignorando el resultado y no actualizando la ventana de la consola resolvió el problema.

Cuestiones relacionadas