Perché InputStream # read () restituisce un int e non un byte?

Perché InputStream#read() restituisce un int e non un byte ?

Poiché un byte può contenere solo -128 fino a 127, mentre deve restituire 0 fino a 255 (e -1 quando non c’è alcun byte rimasto (cioè EOF)). Anche se restituisse un byte , non ci sarebbe spazio per rappresentare EOF.

Una domanda più interessante è perché non ritorna in short .

Restituisce un int perché quando lo stream non può più essere letto, restituisce -1.

Se restituisce un byte, non è ansible restituire -1 per indicare un errore poiché -1 è un byte valido. Inoltre, non è ansible restituire un valore superiore a 127 o inferiore a -128 poiché Java gestisce solo byte firmati.

Molte volte quando si legge un file, si desidera che i byte senza segno per il codice di elaborazione. Per ottenere valori compresi tra 128 e 255 è ansible utilizzare un cortocircuito, ma utilizzando un int si allineano i registri di memoria con il bus dati in modo più efficiente. Di conseguenza, non si perde alcuna informazione utilizzando un int, e probabilmente si ottiene un po ‘di prestazioni. L’unico svantaggio è il costo della memoria, ma le probabilità sono che non rimarrai a lungo int (come lo elaborerai e lo trasformsrai in un char o in un byte []).

Quindi può restituire “-1”. Deve farlo quando non ci sono più byte da leggere.

Non puoi farlo restituire un byte a volte AND -1 per EOF / nobyte / qualunque, quindi restituisce un int;)

Perché EOF (fine del file o generalmente fine dei dati) non può essere rappresentato usando char.

come dice il documento Java in InputStream # read , il byte value viene restituito come int nell’intervallo da 0 a 255 . Vale a dire che il valore di byte [-128 ~ 127] è stato modificato in valore int [0 ~ 255], quindi il valore di ritorno può essere utilizzato per rappresentare la fine del stream.

Aggiunta alla risposta di BalusC :

  • non un byte per consentire [0; 255] come principale e addizionale -1 come risultato EOF
  • int è usato per regolare il risultato sulla parola macchina (uno dei requisiti principali per le operazioni di I / O – velocità , quindi dovrebbero funzionare il più velocemente ansible!)

L’eccezione non viene utilizzata perché è molto lenta!