2012-09-17 18 views
6

Lo que la diferencia entreInput stream.read return 0 o -1?

byte[] buffer = new byte[1024]; 
// this: 
if (inputStream.read(buffer) > 0) { /*...*/ } 
// and: 
if (inputStream.read(buffer) != -1) { /*...*/ } 

ambos puedan determinar el flujo de red terminar?

+16

El primero no detecta 'inputstream.read() == 0', que es una respuesta válida. –

+2

Quizás quiso decir> = 0? – Gabber

+6

http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#read%28byte[]%29. Todo se explica en el documento de la API. –

Respuesta

9

El Javadocs para InputStream.read() dicen:

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

En uso normal, esta situación no debería producirse, por lo que hay no tiene mucho sentido probar de forma explícita esta condición. (Si se quiere evitar un bucle para siempre porque el búfer es de longitud cero y fail-fast en esta situación, simplemente probar la longitud del búfer.)

Más adelante, hay:

devoluciones: el número total de bytes leídos en el búfer, o -1 si no hay más datos porque se ha alcanzado el final de la secuencia.

Si desea probar para EOF (o flujo de red, o lo que sea), utilice la prueba:

if (inputStream.read(buffer) != -1) ... 

una implementación no con errores de Java nunca volver otra cosa para indicar que no hay más datos disponibles.

+0

... espera, ¿qué? ¿Querías escribir '! = -1' en lugar de'! = 0' en tu último párrafo? –

+0

@IlmariKaronen Lo siento, se supone que es '-1', gracias por aprender sobre eso. Básicamente "lo que los documentos explícitamente te dicen que uses". – millimoose

2

De acuerdo con doc, inputstream.read(buffer) !=-1 le dirá que la transmisión ha finalizado. inputstream.read(buffer) == 0 simplemente dice que no hay bytes disponibles para leer, pero la transmisión aún está activa (es decir, el interlocutor no ha enviado nada desde la última vez que leyó todo lo que pudo).

+1

'InputStream' se bloqueará si no hay datos disponibles. No significa lo que dices que significa. – millimoose