2014-10-17 72 views
2

基於此question我想問以下問題。 假定阻塞I/O和I有如下所示的一段代碼:available and read:在使用阻塞Java I/O時,我們實際上可以是非阻塞嗎?

byte[] data = new byte[10]; 
someInputStream.read(data) 

此代碼段會在read呼叫阻塞,直到它有一些要讀取的字節。我很熟悉read實際上可能讀取的字節數較少,讀取的字節數將由read方法返回。

我的問題是這樣的。假設我有:

byte[] data = new byte[10]; 
if (someInputeStream.available() >= 10) { 
     someInputStream.read(data); // *** 
} 

***行保證不會阻止?同樣,我知道這個讀取仍然可能讀取少於10個字節。

回答

1

保證不阻止。

JavadocInputStream,看着available()方法:

返回可以從該輸入流不被的下一次調用無阻塞讀取(或跳過)的字節數的估計值這個輸入流的方法。下一次調用可能是同一個線程或另一個線程。 單個讀取或跳過這麼多字節不會被阻塞,但可能會讀取或跳過較少的字節。

(重點煤礦。)

所以它不會阻止,但(像你說的),你可能無法得到完整的10個字節。

請注意,這是假設一個單一的線程。如果有多個線程,那麼當然另一個線程可能已經從available()read()之間的流中讀取。