Pourquoi le InputStream#read()
renvoie-t-il un int
et non un byte
?Pourquoi InputStream # read() renvoie un int et pas un octet?
Répondre
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
.
Parce que EOF (fin de fichier ou généralement fin de données) ne peut pas être représenté en utilisant char.
Vous ne pouvez pas utiliser octet et -1 car cette valeur est correcte et peut apparaître dans les données. – wesoly
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
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;)
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 []).
Renvoie un int car lorsque * EOF * se produit, il renvoie -1. Lorsqu'une erreur survient, elle déclenche une exception. – EJP
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.
à 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!
- 1. Mockito: exception sur mock InputStream # read (octet [])
- 2. Pourquoi StringReader.Read() ne renvoie pas un octet?
- 3. Java - Fonction InputStream .read()
- 4. InputStream read() bloque lorsque le serveur ne renvoie aucune entrée
- 5. mbtowc renvoie toujours un octet sur osx
- 6. Pourquoi QNetworkReply readAll() renvoie zéro octet?
- 7. Un autre octet BCD [] à int et retour
- 8. Java octet à int
- 9. lors de l'écriture d'octets d'écriture OutputStream (en interne), alors pourquoi la lecture de InputStream renvoie int?
- 10. différence entre l'affectation d'un int et d'un littéral int à un octet?
- 11. Pourquoi SerializeJSON renvoie-t-il un int avec .0?
- 12. Pourquoi le type return de read() est-il un nombre entier?
- 13. Comment obtenir un int à partir d'un octet dans J2ME?
- 14. Conversion octet à int
- 15. chaîne ou String, int ou Int32, octet ou octet? Lequel préférez-vous et pourquoi?
- 16. Combiner int et octet en long
- 17. Sockets: Pourquoi un blocage read() échoue-t-il avec ENOTCONN?
- 18. NSInputStream read: maxBytes renvoie toujours 0
- 19. C# string.GetHashCode() renvoie un résultat non int
- 20. Pourquoi getResourceAsStream avec une chaîne vide retourne un InputStream vide?
- 21. Pourquoi ne pas utiliser un int en javascript?
- 22. Lancer int comme un double renvoie # INF00
- 23. traitement: convertir int en octet
- 24. Comment changer un octet int en deux octets en Python?
- 25. copier un flux par octet []
- 26. Сonverting int octet dans Android
- 27. Pourquoi, quand je convertir char [] pour int, dois-je obtenir un renversement sage octet
- 28. Un Socket InputStream read() se débloque-t-il si le serveur expire?
- 29. pourquoi octet + = 1 compilation mais octet = octet + 1 non?
- 30. flux réseau collé sur stream.Read (octet [] octet, int offset, int size)
+1 pourquoi ne renvoie-t-il pas un 'short' alors? :) – dogbane
@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
Ou caractère non signé. –