2012-09-17 19 views
6

Co różnica międzyStrumień wejściowy. Odczytuje zwrot 0 lub -1?

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

można określić zarówno strumień sieć rozwiązać?

+16

Pierwszy nie wykrywa 'inputstream.read() == 0', co jest poprawną odpowiedzią. –

+2

Może miałeś na myśli> = 0? – Gabber

+6

http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#read%28byte[]%29. Wszystko to wyjaśniono w dokumencie api. –

Odpowiedz

9

Javadocs dla InputStream.read() powiedzieć:

Jeśli długość b wynosi zero, wówczas żadne bajty są odczytywane i 0 zwrócony jest

W normalnym użytkowaniu, to nigdy nie powinno się zdarzyć, więc nie niewiele wskazuje na to, że testujemy ten warunek w sposób jawny. (Jeśli chcesz uniknąć pętli na zawsze, ponieważ bufor jest zerowej długości, a nie szybki w tej sytuacji, po prostu przetestować długość bufora.)

Dalej jest:

Powroty: łączna liczba bajtów wczytanych do bufora lub -1, jeśli nie ma więcej danych, ponieważ został osiągnięty koniec strumienia.

Jeśli chcesz przetestować EOF (lub strumienia sieciowego, lub cokolwiek), użyj testu:

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

Implementacja non-buggy Java nigdy niczego innego powrotu aby wskazać, że nie ma już dostępnych danych.

+0

... czekaj, co? Czy chcesz napisać '! = -1' zamiast'! = 0' w swoim ostatnim akapicie? –

+0

@IlmariKaronen Przepraszam, to powinno być '-1', dziękuję za to. Zasadniczo "to, co doktorzy wyraźnie mówią, aby użyć". – millimoose

2

Zgodnie z doc, inputstream.read(buffer) !=-1 powie Ci, że strumień został zakończony. inputstream.read(buffer) == 0 mówi tylko, że nie ma dostępnych bajtów do odczytania, ale strumień jest wciąż aktywny (to znaczy, że użytkownik nie wysłał niczego, ponieważ ostatni raz przeczytałeś wszystko, co mógłeś).

+1

"InputStream" zostanie zablokowany, jeśli żadne dane nie są dostępne. To nie znaczy, co mówisz, że to znaczy. – millimoose

Powiązane problemy