1. 程式人生 > >18. IO會阻塞嗎?readLine是不是阻塞的?

18. IO會阻塞嗎?readLine是不是阻塞的?

指定 str blog buffer socket line 之一 del sock

IO阻塞問題,請參考一下博文:

https://blog.csdn.net/yyxyong/article/details/62894064

resdLine

一、網絡模式:
1、在網絡上,readLine()是阻塞模式,也就是說如果readLine()讀取不到數據的話,會一直阻塞,而不是返回null,所以如果你想要在while循環後執形相關操作是不可能的,因為while()裏面是一個死循環,一旦讀不到數據,它又開始阻塞,因此永遠也無法執形while()循環外面的操作,所以應該把操作放在while循環裏面。(在我做的即時通訊裏,為了能夠不斷獲取服務器返回的消息,就是用這種方法,不斷去服務器獲取消息,一旦有就返回。)
2、在while()裏面判斷readLine()!= null的時候要賦值給一個String,因為如果不為null,那麽這時候已經讀了一行。如果用while (br.readLine()!=null),那麽下面沒法再獲取到這一行,所以應該用
while ((line = br.readLine())!=null){}

3、readLine()通過下列字符之一即可認為某行已終止:換行 (‘\n‘)、回車 (‘\r‘) 或回車後直接跟著換行,所以我們在發送數據的時候要再後面加上這些標誌符,否則程序會阻塞。而我是直接用下面這種方法:
PrintStream ps = new PrintStream(socket.getOutputStream(), true, "UTF-8");
ps.println()。
ps.println()已經包含換行了,所以不要用print(),若是要就要在後面加上換行符;

4、readLine()只有在數據流發生異常或者另一端被close()掉時,才會返回null值。

二、讀取文件模式:
1、readLine()什麽時候才會返回null呢?讀取到文件等的結尾時候。(註意和網絡上的是不一樣的)。
  • 如果不指定buffer大小,則readLine()使用的buffer有8192個字符。在達到buffer大小之前,只有遇到"/r"、"/n"、"/r/n"才會返回。


18. IO會阻塞嗎?readLine是不是阻塞的?