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. Se un metodo API pubblico restituisce InputStream o byte []
- 2. Perché Math.Round non restituisce un int?
- 3. Perché java.util.zip.CRC32.getValue() restituisce un valore long, non un int?
- 4. java.net.URL read stream to byte []
- 5. Posso impostare un timeout per una funzione read() di InputStream?
- 6. Perché l'operatore xor su due byte produce un int?
- 7. Perché int = int * double restituisce un errore e int * = double no (in Java)?
- 8. Creazione di un InputStream Java da un enumeratore [Array [Byte]]
- 9. C# string.GetHashCode() restituisce un risultato non int.
- 10. Perché un const int esegue implicitamente il cast in un byte, ma una variabile int no?
- 11. Perché ottengo un int quando indicizzo i byte?
- 12. Scrive un InputStream a un HttpServletResponse
- 13. Perché è bello chiudere() un inputstream?
- 14. Perché hamcrest dice che un byte 0 non è uguale a un int 0?
- 15. Come convertire un InputStream in un DataHandler?
- 16. In Java, come posso convertire un InputStream in un array di byte (byte [])?
- 17. Il modo più efficiente per convertire InputStream in byte []?
- 18. Perché operator ++ restituisce un valore non const?
- 19. Come posso convertire un InputStream non compresso in un InputStream gzip in modo efficiente?
- 20. Perché un ritorno non è definito ma console.log restituisce un int?
- 21. Convertire un byte o int a BitSet
- 22. Perché l'operatore di incremento post non funziona su un metodo che restituisce un int?
- 23. perché 1e400 non è un int?
- 24. Come clonare un inputstream in java in un tempo minimo
- 25. Byte Java non firmato [2] su int?
- 26. Perché malloc (0) restituisce un indirizzo non nullo in Windows?
- 27. Come convertire un array di byte in un array int?
- 28. QAudioInput :: byteReady() e QIODevice :: read() dando diverso numero di byte
- 29. Perché PrintStream "out" e InputStream "in" null?
- 30. Perché un python dict.update() non restituisce l'oggetto?
+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. –