为什么InputStream#read()
返回int
而不是byte
?为什么InputStream#read()返回一个int而不是一个字节?
43
A
回答
45
因为byte
只能容纳-128到127,而它应该返回0直到255(没有字节(即EOF)时为-1)。即使它返回byte
,也不会有代表EOF的空间。
更有趣的问题是为什么它不返回short
。
2
4
所以它可以返回“-1”。当没有更多字节需要读取时,它必须这样做。
你不能拥有它EOF/nobyte /不管,所以它返回一个int有时和-1返回一个字节;)
15
它返回一个int,因为当流不能再被读取时,它返回-1。
如果它返回一个字节,则-1不能返回以指示错误,因为-1是有效字节。另外,由于Java只能处理有符号的字节,所以你不能返回127或者低于-128的值。
很多时候,当你正在读取一个文件时,你需要处理代码的无符号字节。要获得128到255之间的值,可以使用short,但通过使用int可以更有效地将内存寄存器与数据总线对齐。因此,使用int不会丢失任何信息,并且您可能会获得一些性能。唯一的缺点是内存的成本,但是你不会长时间挂在那个int上(因为你会处理它并把它变成char或byte [])。
1
如Java文档在InputStream#read,中所说的值字节在0到255的范围内返回为int。也就是说字节值[-128〜127]已被更改为int值[0〜255],所以返回值可以用来表示流的结束。
0
追加到BalusC answer:
- 不是
byte
以允许[0; 255]作为主要容量和additionaly -1作为EOF导致 int
用于调整结果机字(的主要要求到I/O操作中的一个 - 速度,所以应该尽可能快地工作可能!)
不使用异常,因为它们非常慢!
相关问题
- 1. 为什么sizeof()返回4个字节而不是2个字节的short int?
- 2. 为什么python statistics.mean()返回一个int类型,而不是float
- 3. 解密返回16个字节而不是32个,为什么?
- 4. 为什么Array.Length是一个int,而不是一个uint
- 5. 为什么string :: compare返回一个int?
- 6. 为什么+“1”返回一个int?
- 7. InputStream的read(byte [] b)返回一个字节数组有负值的元素
- 8. 为什么`request.method`返回一个字符串(而不是一个符号)?
- 9. 为什么“0”.split(“|”)返回两个元素而不是一个?
- 10. 为什么ASP.NET Identity 2.0 dbo.AspNetUsers为一个字符串而不是一个int?
- 11. 为什么我的SqlCommand应该是一个int时返回一个字符串?
- 12. 为什么一个中文字符需要一个字符(2个字节)而不是3个字节?
- 13. 为什么MarshalByRefObject.InitializeLifetimeService返回一个对象而不是ILease?
- 14. 为什么document.querySelectorAll返回一个StaticNodeList而不是真正的Array?
- 15. 为什么Numpy.gradient返回一个列表而不是ndarray?
- 16. .read()返回一个流吗?
- 17. 为什么控制台类中的Read()返回一个整数?
- 18. 为什么一个字符串索引返回一个整数值而不是一个字符?
- 19. 为什么PHP返回的字符串,而不是INT
- 20. 为什么pyparser的asDict()返回一个空dict而不是一个列表?
- 21. 为什么list()返回一个向量,而不是一个列表?
- 22. 为什么这会返回一个字符串而不是字典?
- 23. 为什么`+ [[]] + [[]]`返回一个字符串?
- 24. 为什么我的方法不返回一个int?
- 25. 为什么总是返回一个?
- 26. Java:InputStream read()返回一个大于127的字节?
- 27. Jersey中的InputStream REST只返回一个字节
- 28. 为什么“引用”一个int(而不是值)存储?
- 29. 为什么我的BufferedImage从一个字节数组返回null?
- 30. 为什么新的Date().setHours(18)返回一个数字而不是日期?
+1为什么不返回“short”呢? :) – dogbane 2011-01-11 16:09:57