簡體   English   中英

Java-為什么while(true){inputStream.read(incomingData)}無法正常工作?

[英]Java - Why while(true){ inputStream.read(incomingData) } does not work?

我想問一個簡單的問題。 讓我們考慮以下偽代碼:

InputStream is = socket.getInputStream(); 

byte[] incomingData = new byte[1024];   
int incomingDataLenght = 0;

while(true)  {        
   incomingDataLenght =is.read(incomingData,0,incomingData.length);   
}

不起作用。

但是如果你將字節數組放入while循環中

int incomingDataLenght = 0;

while(true)  {     
    byte[] incomingData = new byte[1024];    
    incomingDataLenght =is.read(incomingData,0,incomingData.length);   
}

一切正常。 我不理解的問題,當我聲明一個字節數組時,實際上是在聲明指針。 一遍while循環,我給了該指針一個read方法,它填充了從聲明的指針開始的數組,我應該將此指針與新鮮的數據一起使用。 但是實際上這是行不通的。

有人可以解釋為什么它不起作用嗎?

編輯

對不起,我不清楚的問題。 我正在從套接字讀取媒體字節,並在ConcurrentLinkedQueue<byte>存儲一些緩沖時間(即生產者)。 然后我的使用者線程開始了。 如上文所述,當我在while循環內移動數組初始化時,我的數據變得清晰起來,並且使用者線程可以成功處理我的數據。

我認為我的回答是我的問題的秘密。 當我將字節數組存儲在隊列中時,我正在存儲相同的指針(這是byte []傳入數據的指針)。 當我開始從隊列中讀取數據時,我正在讀取當前時間的數據,而不是緩沖的數據。

如果這個考慮是正確的,那是每一個while周期初始化數組的最佳方法嗎?

盡管您沒有說明第一種方法到底會發生什么,但是這兩個代碼段之間存在明顯的區別:在第二個代碼中,每個周期都會初始化“ incomingData”!

這兩個示例都不會編譯時出現錯誤,

incomingDataLenght =is.read(incomingData,0,incomingData.lenght);  

應該

incomingDataLenght =is.read(incomingData,0,incomingData.length);

毫無疑問,您的問題是,在調用read()方法之后,您忽略了incomingLength 不管你要在這個循環做,才應使用incomingData從索引[0]索引[incomingLength-1],以及環也應該打破,如果incomingLength < 0.

一種更傳統的書寫方式是

while ((incomingLength = is.read(incomingData)) > 0)
{
    // ...
}

您觀察到的不同行為是,在每個循環迭代中使用新緩沖區,您將獲得尾隨null而不是前一次迭代剩余的尾隨垃圾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM