2011-01-11 20 views

risposta

45

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.

+6

+1 perché non restituisce un 'short' allora? :) – dogbane

+3

@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

+2

o carattere non firmato. –

2

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

+0

Non è possibile utilizzare byte e -1 poiché questo valore è corretto e può verificarsi nei dati. – wesoly

+0

Non può essere rappresentato utilizzando 'byte', perché non sono disponibili valori fuori banda. Può * essere * rappresentato in qualsiasi tipo di dati più largo di 8 bit. – EJP

4

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;)

15

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 []).

+2

Restituisce un int perché quando si verifica * EOF * restituisce -1. Quando si verifica un errore, genera un'eccezione. – EJP

1

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.

0

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!

Problemi correlati