¿Por qué InputStream#read()
devuelve int
y no byte
?¿Por qué InputStream # read() devuelve un int y no un byte?
Respuesta
Debido a que un byte
sólo puede contener hasta 127 -128, mientras que debería volver 0 hasta 255 (y -1 cuando no hay bytes restantes (es decir, EOF)). Incluso si devolviera byte
, no habría espacio para representar EOF.
Una pregunta más interesante es por qué no devuelve short
.
Porque EOF (fin de archivo o, en general, final de datos) no se puede representar mediante char.
Por lo que puede devolver "-1". Debe hacer eso cuando no haya más bytes para leer.
No se puede tener que devolver un byte de veces y -1 para EOF/nobyte/lo que sea, por lo que devuelve un int;)
Devuelve un int porque cuando la transmisión ya no se puede leer, devuelve -1.
Si devolvió un byte, entonces -1 no se pudo devolver para indicar un error porque -1 es un byte válido. Además, no podría devolver el valor por encima de 127 o por debajo de -128 porque Java solo maneja los bytes firmados.
Muchas veces cuando uno está leyendo un archivo, quiere los bytes sin firmar para su código de procesamiento. Para obtener valores entre 128 y 255, puede usar un breve, pero al usar un int alineará los registros de memoria con su bus de datos de manera más eficiente. Como resultado, realmente no pierde ninguna información usando un int, y probablemente gane un poco de rendimiento. El único inconveniente es el costo de la memoria, pero es probable que no se quede con esa int por mucho tiempo (ya que la procesará y la convertirá en un char o byte []).
Devuelve un int porque cuando * EOF * ocurre, devuelve -1. Cuando se produce un error, arroja una excepción. – EJP
como dice el documento Java en InputStream#read, El byte de valor se devuelve como un int en el rango de 0 a 255. Es decir, el valor de bytes [-128 ~ 127] se ha cambiado a int value [0 ~ 255], por lo que el valor de retorno se puede usar para representar el final de la secuencia.
Al añadir a BalusC answer:
-
no
- un
byte
para permitir [0; 255] como capacidad principal y adicionalmente -1 como EOF resultan int
se utiliza para ajustar resultado a la palabra máquina (uno de los principales requisitos para las operaciones de E/S - velocidad, por lo que deben trabajar tan rápido como ¡posible!)
¡La excepción no se utiliza porque es perceptiblemente lenta!
- 1. ¿Por qué FileInputStream read() no bloquea?
- 2. ¿Por qué readf no devuelve un valor?
- 3. Por qué lanzar/convertir de int devuelve un asterisco
- 4. Objective C read-only int? ¿Qué?
- 5. ¿Qué sucede si main() no devuelve un valor int?
- 6. ¿por qué byte + = 1 compilar pero byte = byte + 1 no?
- 7. Byte [] a InputStream o OutputStream
- 8. DocumentBuilder.parse (InputStream) devuelve nulo
- 9. ¿Por qué InputStream y OutputStream implementan Cerrar y Socket no?
- 10. ¿Cómo convierte Java int en un byte?
- 11. ¿Por qué Math.Round/Floor/Ceiling no devuelve long o int?
- 12. Scala: InputStream to Array [Byte]
- 13. Cómo convertir byte [] a InputStream?
- 14. ¿Por qué (int) (33.46639 * 1000000) devuelve 33466389?
- 15. por qué math.Ceiling (double a) no devuelve int directamente?
- 16. ¿Por qué no puedo unbox un int como un decimal?
- 17. Convertir un byte o int a BitSet
- 18. Escribir un InputStream en un HttpServletResponse
- 19. ¿Por qué getResourceAsStream con una cadena vacía devuelve un InputStream vacío?
- 20. ¿Por qué Math.floor devuelve un doble?
- 21. ¿Por qué 'fopen' devuelve un puntero NULL?
- 22. ¿Por qué dividir un flotante por un entero devuelve 0.0?
- 23. ¿Por qué Int64.MaxValue devuelve un Long?
- 24. ¿Por qué debería usar int en lugar de un byte o abreviar en C#
- 25. Descomprimir un archivo de InputStream y devolver otro InputStream
- 26. devuelve un int o pasa un puntero int - ¿Qué es mejor?
- 27. C# int to byte []
- 28. ¿Por qué ofstream inserta un byte 0x0D antes de 0x0A?
- 29. Android - ¿Por qué onItemLongClick (...) devuelve un booleano?
- 30. ¿Por qué un pitton dict.update() no devuelve el objeto?
+1 ¿por qué no devuelve un 'corto'? :) – dogbane
@dogbane, @BalusC - Supongo que int es más rápido que corto. El conjunto de instrucciones para abreviar es bastante limitado, por lo que la JVM lo trataría como un int de todos modos. Referencia: http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#7565 – Ishtar
O char que no está firmado. –