爲什麼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. 爲什麼InputStream read()返回一個int而不是一個short?
- 2. 爲什麼sizeof()返回4個字節而不是2個字節的short int?
- 3. 爲什麼HttpException.GetHttpCode()返回一個int而不是System.Net.HttpStatusCode?
- 4. 爲什麼python statistics.mean()返回一個int類型,而不是float
- 5. 爲什麼CountDownLatch.getCount()返回一個long而不是int?
- 6. 爲什麼我的函數返回一個Unit而不是Int?
- 7. 爲什麼read()一次讀取一個字節,如果char是2個字節?
- 8. 解密返回16個字節而不是32個,爲什麼?
- 9. 爲什麼Hex()函數返回一個字符串而不是int hex?
- 10. 爲什麼Array.Length是一個int,而不是一個uint
- 11. 爲什麼string :: compare返回一個int?
- 12. 爲什麼+「1」返回一個int?
- 13. 如何超過InputStream方法read()返回一個字符?
- 14. InputStream的read(byte [] b)返回一個字節數組有負值的元素
- 15. 爲什麼R返回一個整數而不是一個字符串
- 16. 爲什麼`request.method`返回一個字符串(而不是一個符號)?
- 17. 爲什麼「0」.split(「|」)返回兩個元素而不是一個?
- 18. 爲什麼ASP.NET Identity 2.0 dbo.AspNetUsers爲一個字符串而不是一個int?
- 19. 爲什麼我的SqlCommand應該是一個int時返回一個字符串?
- 20. Python 2.7 base64.b64decode爲什麼它返回一個字符串而不是一個字節數組?
- 21. 爲什麼XPATH計數函數返回一個double而不是int?
- 22. 爲什麼一箇中文字符需要一個字符(2個字節)而不是3個字節?
- 23. 爲什麼LINQ Count()返回多行而不是一個?
- 24. 爲什麼document.querySelectorAll返回一個StaticNodeList而不是真正的Array?
- 25. 爲什麼MarshalByRefObject.InitializeLifetimeService返回一個對象而不是ILease?
- 26. 爲什麼Numpy.gradient返回一個列表而不是ndarray?
- 27. 爲什麼這個Rails動作返回一個字符串而不是JSON?
- 28. .read()返回一個流嗎?
- 29. 爲什麼控制檯類中的Read()返回一個整數?
- 30. 爲什麼一個字符串索引返回一個整數值而不是一個字符?
+1爲什麼不返回「short」呢? :) – dogbane 2011-01-11 16:09:57