2012-03-17 44 views
0

在的InputStream類java.io. *包的:一個字節被如何存儲在整數

INT讀()拋出,因爲它是字節流類下IOException的

讀()返回一個字節,但它存儲在整數中,沒有任何錯誤。

爲什麼這樣?以及它是如何發生的。幫我的內存分配設計也

+1

從技術上講,「字節」是無符號的,而Java的「字節」是有符號的。所以雖然它是8位的「字節」,但它不像Java的原始類型那樣是「字節」。 – 2012-03-17 08:49:55

回答

1

您可以自由向上轉換(從使用字節到使用更多字節的原始的),因爲你失去任何信息(你可以把一個小東西一個大容器)。

只有當你向下轉換(從使用更多字節到使用字節的原始的),您必須顯式轉換(當你把一個大的事情在一個小容器,你的風險切斷一些東西以使其適合)

2

Java中的int是32位。 Java中的byte是8位。請嘗試以下代碼:

byte foo = 5; 
int intFoo = foo; 

Java允許您免費提供基元,因爲這樣做不會丟失任何信息。

4

的上下文由javadoc的,它說給出:

「中讀取數據的從輸入流的下一個字節的字節值被返回作爲int範圍爲0到255,如果。沒有字節可用,因爲已到達流的末尾,則返回值-1。「

在引擎蓋下,read方法要麼有一個字節返回或流是在EOF位置。返回值因此可以有257個可能的狀態,並且(顯然)不會適合byte。 API通過返回一個int來處理這個問題,按照我上面引用的javadoc摘錄的指定進行編碼。

我沒有看過的代碼,但我希望它是隱約的東西像這樣:

if (eof) { 
     return -1; 
    } else { 
     // Casting to an int sign extends to 32 bits, 
     // and we then take the bottom 8 bits. 
     return ((int) someByte) & 0xff; 
    } 

當你得到的結果,你需要做這樣的事情:

int res = is.read(); 
    if (res == -1) { 
     // handle EOF case ... 
    } else { 
     byte b = (byte) res; 
     // handle the byte ... 
    } 

還幫我一下內存分配設計。

沒有內存分配問題。 byteint類型是原始類型。

相關問題