Perché InputStream#read()
restituisce un int
e non un byte
?Perché InputStream # read() restituisce un int e non un byte?
risposta
Perché un byte
può contenere solo fino -128 127, mentre dovrebbe tornare Da 0 a 255 (e -1 quando non vi sono byte rimasti (cioè EOF)). Anche se restituisse byte
, non ci sarebbe spazio per rappresentare EOF.
Una domanda più interessante è perché non restituisce short
.
Perché EOF (fine del file o generalmente fine dei dati) non può essere rappresentato utilizzando char.
Quindi può restituire "-1". Deve farlo quando non ci sono più byte da leggere.
Non si può avere è restituire un byte di volte e -1 per EOF/nobyte/qualunque cosa, in modo che restituisce un int;)
Restituisce un valore int perché quando lo stream non può più essere letto, restituisce -1.
Se restituisce un byte, non è possibile restituire -1 per indicare un errore poiché -1 è un byte valido. Inoltre, non è possibile 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 è possibile 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 trasformerai in un char o in un byte []).
Restituisce un int perché quando si verifica * EOF * restituisce -1. Quando si verifica un errore, genera un'eccezione. – EJP
come dice il documento Java in InputStream#read, Il byte di valore 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 flusso.
Aggiunta di BalusC answer:
-
non
- un
byte
per consentire [0; 255] come capacità principale e additionaly -1 come EOF risultato int
viene utilizzata per regolare risultato a parola della macchina (uno dei principali requisiti per operazioni di I/O - velocità, in modo che dovrebbe funzionare più velocemente possibile!)
L'eccezione non viene utilizzata perché è notevolmente lenta!
+1 perché non restituisce un 'short' allora? :) – dogbane
@dogbane, @BalusC - Suppongo che int sia più veloce che breve. Il set di istruzioni in breve è piuttosto limitato, quindi la JVM lo tratterà comunque come un int. Riferimento: http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#7565 – Ishtar
o carattere non firmato. –