2012-09-17 11 views
6

Che la differenza traInput stream.read restituisce 0 o -1?

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

può sia determinare il flusso di rete terminare?

+16

Il primo non rileva 'inputstream.read() == 0', che è una risposta valida. –

+2

Forse intendevi> = 0? – Gabber

+6

http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#read%28byte[]%29. È tutto spiegato nel documento API. –

risposta

9

Il Javadocs per InputStream.read() dicono:

Se la lunghezza del b è zero, allora nessun byte vengono letti e 0 viene restituito

Nell'uso normale, questo non dovrebbe mai accadere, quindi non c'è non ha molto senso testare esplicitamente questa condizione. (Se si vuole evitare il loop per sempre perché il buffer è di lunghezza zero e fail-veloce in questa situazione, solo testare la lunghezza del buffer.)

Più avanti c'è:

Returns: il numero totale di byte letti nel buffer o -1 se non ci sono più dati perché è stata raggiunta la fine del flusso.

Se si desidera verificare per end-of-file (o flusso di rete, o qualsiasi altra cosa), utilizzare il test:

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

Un'implementazione non-buggy Java sarà mai tornare qualsiasi altra cosa per indicare non ci sono più dati disponibili.

+0

... aspetta, cosa? Intendevi scrivere '! = -1' invece di'! = 0' nel tuo ultimo paragrafo? –

+0

@IlmariKaronen Spiacente, si suppone che sia '-1', grazie per esserci ripresi. Sostanzialmente "ciò che i documenti ti dicono esplicitamente di usare". – millimoose

2

Secondo lo doc, inputstream.read(buffer) !=-1 ti dirà che lo streaming è terminato. inputstream.read(buffer) == 0 dice solo che non ci sono byte disponibili da leggere ma lo stream è ancora attivo (cioè il peer non ha appena inviato nulla dall'ultima volta che hai letto tutto ciò che potevi).

+1

'InputStream' si bloccherà se non ci sono dati disponibili. Non significa quello che dici tu significa. – millimoose