簡體   English   中英

通過套接字的BufferedReader.readLine()是否是阻塞操作?

[英]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塊永遠不會執行。

BufferedReader.readLine()所述

一個字符串,其中包含行的內容,不包含任何行終止符;如果已到達流的末尾,則為null

當另一端關閉連接時,您只會得到null

如果要實施繁忙的等待策略,則可以使用非阻塞NIO,但是請注意,這將占用一個CPU的100%。

您不能在套接字周圍創建BufferedReader ,因為BufferedReader只是包裝了另一個Reader Reader根本不支持非阻塞I / O。

在創建BufferedReader之前,必須創建一個Reader

Channels.newReader(…)

…如果在讀取字節時通道處於非阻塞模式,則將引發IllegalBlockingModeException

如果您嘗試通過InputStream繞行,例如由Socket.getInputStream()獲取,也會發生類似的事情:

如果通道處於非阻塞模式,則輸入流的讀取操作將拋出IllegalBlockingModeException

因此,僅當套接字處於阻塞模式時才可以使用BufferedReader.readLine() ,這意味着套接字將等待直到至少一個字符可以讀取(與流末尾不同的條件)為止。 因此,正如Peter Lawrey指出的那樣 ,它將繼續讀取直到行完成或流到達其末端為止,這意味着在阻塞套接字中該流已關閉。

暫無
暫無

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

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