使用readLine()方法遇到的坑


  • 程序很簡單,客戶段從控制台讀取用戶輸入,然后發送至服務器端,主要代碼如下

  • 服務端代碼:

  • 客戶端代碼:

   結果運行的時候,當開啟服務端和客戶端后,在客戶端的控制台 鍵盤輸入 內容,服務端卻沒有顯示內容

原因:

1.原來readLine()方法在進行讀取一行時,只有遇到回車(\r)或者換行符(\n)才會返回讀取結果,這就是“讀取一行的意思”,重要的是readLine()返回的讀取內容中並不包含換行符或者回車符;

2.由於在客戶端使用的readLine()來讀取用戶輸入,所以當用戶按下回車鍵是,readLine() 返回讀取內容,但此時返回的內容並不包含換行符(查看readLine()源碼,會將\r,\n或者\r\n去除掉),而當在服務器端用readLine()再次讀取時,由於讀取的內容沒有換行符,所以readLine()方法會一直阻塞等待換行符,這就是服務器端沒有輸出的原因。


解決方法:

在客戶端每次輸入回車后,手動給輸入內容加入"\n"或"\r",再寫入服務器;


注意:

1、誤以為readLine()是讀取到沒有數據時就返回null(因為其它read方法當讀到沒有數據時返回-1),而實際上readLine()是一個阻塞函數,當沒有數據讀取時,就一直會阻塞在那,而不是返回null。沒有數據時會阻塞,在數據流異常或斷開時才會返回null

2、readLine()只有在數據流發生異常或者另一端被close()掉時,才會返回null值。
如果不指定buffer大小,則readLine()使用的buffer有8192個字符。在達到buffer大小之前,只有遇到"/r"、"/n"、"/r/n"才會返回。
3、使用socket之類的數據流時,要避免使用readLine(),以免為了等待一個換行/回車符而一直阻塞


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM