2011-04-07 6 views
5

Durante años he estado leyendo desde InputStreams en un bucle como este:¿Bucle de lectura de flujo de entrada más elegante?

final byte[] buffer = new byte[65536]; 
InputStream is = ...; 
int r; 
while ((r = is.read(buffer)) > 0) { 
    ... 
} 

Pero me pregunto si hay una manera de evitar que la asignación en el bucle (sin introducir segunda condición) - por ejemplo, este código considero incluso menos elegante, ya que hay dos declaraciones de lectura y dos condiciones:

r = is.read(buffer); 
if (r > 0) { 
    do { 
     ... 
     r = is.read(buffer); 
    } while (r > 0); 
} 

¿Alguna idea para una más elegante (compacta, sin asignaciones en condicional) construir?

+1

¿No debería la comparación ser (r> = 0) en lugar de (r> 0)? El final del flujo se indica con -1. – Leonel

Respuesta

5

¿qué piensa usted acerca de este :

for (int count = stream.read(buffer); count >= 0; count = stream.read(buffer)) { 
    ..... 
} 

es compacto y mantiene el ámbito más pequeño posible de variable de recuento pero puede ser considerado menos legible

+0

Me gusta y no veo ningún problema obvio. Estaré seguro de probarlo. – Eugene

4

IMO, el primero es el mejor y el más compacto. :)

2

do {} while() son malvados y de ninguna manera elegantes.

que suelo hacer esto (sin asignaciones en los condicionales):

int count = stream.read(buffer); 

while (count >= 0) { 
    ... 
    count = stream.read(buffer); 
} 

Esto tiene la desventaja de la misma línea pasando dos veces, pero eso es lo mejor que tengo

+0

+1 para sencillo y MUY fácil de leer. – jahroy

0

Lo hago de esta manera pero más o menos lo mismo.

InputStream input; 
    final int bytes = 100; 
    final byte[] bArray = new byte[bytes]; 
    input.read(bArray, 0, bytes); 

    int c = input.read(); 
    while (c >= 0) { 
     ............. 
     ............. 

     c = input.read(); 
    } 
Cuestiones relacionadas