2011-01-11 5 views

Répondre

45

Parce qu'un byte ne peut contenir jusqu'à 127 -128, alors qu'il devrait revenir 0 jusqu'à 255 (et -1 lorsqu'il n'y a plus d'octet à gauche (c'est-à-dire EOF)). Même s'il renvoyait byte, il n'y aurait pas de place pour représenter EOF.

Une question plus intéressante est pourquoi il ne renvoie pas short.

+6

+1 pourquoi ne renvoie-t-il pas un 'short' alors? :) – dogbane

+3

@dogbane, @BalusC - Je suppose que parce que int est plus rapide que court. Le jeu d'instructions pour le short est plutôt limité, ainsi la JVM le traiterait comme un int de toute façon. Référence: http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#7565 – Ishtar

+2

Ou caractère non signé. –

2

Parce que EOF (fin de fichier ou généralement fin de données) ne peut pas être représenté en utilisant char.

+0

Vous ne pouvez pas utiliser octet et -1 car cette valeur est correcte et peut apparaître dans les données. – wesoly

+0

Il ne peut pas être représenté en utilisant 'byte', car aucune valeur hors-bande n'est disponible. Il * peut * être représenté dans tout type de données plus large que 8 bits. – EJP

4

Il peut donc retourner "-1". Il doit le faire quand il n'y a plus d'octets à lire.

Vous ne pouvez pas avoir revenir un octet parfois et -1 pour EOF/nobyte/whatever, il retourne un entier;)

15

Renvoie un int car lorsque le flux ne peut plus être lu, il renvoie -1.

S'il renvoyait un octet, -1 ne pouvait pas être retourné pour indiquer une erreur car -1 est un octet valide. En outre, vous ne pouvez pas renvoyer de valeur supérieure à 127 ou inférieure à -128, car Java traite uniquement les octets signés.

Plusieurs fois, lorsque vous lisez un fichier, vous voulez les octets non signés pour votre code de traitement. Pour obtenir des valeurs comprises entre 128 et 255, vous pouvez utiliser un raccourci, mais en utilisant un int vous alignerez plus efficacement les registres de mémoire avec votre bus de données. Par conséquent, vous ne perdez vraiment aucune information en utilisant un int, et vous gagnez probablement un peu de performance. Le seul inconvénient est le coût de la mémoire, mais il y a fort à parier que vous ne resterez pas longtemps dans cet int (comme vous le ferez pour le transformer en char ou en byte []).

+2

Renvoie un int car lorsque * EOF * se produit, il renvoie -1. Lorsqu'une erreur survient, elle déclenche une exception. – EJP

1

comme doc Java dit dans InputStream#read, L'octet de valeur est retournée comme un entier entre 0 et 255. C'est-à-dire que la valeur de l'octet [-128 ~ 127] a été changée en valeur int [0 ~ 255], donc la valeur de retour peut être utilisée pour représenter la fin du flux.

0

à BalusC answer Adjonction:

  • pas byte pour permettre [0; 255] que la capacité principale et additionaly -1 que EOF résultent
  • int sert à régler résultat mot machine (l'une des principales exigences aux opérations d'E/S - vitesse, ils doivent donc travailler aussi vite que possible!)

Les exceptions ne sont pas utilisées car elles sont très lentes!

Questions connexes