2011-04-07 11 views
5

Przez lata czytałem od InputStreams w pętli jak ta:Bardziej elegancka pętla odczytu strumienia wejściowego?

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

Ale zastanawiam się, czy istnieje sposób, aby uniknąć tego zadania w pętli (bez wprowadzania drugi warunek) - przykład Ten kod uważam nawet mniej elegancki, ponieważ istnieją dwa oświadczenia odczytu i dwa warunki:

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

Wszelkie pomysły na bardziej elegancki (zwarta, bez zadań w warunkowa) skonstruować?

+1

Czy porównanie nie powinno być (r> = 0) zamiast (r> 0)? Koniec strumienia oznaczony jest -1. – Leonel

Odpowiedz

5

co myślisz na ten temat :

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

to kompaktowy i utrzymuje najmniejszy możliwy zakres zliczania zmiennej ale może to być uznane za mniej czytelny

+0

Podoba mi się i nie widzę żadnych widocznych problemów. Na pewno go wypróbuje. – Eugene

4

IMO, pierwsza jest najlepsza i najbardziej kompaktowa. :)

2

do {} while() są złe i wcale nie eleganckie.

I zazwyczaj to zrobić (bez zadań w warunkowych):

int count = stream.read(buffer); 

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

ten ma wadę z tej samej linii, co dzieje się dwa razy, ale to najlepszy mam

+0

+1 dla prostej i BARDZO czytelnej. – jahroy

0

Robię to w ten sposób, ale mniej więcej tak samo.

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(); 
    } 
Powiązane problemy