[英]Is BufferedReader.readLine() over a Socket a blocking operation?
我試圖運行一個使用Observer
接口和Observable
子類的示例類,以檢查來自套接字的輸入流何時不同於空字符串。 這是代碼( Observable
類):
@Override
public void run() {
String input;
while (true) {
try {
input = reader.readLine();
if (input != null) {
setChanged();
notifyObservers(input);
} else
System.out.println("Nothing read from the stream");
} catch (IOException e) {
}
}
}
因此,當條件input != null
為true時,將調用update()
方法,並將從套接字讀取的內容輸出到stdout
。 服務器每秒發送一個字符串,觀察者以最大速度檢查它(沒有任何sleep()
調用)。 那么,從套接字擁有的流中讀取數據時, BufferedReader.readLine()
作用是什么? 因為else
塊永遠不會執行。
一個字符串,其中包含行的內容,不包含任何行終止符;如果已到達流的末尾,則為null
當另一端關閉連接時,您只會得到null
。
如果要實施繁忙的等待策略,則可以使用非阻塞NIO,但是請注意,這將占用一個CPU的100%。
您不能在套接字周圍創建BufferedReader
,因為BufferedReader
只是包裝了另一個Reader
。 Reader
根本不支持非阻塞I / O。
在創建BufferedReader
之前,必須創建一個Reader
:
…如果在讀取字節時通道處於非阻塞模式,則將引發
IllegalBlockingModeException
。
如果您嘗試通過InputStream
繞行,例如由Socket.getInputStream()
獲取,也會發生類似的事情:
如果通道處於非阻塞模式,則輸入流的讀取操作將拋出
IllegalBlockingModeException
。
因此,僅當套接字處於阻塞模式時才可以使用BufferedReader.readLine()
,這意味着套接字將等待直到至少一個字符可以讀取(與流末尾不同的條件)為止。 因此,正如Peter Lawrey指出的那樣 ,它將繼續讀取直到行完成或流到達其末端為止,這意味着在阻塞套接字中該流已關閉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.