根據Java api,其InputStream.read()描述為:如果由于已到達流的末尾而沒有字節可用,則返回值-1。此方法將阻塞,直到可用輸入數據,檢測到流的末尾或引發異常為止。我有一個while(true)循環進行讀取,當流上沒有任何內容發送時,我總是得到-1。那是意料之中的。我的問題是read()何時會阻塞?因為如果沒有任何數據,它將返回-1。我希望阻塞讀取要等到接收到數據。如果您已到達輸入流的末尾,難道read()不應僅等待數據而不是返回-1嗎?還是僅當有另一個線程訪問該流并且您的read()無法訪問該流時,read()才會阻塞?這使我想到下一個問題。我曾經有一個事件監聽器(由我的庫提供),當數據可用時會通知我。收到通知后,我將調用while((aByte = read()) > -1)存儲字節。當我在很近的時間內收到兩個事件,并且沒有顯示所有數據時,我感到很困惑。似乎只顯示第二個事件的數據的尾端,而其余的則丟失了。最終,我更改了代碼,以便在發生事件時調用if(inputStream.available() > 0) while((aByte = read()) > -1)存儲字節。現在它可以正常工作,并且顯示了我所有的數據。有人可以解釋這種行為嗎?該InputStream.available()是說要回,你可以阻止下一個調用方之前讀取的字節數(流?)。即使我不使用.available(),我也希望第一個事件的讀取只會阻止第二個事件的讀取,而不會擦除或消耗過多的流數據。為什么這樣做會導致我的所有數據都無法顯示?
3 回答

阿晨1998
TA貢獻2037條經驗 獲得超6個贊
某些實現的基礎數據源InputStream
可以表示已到達流的末尾,并且將不再發送任何數據。在接收到該信號之前,此類流的讀取操作可能會阻塞。
例如,InputStream
來自Socket
套接字的a 將阻止而不是返回EOF,直到接收到設置了FIN標志的TCP數據包。當從這樣的流中接收到EOF時,可以確保已可靠地接收了在該套接字上發送的所有數據,并且您將無法再讀取任何數據。(另一方面,如果阻塞讀取導致異常,則可能丟失了一些數據。)
其他流(例如來自原始文件或串行端口的流)可能缺少相似的格式或協議,以表明不再有可用數據。當當前沒有可用數據時,此類流可以立即返回EOF(-1)而不是阻塞。但是,如果沒有這種格式或協議,則無法確定另一端何時完成發送數據。
關于您的第二個問題,聽起來您可能患有比賽狀況。沒有看到有問題的代碼,我猜測問題實際上出在您的“顯示”方法上??赡艿诙€通知顯示的嘗試以某種方式掩蓋了第一個通知期間所做的工作。

紫衣仙女
TA貢獻1839條經驗 獲得超15個贊
如果流結束,則返回-1。如果流仍處于打開狀態(即套接字連接),但沒有數據到達讀取端(服務器速度很慢,網絡速度很慢,...),則read()塊。
您不需要致電available()。我很難理解您的通知設計,但是除了read()本身之外,您不需要任何調用。這里的available()方法只是為了方便。
添加回答
舉報
0/150
提交
取消