java – 爲什麼InputStream#read()返回一個int而不是一個字節?

這個是一個有意思的問題,所以我在這裏記錄一下。

首先字節正好是8位,所以使用8位的char類型數據來與字節數據相互一一對應是最好的選擇?但是爲何方法InputStream#read()需要返回int類型值呢?

首先,我們要完成一個EOF(End of File)判斷,在Java中就是以-1來表示數據讀完了,但是如果返回的char類型值,那麼根本沒有-1這個數值;如果換種方式,返回一個特殊的char值,比如char中的-1值,那麼就佔用了此字符,如果字節數據恰好對應-1值,那麼就無法被正確讀出,且會被錯誤認爲i字節數據讀好了,這就是返回int類型值的原因,當然,字節數據被轉爲int表示,需要高24位布零。

其次,既然只是如上的需求,那麼爲什麼不返回short值呢?

實際上在Java內存模型中,對於short以及int類型值,都是佔據32位的內存空間的。Java虛擬機使用偏移量(實際上是32位原始單元格大小的倍數)對堆棧和對象字段進行建模。因此,當您將局部變量或對象字段聲明爲(例如)一個字節時,變量/字段將像int一樣存儲在32位單元中。除了以下兩個數據類型:

  • long 和 double 都需要兩個32位來表示;
  • 基本類型的數組也是個例外,其以打包類型在內存中表示,舉個例子:字節數組每個32位包含4個字節;

所以說,實際上單單一個short值和int值表示是沒有區別的,除非是一連串的short值,也就是short數組,纔可能會比int值有效。換言之,我們沒有在這個應用中返回int/short類型的數據是沒有區別的,所以我們不妨就使用代表其實際內存模型的int類型值。

參考:
In java, is it more efficient to use byte or short instead of int and float instead of double?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章